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?
- Compilación de Android JNI para OpenCV en Mac OSX
- UnsatisfiedLinkError (Método nativo no encontrado)
- Creación de un android.graphics.Bitmap desde C ++
- JNI ERROR (bug de la aplicación): desbordamiento de la tabla de referencia local (máx = 512)
- ¿Cómo puedo manejar las llamadas a AudioTrack de jni sin estrellarse?
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.
- El mejor enfoque para cargar múltiples bibliotecas nativas en la aplicación para Android
- Codificación de vídeo en Android mediante cv :: Mat y MediaCodec
- UnsatisfiedLinkError: Método nativo no encontrado - Android
- JNA para android
- ¿Impedir que las funciones sean eliminadas de una biblioteca estática cuando están enlazadas en una biblioteca compartida?
- FindClass no puede encontrar la clase Java personalizada
- No se pudo cargar libfoo: findLibrary returned null
- Android NDK y C + + STL
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