2009-10-22 8 views
102

J'essaie d'utiliser le NDK android.Comment retourner un tableau de JNI à Java?

Existe-t-il un moyen de retourner un tableau (dans mon cas un int[]) créé en JNI vers Java? Si oui, veuillez fournir un exemple rapide de la fonction JNI qui ferait cela.

-Merci

Répondre

92

Si vous avez examiné les documents et ont encore des questions qui devraient faire partie de votre question initiale. Dans ce cas, la fonction JNI dans l'exemple crée un nombre de tableaux. Le tableau externe est constitué d'un tableau 'Object' créant avec la fonction JNI NewObjectArray(). Du point de vue de JNI, tout cela est un tableau à deux dimensions, un tableau d'objets contenant un certain nombre d'autres tableaux internes.

La boucle for suivante crée les tableaux internes de type int [] à l'aide de la fonction JNI NewIntArray(). Si vous vouliez simplement retourner un tableau d'ints à une seule dimension, la fonction NewIntArray() est ce que vous utiliseriez pour créer la valeur de retour. Si vous vouliez créer un tableau à une seule dimension de chaînes, vous utiliseriez la fonction NewObjectArray() mais avec un paramètre différent pour la classe.

Puisque vous voulez retourner un tableau int, puis votre code va ressembler à quelque chose comme ceci:

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

Oui, je l'ai fait déjà. J'avais du mal à comprendre l'exemple qui était lié à mon problème (le dernier), et je me demandais si quelqu'un m'infligerait d'expliquer un exemple plus simple en retournant juste un int []. – RyanCheu

+0

EDIT: S'il vous plaît ignorer mon commentaire précédent, le code ci-dessus fonctionne. Merci beaucoup! C'était très utile. – RyanCheu

+3

EDIT2: Le code fonctionne, mais vous devez changer tmp dans le SetIntArrayRegion (...) pour remplir. – RyanCheu

30

si quelqu'un aimerait savoir comment retourner cordes tableau []:

java Code

private native String[] data(); 

export natif

JNIEXPORT jobjectArray JNICALL Java_example_data() (JNIEnv *, jobject); 

code natif

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); 
    } 

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

Questions connexes