2

配列へのポインターを JNI C コードから Java コードに送信するにはどうすればよいですか? 例えば ​​:

JNI C コード :

jclass cls = (*env)->GetObjectClass(env,obj);
jmethodID mid = (*env)->GetMethodID(env,cls,"print"," ?? "); // What should be the signature here ?
jvalue a1,*arr;
a1.i = 2002;
a1.f = 12.90;
a1.c = 's';
a1.j = 344554;
a1.b = TRUE;
arr = &a1;
(*env)->CallVoidMethodA(env,obj,mid,arr);

Java 関数 :

public void print(?????) { // what should be the argument here ?
  // add code here
}

配列へのポインタを受け取るには、Java 関数はどのように見えるべきですか?

4

1 に答える 1

1

まず、コードに関する2つの問題:

  1. arrは実際には配列ではないため(単一のjvalueを指します)、したがって、値だけでなくポインターで渡す理由はありません。
  2. 可能なすべてのプリミティブ型と参照型の和集合であるa1.Xため、最後の割り当てを除いて、これらの割り当てはすべて役に立ちません。jvalue

次へ:生のCポインターをJNIに渡すことは不可能です(もちろん、できますが、Javaにポインターをオブジェクトとしてではなく、数値として表示させることしかできません)。Java配列またはバッファオブジェクトを作成する必要があります。参照の配列を作成する場合は配列が適していますが、メモリをコピーする必要があります。C配列がJavaバッファとメモリを共有する場合は、バッファが適しています。

于 2012-10-06T08:35:44.723 に答える