轉載請註明出處!
原文地址連結:http://blog.csdn.net/zgyulongfei/article/details/7409441
在編程的時候我們不僅需要使用無參的函數,有參數的函數也是必須的。
這次我編寫一個函數用來傳遞String型別參數,並輸出該函數的傳回值。
編寫java類:
class StringFunction{private native String getWords(String hint);static{System.loadLibrary("StringFunction");}public static void main(String [] args){StringFunction sf = new StringFunction();String hint = "say something: ";String words = sf.getWords(hint);System.out.println("Get the words: " + words);}}
在命令列介面下,輸入命令編譯:javac StringFunction.java
產生.class之後,繼續輸入命令:javah –jni StringFunction
接著就產生了StringFunction.h之後,然後開始編寫c檔案StringFunction.c了。
C代碼如下:
#include <jni.h>#include "StringFunction.h"JNIEXPORT jstring JNICALL Java_StringFunction_getWords(JNIEnv *env, jobject obj, jstring hint){char buf[128];const char *str = (*env)->GetStringUTFChars(env, hint, NULL);//注釋1if(str == NULL){//注釋2return NULL;}printf("%s", str);(*env)->ReleaseStringUTFChars(env, hint, str);//注釋3scanf("%s", buf);return (*env)->NewStringUTF(env, buf);//注釋4}
代碼寫好後,將StringFunction.c 編譯成DLL動態連結程式庫(不懂編譯?看這裡)。
運行程式,結果如下:
分析:
注釋1:由於不能將jstring類型直接轉換為c語言的char*類型,所以通過GetStringUTFChars進行操作。GetStringUTFChars方法可以獲得到以UTF-8格式的字串的指標。
const jchar *GetStringChars(JNIEnv*env, jstring str, jboolean *isCopy);
當isCopy為JNI_TRUE時,表示返回源字串的一個副本;當其為JNI_FALSE表示直接返回源字串的指標;通常為NULL,因為我們不關心返回的是一個執行個體還是一個指向源字串的指標。
注釋2:由於java虛擬機器分配記憶體空間可能會失敗,所以這裡得進行一次判斷。
注釋3:用了GetStringChars得記得調用ReleaseStringUTFChars方法釋放記憶體,如果不釋放的話,可能導致記憶體泄露。
注釋4:將UTF-8的字元序列buf轉換成String類型
-------------------------------------------------
要下載本文源碼,請點擊這裡!