2009-10-22 6 views
102

アンドロイドNDKを使用しようとしています。JNIからJavaに配列を返す方法は?

JNIでJavaに作成された配列(私の場合はint[])を返す方法はありますか?もしそうなら、これを行うJNI関数の簡単な例を提供してください。

-Thanks

答えて

92

あなたはドキュメントを調べて、まだあなたの最初の質問の一部であるべき質問がありました場合。この例では、この例のJNI関数は多数の配列を作成します。外部配列は、JNI関数NewObjectArray()を使用して作成される「オブジェクト」配列で構成されます。 JNIの観点から見ると、それはすべて2次元配列です。つまり、他のいくつかの内部配列を含むオブジェクト配列です。

次のforループは、JNI関数NewIntArray()を使用してint []型の内部配列を作成します。 1次元のint配列を返すだけの場合は、戻り値を作成するのに、NewIntArray()関数を使用します。文字列の1次元配列を作成する場合は、NewObjectArray()関数を使用しますが、クラスのパラメータは異なります。

あなたはint型の配列を返すようにしたいので、その後、あなたのコードはこのような何か見に行くされています

のjava:誰かがString []配列を返す方法をお知りになりたい場合は

JNIEXPORT jintArray JNICALL Java_ArrayTest_initIntArray(JNIEnv *env, jclass cls, int size) 
{ 
jintArray result; 
result = (*env)->NewIntArray(env, size); 
if (result == NULL) { 
    return NULL; /* out of memory error thrown */ 
} 
int i; 
// fill a temp structure to use to populate the java int array 
jint fill[size]; 
for (i = 0; i < size; i++) { 
    fill[i] = 0; // put whatever logic you want to populate the values here. 
} 
// move from the temp structure to the java structure 
(*env)->SetIntArrayRegion(env, result, 0, size, fill); 
return result; 
} 
+0

ええ、私はすでにそれをしました。私は自分の問題(最後のもの)に関連する例を理解することができず、int []を返すだけで簡単な例を説明することができないのだろうかと思っていました。 – RyanCheu

+0

編集:私の前のコメントを無視してください、上記のコードは動作します。 ありがとうございます!それはとても役に立ちました。 – RyanCheu

+3

EDIT2:コードは機能しますが、SetIntArrayRegion(...)でtmpを変更する必要があります。 – RyanCheu

30

をコード

private native String[] data(); 

ネイティブ輸出

JNIEXPORT jobjectArray JNICALL Java_example_data() (JNIEnv *, jobject); 
012リンクから

ネイティブコード

JNIEXPORT jobjectArray JNICALL 
       Java_example_data 
    (JNIEnv *env, jobject jobj){ 

    jobjectArray ret; 
    int i; 

    char *message[5]= {"first", 
         "second", 
         "third", 
         "fourth", 
         "fifth"}; 

    ret= (jobjectArray)env->NewObjectArray(5, 
     env->FindClass("java/lang/String"), 
     env->NewStringUTF("")); 

    for(i=0;i<5;i++) { 
     env->SetObjectArrayElement( 
     ret,i,env->NewStringUTF(message[i])); 
    } 
    return(ret); 
    } 

http://www.coderanch.com/t/326467/java/java/Returning-String-array-program-Java