JNI系列文章:
解決方案
vb 以亂碼查找字符串,思路: 我們在寫java代碼的時候,可以通過new String(byte[], String chasetname)來指定字符集加載,避免亂碼問題。同樣我們可以利用JNI的特性,在C層使用java的String構造方法,實例化一個jstring對象返回給Java使用,這樣C層的中文字符串就不會亂碼了。
實現:
// 解決C返回給java的字符串中文亂碼問題
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, "",
"([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系列文章:
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态