2009-10-22 13 views
102

Estoy intentando utilizar el Android NDK.¿Cómo devolver una matriz de JNI a Java?

¿Hay una manera de devolver una matriz (en mi caso un int[]) creada en JNI para Java? De ser así, proporcione un ejemplo rápido de la función JNI que haría esto.

-Gracias

Respuesta

92

Si ha examinado la documentación y todavía tiene preguntas que deben ser parte de su pregunta inicial. En este caso, la función JNI en el ejemplo crea un número de matrices. La matriz externa se compone de una matriz 'Objeto' que crea con la función JNI NewObjectArray(). Desde la perspectiva de JNI, eso es todo una matriz bidimensional, una matriz de objetos que contiene una serie de otras matrices internas.

La siguiente bucle for crea las matrices interiores que son de tipo int [] utilizando la función JNI NewIntArray(). Si sólo quería devolver una matriz unidimensional de enteros, entonces la función NewIntArray() es lo que se utiliza para crear el valor de retorno. Si desea crear una matriz unidimensional de Cuerdas continuación, tendrá que utilizar la función NewObjectArray() pero con un parámetro diferente para la clase.

Puesto que usted quiere devolver una matriz int, a continuación, el código va a ser algo como esto:

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

Sí, lo hice que ya. Estaba teniendo problemas para entender el ejemplo que estaba relacionado con mi problema (el último), y me preguntaba si a alguien le importaría explicar un ejemplo más simple con solo devolver un int []. – RyanCheu

+0

EDITAR: ignora mi comentario anterior, el código anterior funciona. ¡Gracias! Eso fue muy útil. – RyanCheu

+3

Edit2: El código funciona, pero hay que cambiar tmp en el SetIntArrayRegion (...) a llenar. – RyanCheu

30

si alguien quisiera saber cómo devolver String [] array:

java código

private native String[] data(); 

exportación nativa

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

código nativo

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 enlace: http://www.coderanch.com/t/326467/java/java/Returning-String-array-program-Java

Cuestiones relacionadas