vb 以亂碼查找字符串,android jni java call c字符串亂碼,JNI系列入門之C語言中文字符串亂碼問題

 2023-11-18 阅读 19 评论 0

摘要:JNI系列文章:解決方案vb 以亂碼查找字符串,思路: 我們在寫java代碼的時候,可以通過new String(byte[], String chasetname)來指定字符集加載,避免亂碼問題。同樣我們可以利用JNI的特性,在C層使用java的String構造方法,實例化一個j

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系列文章:

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/178640.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息