Devuelve una matriz String en un método JNI
Necesito obtener una lista de cadenas (char *) de C ++ y devolverlo a Java.
¿Cómo puedo hacer eso?
- Android NDK desborda la tabla de referencia local JNI de dalvik
- ¿Impedir que las funciones sean eliminadas de una biblioteca estática cuando están enlazadas en una biblioteca compartida?
- Cómo llamar a función Java desde c
- Android JNI: root-making deadd00d (dvmAbort)
- ¿Cómo puedo capturar SIGSEGV (error de segmentación) y obtener un seguimiento de pila bajo JNI en Android?
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.
- Cómo construir una biblioteca compartida y llamarla en otro programa ndk
- ¿Qué es el método Descriptor / signature para byte byte array usando JNI?
- Uso de pjsip con android
- ¿Podemos acceder al controlador de micrófono de mi teléfono Android
- JNI: no se puede encontrar la biblioteca en java.library.path al ejecutar JUnit
- Cómo incluir bibliotecas compartidas precompiladas en apk con eclipse
- Newbie en Android NDK: definición en Android.mk
- Cómo conectar Kinect a Android
Mira NewObjectArray
en el documento JNI.
Básicamente, puede regresar de la función JNI un Array Of String (Java) y luego transformarlo en una List
o cualquier tipo de tipo de colección.
Código 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!!!
Avísame si funciona para ti
Saludos
ret= (jobjectArray)env->NewObjectArray(5,env->FindClass("java/lang/String"),env->NewStringUTF(""));
Creo que el elemento inicial inicializado a "" (cadena vacía)
env->NewStringUTF("")
No es necesario, ya que asigna un nuevo valor al elemento de matriz justo después de:
for(i=0;i<5;i++) env->SetObjectArrayElement(ret,i,env->NewStringUTF(data[i]));
Un simple "NULL" sería suficiente en este caso, ya que el elemento inicial especificado será electable para recolección de basura tan pronto como se ejecuta 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();
Su IDE favorito le daría una pequeña advertencia para eso.
- Renuncia a system.img en un dispositivo
- Picasso carga imágenes con una imagen errónea en un adaptador de lista