UChar *(つまりUnicode文字配列)を返すJNIを介してICU4C関数にアクセスしています... UChar配列の各メンバーを作成したローカルjbyte[]配列と同等にすることで、これをjbyteArrayに変換できました。次に、env-> SetByteArrayRegion()関数を使用してJavaに戻しました...これで、JavaにByte []配列がありますが、すべてがかなりぎこちないです。かもしれません...それが重要な場合はユニコード文字を使用しています...Javaでbyte[]を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コード--stringwohoo= "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")))そしてそれは同じようにgebberishyです...。
ICU関数はUCharで適切なUnicode文字を返すことに注意してください*...jbyteArrayへの変換とJavaへの変換の間のどこかで混乱しています...
ヘルプ!