JNI系列入門之C語言中文字符串亂碼問題

JNI系列文章:java

  1. JNI系列之入門Hello JNI C(一)
  2. JNI系列之入門Hello JNI C(二)
  3. JNI系列入門之C語言與Java的雙向通訊(一)
  4. JNI系列入門之C語言與Java的雙向通訊(二)
  5. JNI系列入門之C語言中文字符串亂碼問題

解決方案

思路: 咱們在寫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

  1. JNI系列之入門Hello JNI C(一)
  2. JNI系列之入門Hello JNI C(二)
  3. JNI系列入門之C語言與Java的雙向通訊(一)
  4. JNI系列入門之C語言與Java的雙向通訊(二)
  5. JNI系列入門之C語言中文字符串亂碼問題
相關文章
相關標籤/搜索