轉載請注明出處!
原文地址鏈接: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);//注釋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動態鏈接庫(不懂編譯?看這里)。
運行程序,結果如下:
分析:
注釋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類型
-------------------------------------------------
要下載本文源碼,請點擊這里!