Java 从JNI呼叫返回阿拉伯语

Java 从JNI呼叫返回阿拉伯语,java,c++,java-native-interface,arabic,Java,C++,Java Native Interface,Arabic,我一直在尝试从JNI调用返回一个阿拉伯语字符串 java方法如下所示 private native String ataTrans_CheckWord(String lpszWord, String lpszDest, int m_flag, int lpszReserved); lpszWord:输入英语 lpszDest:忽略 m_标志:忽略 lpszReserved:忽略 现在,当我使用java来生成头文件时,我得到了一个带有这个签名的C++头文件。 JNIEXPORT jstring

我一直在尝试从JNI调用返回一个阿拉伯语字符串

java方法如下所示

private native String ataTrans_CheckWord(String lpszWord, String lpszDest, int m_flag, int lpszReserved);
lpszWord:输入英语
lpszDest:忽略
m_标志:忽略
lpszReserved:忽略

现在,当我使用java来生成头文件时,我得到了一个带有这个签名

的C++头文件。
JNIEXPORT jstring JNICALL Java_MyClass_ataTrans_1CheckWord (JNIEnv* env, jobject, jstring, jstring, jint , jint)

现在,在C++代码中,我有这样的语句,如

JNIEXPORT jstring JNICALL Java_MyClass_ataTrans_1CheckWord(JNIEnv* env, jobject, jstring jstrInput,     jstring, jint , jint)
{    

char aa[10];
char* bb;
char** cc;
bb = aa;
cc = &bb;
jstring tempValue;

const char* strCIn = (env)->GetStringUTFChars(jstrInput , &blnIsCopy);

int retVal = pDllataTrans_CheckWord(strCIn, cc, m_flag, lpszReserved);

printf("Orginal Arabic Conversion Index 0: %s \n",cc[0]);   //This prints ARABIC properly 

tempValue = (env)->NewString((jchar* )cc[0],10); // convert char array to jstring

printf("JSTRING UNICODE Created : %s \n",tempValue); //This prints junk

return tempValue;

}
我相信阿拉伯语内容在指向“cc”的指针内。最后,在我的java代码中,我有一个这样的调用

String temp = myclassInstance.ataTrans_CheckWord("ABCDEFG", "",1, 0);

System.out.println("FROM JAVE OUTPUT : "+temp);  //Prints Junk
我就是无法在JAVA代码中返回一些阿拉伯字符。我做错什么了吗?我已经尝试过其他各种替代方法,例如

tempValue = env->NewStringUTF("شسيشسيشسيشس");   

返回值,但没有运气。JAVA字符串在内部是UTF-16,一种每字符使用2或4字节的编码。翻译系统似乎返回以
MBCS
(多字节字符集)编码的字符串-每个字符1-N字节

JNI
NewString
函数期望数据编码为
UTF-16
,并且您正在传递其他内容,因此在java中,您将获得垃圾数据。您的信息中缺少的一件事是您的翻译系统使用哪种编码。我将假定它是
UTF-8
,并使用
MultiByteToWideChar
转换为java期望的格式。下面的代码假设您在Windows上执行此操作-如果不是,请指定平台,并查看例如
iconv

int Len = strlen(cc[0])*2+2;
wchar_t * Buffer = (wchar_t *) malloc(Len);
MultiByteToWideChar(CP_UTF8, 0, cc[0], -1, Buffer, Len);
tempValue = (env)->NewString((jchar* )Buffer,wcslen(Buffer));
free(Buffer);
如果您得到字符串作为其他代码页,请替换上面的CP_UTF8


作为补充说明,如果编码实际上是UTF-8,您只需将
cc[0]
传递到
NewStringUTF
即可-此函数在内部处理UTF-8到UTF-16的转换。

谢谢Erik.Brilliant。工作得很有魅力。我所做的唯一更改如下:MultiByteToWideChar(1256,0,cc[0],-1,Buffer,Len);