gpt4 book ai didi

java - 从 JNI 调用返回阿拉伯语

转载 作者:太空狗 更新时间:2023-10-29 21:07:21 24 4
gpt4 key购买 nike

我一直在尝试从 JNI 调用返回 ARABIC 字符串。

java方法如下

private native String ataTrans_CheckWord(String lpszWord, String lpszDest, int m_flag, int lpszReserved);

lpszWord : 输入英文
lpszDest : 忽略
m_flag : 忽略
lpszReserved : 忽略

现在,当我使用 javah 生成头文件时,我得到了一个带有此签名的 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;

}

我相信 ARABIC 内容在指向指针“cc”的指针内。最后在我的 java 代码中我有这样的调用

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

System.out.println("FROM JAVE OUTPUT : "+temp); //Prints Junk

我无法将一些阿拉伯字符返回到我的 JAVA 代码中。我做错了什么吗?我已经尝试了其他各种替代方法,例如

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

并返回 tempValue 但没有运气。它在 JAVA 端总是垃圾。

最佳答案

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 的转换。

关于java - 从 JNI 调用返回阿拉伯语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5323362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com