4

char*AndroidでJNIを使​​用してC++からJavaに渡そうとしています。私はそのデータを渡すためにいくつかの方法を試しました

1)使用NewStringUTF

const char* data = getData(); // this method returns a char array.
env->NewStringUTF(data);

上記のコードを実行すると、以下のエラーがスローされます

JNI WARNING: input is not valid Modified UTF-8: illegal continuation byte 0x70.

2)使用NewString

const char* data = getData(); // this method returns a char array.
// passing a byte array to java
jbyteArray trackIDArray = env->NewByteArray(strlen(data));
env->SetByteArrayRegion(trackIDArray, 0, strlen(data), (const jbyte*)trackID);

Java側では、ガベージ値を取得しています。charこの配列をJavaに取り込む方法がわかりません。

4

4 に答える 4

2

dataの代わりに疑うでしょうtrackID

env->SetByteArrayRegion(trackIDArray, 0, strlen(data), (const jbyte*)data);

次に、バイトがあり、Java側では、16進ダンプまたはその他の検査によって、それがどのエンコーディングであるかを確認できます。

後で:

String s = new String(data, "Cp1252"); // Or so.
于 2013-02-19T14:19:42.853 に答える
2

1) yourdataは有効な UTF-8 文字列ではありません。すべての char 配列が自動的に有効な UTF-8 になるわけではありません。おそらく、何らかのシングルバイト エンコーディング (ISO や Windows CP など) で使用されているか、まったく読み取り可能な文字列ではありません。

2) は問題ないはずですが、trackIDから満たされるコードを表示しますdata。ハードタイプキャストする必要があるという事実jbyte*は疑わしいです。このコードは正しいかもしれませんが、Java 側でも間違いを犯す可能性があります。

が読み取り可能な文字列でない場合、または「プラットフォームのデフォルトの文字セット」dataではないシングルバイト エンコーディングの場合、 java.lang.String(byte[]) コンストラクターは読み取り可能な文字列を作成できません。その場合、C 側で UTF-8 に変換する必要があります。また、プラットフォーム固有のエンコーディング (大幅に異なる場合があります) への依存から解放されます。

于 2013-02-19T14:11:48.917 に答える