我正在通过 JNI 访问一个 ICU4C 函数,该函数返回一个 UChar *(即 unicode 字符数组)......我能够通过将 UChar 数组的每个成员等同于我创建的本地 jbyte[] 数组来将其转换为 jbyteArray然后我使用 env->SetByteArrayRegion() 函数将它返回给 Java ......现在我在 Java 中有 Byte[] 数组,但它几乎都是胡言乱语......充其量是奇怪的符号......我不确定问题出在哪里可能是...如果这很重要,我正在使用 unicode 字符...如何正确地将 byte[] 转换为 java 中的 char[]?有些东西没有正确映射......这是代码片段:
--- JNI 代码(稍作改动以使其更短)---
static jint testFunction(JNIEnv* env, jclass c, jcharArray srcArray, jbyteArray destArray) {
jchar* src = env->GetCharArrayElements(srcArray, NULL);
int n = env->getArrayLength(srcArray);
UChar *testStr = new UChar[n];
jbyte destChr[n];
//calling ICU4C function here
icu_function (src, testStr); //takes source characters and returns UChar*
for (int i=0; i<n; i++)
destChr[i] = testStr[i]; //is this correct?
delete testStr;
env->SetByteArrayRegion(destArray, 0, n, destChr);
env->ReleaseCharArrayElements(srcArray, src, JNI_ABORT);
return (n); //anything for now
}
-- Java 代码 -- 字符串 woohoo = "ABCD bal bla bla"; char[] myChars = woohoo.toCharArray();
byte[] myICUBytes = new byte[myChars.length];
int value = MyClass.testFunction (myChars, myICUBytes);
System.out.println(new String(myICUBytes)) ;// produces gibberish & weird symbols
我也尝试过: System.out.println(new String(myICUBytes, Charset.forName("UTF-16"))) 和它一样乱七八糟....
请注意,ICU 函数确实在 UChar *... 中返回正确的 unicode 字符,介于转换为 jbyteArray 和正在搞砸的 Java 之间...
帮助!