Я получаю доступ к функции ICU4C через JNI, которая возвращает UChar * (т.е. массив символов Unicode).... Я смог преобразовать это в jbyteArray, приравняв каждый элемент массива UChar к локальному массиву jbyte[], который я создал и затем я вернул его на Java с помощью функции env->SetByteArrayRegion()... теперь у меня есть массив Byte[] в Java, но все это в значительной степени тарабарщина. В лучшем случае странные символы... Я не уверен, в чем проблема может быть... Я работаю с символами Юникода, если это имеет значение... как правильно преобразовать byte[] в char[] в java? Что-то не отображается правильно... Вот фрагмент кода:
--- Код 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 -- string wohoo = "ABCD bal bla bla"; char[] myChars = wohoo.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 *... где-то между преобразованием в jbyteArray и Java, что испортилось...
Помощь!