次のシグネチャを持つ Java 関数があります。
char[] getResult()
このメソッドをネイティブ C コードから呼び出して、戻り値を C 文字の配列に変換するにはどうすればよいですか? JNI はCallCharMethod
機能を提供しますが、提供しているようには見えませんCallCharArrayMethod
。getResult の出力を文字列でラップし、CallObjectMethod を使用する必要がありますか?
次のシグネチャを持つ Java 関数があります。
char[] getResult()
このメソッドをネイティブ C コードから呼び出して、戻り値を C 文字の配列に変換するにはどうすればよいですか? JNI はCallCharMethod
機能を提供しますが、提供しているようには見えませんCallCharArrayMethod
。getResult の出力を文字列でラップし、CallObjectMethod を使用する必要がありますか?
使用CallObjectMethod
; すべての配列型はオブジェクト型です:-)
JNIEnv *env = ...;
jobject inst = ...;
jmethodID getResult_id = ...;
jcharArray array = (*env)->CallObjectMethod(env, inst, getResult_id);
の適切な記述子を覚えておいてgetResult
ください()[C
。
これは、Java の char 型と C の char 型が同じ名前であるにも関わらず大きく異なるという事実によって複雑になります。
Java char 型は、16 ビットの Unicode 文字を表します。C の char も文字を表すことを意図していますが、C は Unicode より前からあるため、これは 1 バイトとして扱われ、char が 8 ビット バイトを超える C の実装については知りません (ただし、標準ではこれ)。
そのため、Java char の配列を C char の配列に変換する限り、エンコーディングの問題に対処する必要がある場合があります。16 ビットに収まらない Unicode 文字があると、さらに複雑になります。
しかし、メソッドの呼び出しに関しては、JNI にはプリミティブ型を返すメソッドを呼び出す関数とオブジェクトのメソッドが用意されており、Java では配列はオブジェクトなので、CallObjectMethod
.