轉自: http://www.cnblogs.com/canphp/archive/2012/11/13/2768937.html
1.前言
首先確保C/C++源文件的字符編碼是UTF-8與JAVA的class文件字符編碼保持一致。如果C/C++源碼含有中文,那么編譯出來的so中的中文字符串也保存為UTF-8編碼,這樣的程序不會產生亂碼。
JNI提供了jstring來引用JAVA的String類型變量,如果native函數需要返回 String或者接受String類型參數就必須使用到jstring。而C/C++用char*引用字符串起始地址,當native函數接到jstring后要轉換為char*所指向的字符串才能處理。當我們處理完char*所指向的字符串又要轉換為jstring才能返回給JAVA代碼。下面給出轉換的方法(下面均是C代碼)。
2.jstring轉換為char*
使用JNIEnv的const char* GetStringUTFChars(JNIEnv*, jstring, jboolean*)
1 JNIEnv env=//傳入參數 ; jstring name=//傳入參數 ; 2 const char *nameStr=(*env)->GetStringUTFChars(env,name,NULL);
調用完GetStringUTFChars后必須調用JNIEnv的void ReleaseStringUTFChars(JNIEnv*, jstring, const char*)釋放新建的字符串。
1 (*env)-> ReleaseStringUTFChars(env,name, nameStr);
3.char*轉換為jstring
使用JNIEnv的jstring NewStringUTF(JNIEnv*, const char*);
1 jstring newArgName=(*env)->NewStringUTF(env, nameStr);
調用完NewStringUTF后必須調用JNIEnv的void DeleteLocalRef(JNIEnv*, jobject);釋放新建的jstring。
1 (*env)-> DeleteLocalRef(env, newArgName);