1. 程式人生 > >JNI之c/c++返回中文給java 亂碼問題以及java陣列在c排序

JNI之c/c++返回中文給java 亂碼問題以及java陣列在c排序

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程式碼和效果圖如下
這裡寫圖片描述