JNI系列文章:java
思路: 咱們在寫java代碼的時候,能夠經過new String(byte[], String chasetname)來指定字符集加載,避免亂碼問題。一樣咱們能夠利用JNI的特性,在C層使用java的String構造方法,實例化一個jstring對象返回給Java使用,這樣C層的中文字符串就不會亂碼了。數組
實現:函數
// 解決C返回給java的字符串中文亂碼問題
JNIEXPORT jstring JNICALL Java_com_jerry_jnitest_JniTest_resolveMessyCode (JNIEnv *env, jobject jobj, jstring jstr_in) {
char *c_str = "我是來自於C語言的中文字符串,我亂碼的毛病被治好了,固然有些生僻字可能仍是會亂碼,那就須要換成其它的字符集。";
// 經過調用java的String的構造方法String(byte bytes[], String charsetName)
// 給charsetName設置爲GB2312就沒問題了
// 要執行new String(xxx)構造方法
// 1. 先獲取String的jclass
jclass cls_string = (*env)->FindClass(env, "java/lang/String");
// 2. 獲取構造函數的jmethodID
jmethodID mid_constructor = (*env)->GetMethodID(env, cls_string, "<init>",
"([BLjava/lang/String;)V");
// 3. new一個String對象
// 建立一個jbyteArray變量
// 字節數組裏是一個個的字節byte即jbyte,
// jbyte又是signed char的別名,說明jbyte其實就是char字符
// 那麼char* 字符串就是char字符的集合,即jbyte的集合,就是jbyteArray
jbyteArray bytes = (*env)->NewByteArray(env, strlen(c_str));
(*env)->SetByteArrayRegion(env, bytes, 0, strlen(c_str), c_str);
jstring jstr_charset = (*env)->NewStringUTF(env, "GB2312");
return (*env)->NewObject(env, cls_string, mid_constructor,
bytes, jstr_charset);
}
複製代碼
JNI系列文章:post