2

カスタムオブジェクトタイプShareStructの2D配列を作成するのに苦労しています。

jobjectArray ret ;
jobjectArray ins ;
jobjectArray outs;

jclass myClass = (*env)->FindClass(env,"org/apache/s4/core/ShareStruct");
if (myClass==NULL) fprintf(stderr, "Class ShareStruct not found");

jclass myClassArray = (*env)->FindClass(env, "[Lorg/apache/s4/core/ShareStruct");
if (myClassArray==NULL) fprintf(stderr, "Class ShareStruct[] not found");

ins = (*env)->NewObjectArray(env, in, myClass, NULL);
outs = (*env)->NewObjectArray(env, out, myClass, NULL);
ret = (*env)->NewObjectArray(env, 2, myClassArray, NULL);

最初のクラスのロードは機能しますが(ShareStructは問題ありません)、他のクラスのロードは機能しません(ShareStruct []クラスをロードしようとします)。私はLの有無にかかわらず両方を試しましたが、運がありません。何か案は?JNIは初めてです。

ありがとう!

4

3 に答える 3

5

これjclass myClassArray = (*env)->FindClass(env, "[Lorg/apache/s4/core/ShareStruct");は間違っています。配列を作成するには、次のようにします

 ret = (*env)->NewObjectArray(env,sizeOfArray,myClass,NULL);  
(*env)->SetObjectArrayElement( env, ret,index, sharedStructObj);  

ここで、sharedStructObjはnewObjectによって作成される必要があります。JNIプログラマーガイドの
セクション3.3.5には、関連する良い例があります。

これも便利です。ネイティブコード(JNI / NDK)から2D文字列配列を作成して入力し、返します。

コメントに基づいて編集

in = (*env)->NewObjectArray(env,sizeOfArray,myClass,NULL);
out = (*env)->NewObjectArray(env,sizeOfArray,myClass,NULL);
ret= (*env)->NewObjectArray(env,sizeOfArray,myClass,NULL);
(*env)->SetObjectArrayElement( env, ret,0, in); 
(*env)->SetObjectArrayElement( env, ret,1, out); 
于 2012-07-27T07:07:34.863 に答える
1

外側の配列にはオブジェクト配列を使用する必要があります。

jclass myClassArray = (*env)->FindClass(env, "[Ljava/lang/Object;");

2D文字列配列の同様のケースで私のために働いた。文字列の末尾のセミコロンも認識してください。

于 2013-08-21T14:28:57.580 に答える
1

この質問がまだ関連しているかどうかはわかりませんが、配列クラスの指定の最後にあるセミコロンを忘れただけだと思います。

jclass myClassArray = (*env)->FindClass(env, "[Lorg/apache/s4/core/ShareStruct;");
于 2018-03-21T15:17:03.713 に答える