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.