轉載請注明出處!
原文地址鏈接: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
strcmp函數比較字符串?接著就生成了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);//注釋1??
- ????if(str?==?NULL)??
- ????{//注釋2??
- ????????return?NULL;??
- ????}??
- ????printf("%s",?str);????
- ????(*env)->ReleaseStringUTFChars(env,?hint,?str);//注釋3??
- ????scanf("%s",?buf);?????
- ????return?(*env)->NewStringUTF(env,?buf);//注釋4??
- }??
代碼寫好后,將StringFunction.c 編譯成DLL動態鏈接庫(不懂編譯?看這里)。
c語言字符串做函數參數。?
運行程序,結果如下:
?
js函數參數傳遞字符串、?
分析:
注釋1:由于不能將jstring類型直接轉換為c語言的char*類型,所以通過GetStringUTFChars進行操作。GetStringUTFChars方法可以獲得到以UTF-8格式的字符串的指針。
const jchar *GetStringChars(JNIEnv*env, jstring str, jboolean *isCopy);
java有參有返回值方法調用、當isCopy為JNI_TRUE時,表示返回源字符串的一個副本;當其為JNI_FALSE表示直接返回源字符串的指針;通常為NULL,因為我們不關心返回的是一個實例還是一個指向源字符串的指針。
注釋2:由于java虛擬機分配內存空間可能會失敗,所以這里得進行一次判斷。
注釋3:用了GetStringChars得記得調用ReleaseStringUTFChars方法釋放內存,如果不釋放的話,可能導致內存泄露。
注釋4:將UTF-8的字符序列buf轉換成String類型
java返回字符串的方法。-------------------------------------------------
要下載本文源碼,請點擊這里!