【发布时间】:2011-07-02 06:09:18
【问题描述】:
我正在通过 JNI 访问一个 ICU4C 函数,该函数返回一个 UChar *(即 unicode 字符数组)......我能够通过将 UChar 数组的每个成员等同于本地 jbyte[] 数组来将其转换为 jbyteArray我创建然后使用 env->SetByteArrayRegion() 函数将其返回给 Java...现在我在 Java 中有 Byte[] 数组,但它几乎都是胡言乱语.. 充其量是奇怪的符号...我不确定问题可能出在哪里......如果这很重要,我正在使用unicode字符......如何在java中正确地将byte []转换为char []?有些东西没有正确映射......这是代码的sn-p:
--- 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 之间...
救命!
【问题讨论】:
-
请不要重复同样的问题 - 我刚刚花了很多时间回答您的另一个重复问题,今天才发现您的问题已经(显然)解决了。
标签: java unicode java-native-interface icu