Cómo devolver una matriz de JNI a Java?


Estoy intentando usar el NDK de Android.

¿Hay alguna forma de devolver un array (en mi caso un int[]) creado en JNI a Java? Si es así, proporcione un ejemplo rápido de la función JNI que haría esto.

-Gracias

Author: Bill the Lizard, 2009-10-23

3 answers

Si ha examinado la documentación y aún tiene preguntas que deberían formar parte de su pregunta inicial. En este caso, la función JNI en el ejemplo crea una serie de matrices. El array exterior está compuesto por un array' Object ' que se crea con la función JNI NewObjectArray(). Desde la perspectiva del JNI, eso es todo lo que es una matriz bidimensional, una matriz de objetos que contiene una serie de otras matrices internas.

El siguiente bucle for crea los arrays internos que son de tipo int [] utilizando la función JNI NewIntArray(). Si solo desea devolver una matriz dimensional única de ints, entonces la función NewIntArray() es lo que usaría para crear el valor devuelto. Si desea crear una matriz dimensional única de cadenas, entonces usaría la función NewObjectArray() pero con un parámetro diferente para la clase.

Dado que desea devolver una matriz int, entonces su código se verá 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;
}
 102
Author: Jherico,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-19 20:44:36

Si a alguien le gustaría saber cómo devolver el array String []:

Código Java

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

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

 31
Author: zajac.m2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-10 01:49:09

La solución simple es escribir los datos de la matriz en un archivo desde C, y luego acceder al archivo desde Java

 -1
Author: Jeyanth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-03 12:59:10