1. 程式人生 > >android Jni jstring返回中文 亂碼、崩潰問題

android Jni jstring返回中文 亂碼、崩潰問題

對於jni我的觀點是繁瑣的有點不知所措,連簡單的中文傳輸都麻煩至極。查閱了各種資料,什麼C檔案格式儲存為utf-8格式,什麼把jstring換成jarraybyte,更甚至一些複製貼上黨,把一些什麼windows下的把C檔案程式碼轉換成utf-8,再麻煩點的就是連iconv庫都用上了,至於最終有沒有真的把中文從jni c層轉到了java層,亂說一遭然後就清一色的戛然而至了。為了讓大家不走彎路,參考了某篇文章後,真在實現了從中文顯示之後我才發的貼。

   言歸正傳。中文顯示亂碼的原因大家也都明白,java層跟c層使用了不同的編碼方式,下面是直接的程式碼,直接實現中文轉換。

jstring ctojstring(JNIEnv *env, char* tmpstr) {
jclass Class_string;
jmethodID mid_String,mid_getBytes;
jbyteArray bytes;
jbyte* log_utf8;
jstring codetype,jstr;
Class_string = (*env)->FindClass(env,"java/lang/String");//獲取class
//先將gbk字串轉為java裡的string格式
mid_String = (*env)->GetMethodID(env,Class_string, "<init>", "([BLjava/lang/String;)V");
bytes = (*env)->NewByteArray(env,strlen(tmpstr));
(*env)->SetByteArrayRegion(env,bytes, 0, strlen(tmpstr), (jbyte*)tmpstr);
codetype = (*env)->NewStringUTF(env,"gbk");
jstr = (jstring)(*env)->NewObject(env,Class_string, mid_String, bytes, codetype);


(*env)->DeleteLocalRef(env,bytes);


//再將string變utf-8字串。
mid_getBytes = (* env)->GetMethodID(env,Class_string,   "getBytes",   "(Ljava/lang/String;)[B");
codetype = (*env)->NewStringUTF(env,"utf-8");
bytes=(jbyteArray)(*env)->CallObjectMethod(env,jstr,mid_getBytes,codetype);
log_utf8=(*env)->GetByteArrayElements(env,bytes,JNI_FALSE);
LOGI(log_utf8);
return (*env)->NewStringUTF(env,log_utf8);
}

jstring backtojava(JNIEnv *env, jclass thiz) {

char* tmpstr = "中國文字博大精深";
jstring result = ctojstring(env,tmpstr);
return result;

}

java層直接呼叫backtojava返回的jstring就可以顯示中文了;