ubicacion studio ndk how configurar android arrays java-native-interface android-ndk

how - ndk android studio install



Devuelve una matriz de cadenas en un método JNI (2)

Necesito obtener una lista de cadenas (char *) de C ++ y devolverla a Java.

¿Cómo puedo hacer eso?

Creo que una solución es devolver una cadena grande predefinida como: "[item1] [item2]" y hacer una división en Java, pero no parece el enfoque correcto.


Mire NewObjectArray en el documento JNI.

Básicamente, puede devolver desde la función JNI un Array Of String (Java) y luego transformarlo en una List o en cualquier tipo de colección.

Codigo peudo

Java:

.... public List<String> getFooAsList(){ return new ArrayList(this.getData()); } private native String[] getData();

JNI

#include <jni.h> JNIEXPORT jobjectArray JNICALL como_foo_bar_getData (JNIEnv *env, jobject jobj){ jobjectArray ret; int i; char *data[5]= {"A", "B", "C", "D", "E"}; ret= (jobjectArray)env->NewObjectArray(5,env->FindClass("java/lang/String"),env->NewStringUTF("")); for(i=0;i<5;i++) env->SetObjectArrayElement(ret,i,env->NewStringUTF(data[i])); return(ret); }

¡¡¡No probado!!!

Déjame saber si funciona para ti

Saludos


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

Creo que el elemento inicial se inicializó a "" (cadena vacía)

env->NewStringUTF("")

no es necesario, ya que asigna un nuevo valor al elemento de la matriz justo después de:

for(i=0;i<5;i++) env->SetObjectArrayElement(ret,i,env->NewStringUTF(data[i]));

Un simple "NULO" sería suficiente en este caso, ya que el elemento inicial especificado será elegible para la recolección de basura tan pronto como se ejecute la siguiente línea. Es como escribir lo siguiente en código Java:

int i = 0; i = 1;

O peor:

Object object = new BigObjectVeryHeavyToInitialize(); object = new AnotherObject();

Tu IDE favorito te emitiría una pequeña advertencia para eso.