JNI之c/c++返回中文給java 亂碼問題以及java陣列在c排序
阿新 • • 發佈:2018-11-05
c/c++返回中文給java時會亂碼,因為java和c/c++的編碼格式不一樣,java的utf-16,c/c++是utf-8,所以在返回中文字元的時候,包裝成gb2312返回。
具體見如下部落格連結:
jni互動中文亂問題分析
public class CodeTest {
public native String getChineseFromNative();
public static void main(String[] args) {
// TODO Auto-generated method stub
CodeTest t=new CodeTest();
String result=t.getChineseFromNative();
System.out.println("test=china_code="+result);
}
static {
System.load("D:\\Documents\\Visual Studio 2013\\Projects\\"
+ "JNIChinaCode\\x64\\Debug\\JNIChinaCode.dll");
}
}
#define CRT_SECURE_WARNNING
#include "code_test_CodeTest.h"
#include <string.h>
JNIEXPORT jstring JNICALL Java_code_1test_CodeTest_getChineseFromNative
(JNIEnv *Env, jobject jobj){
//c返回中文字元getJava
char *c_str = "中華人民共和國";
jstring result=(*Env)->NewStringUTF(Env,c_str);
jclass str_class = (*Env)->FindClass(Env, "Ljava/lang/String;" );//後面分號
jmethodID constr_mid=(*Env)->GetMethodID(Env,str_class,"<init>","([BLjava/lang/String;)V");
//通過建構函式建立 String 物件,傳入byte 和UTF-8 string=new String(byte[] "gb2312");
jbyteArray str_byte=(*Env)->NewByteArray(Env,strlen(c_str));
(*Env)->SetByteArrayRegion(Env,str_byte,0,strlen(c_str),c_str);
jstring utf_set=(*Env)->NewStringUTF(Env,"GB2312");//c/c++傳入中文編碼成gb2312
return (*Env)->NewObject(Env, str_class, constr_mid, str_byte, utf_set);
};
//執行效果如下圖
int compareOrder(int *a, int *b){
return (*a) - (*b);
}
//c排序java陣列
JNIEXPORT void JNICALL Java_code_1test_CodeTest_rightOrder
(JNIEnv *Env, jobject jobj, jintArray jarry){
//獲取陣列指標
jint *arryp= (*Env)->GetIntArrayElements(Env,jarry,NULL);
//獲取陣列長度
jsize size = (*Env)->GetArrayLength(Env,jarry);
printf("test=length:%d\n",size);
//陣列排序
qsort(arryp,size,sizeof(jint),compareOrder);
(*Env)->ReleaseIntArrayElements(Env,jarry,arryp,JNI_COMMIT);
};
java程式碼和效果圖如下