NewGlobalRef para jmethodID
Tengo un problema con algo que de otra manera parece ser una tarea fácil. Tengo un método nativo que devuelve un jobjectArray de instancias de una clase Java (personalizada). Lo que hago es obtener la clase jclass para mi clase que quiero instanciar y devolver y luego obtener el jmethodID para su constructor.
La firma del método nativo es:
- ¿Puedes detectar un error de JNI en una biblioteca de terceros antes de un duro choque?
- Cómo obtener un contexto de una actividad nativa
- JNI se bloquea cuando se llama con un argumento String
- Callback Listener en Unity - Cómo llamar al método de archivo de script desde UnityPlayerActivity en Android
- Pasar un objeto Java a C ++ a través de JNI y luego volver a Java, a través de void *
JNIEXPORT jobjectArray JNICALL Java_com_mn_rootscape_utils_NativeMethods_getFilesPermissions( JNIEnv* env, jobject thizz, jobjectArray filePathsArray )
El espacio de nombres y la firma del constructor se definen de la siguiente manera:
const char* kFilePermissionInfoPath = "com/mn/rootscape/utils/FilePermissionInfo"; const char* kFilePermInfoConstructorSig = "(IIIIIJJJLjava/lang/String;Ljava/lang/String;ZLjava/lang/String;)V";
Para la jclass y jmethodID estoy siguiendo las instrucciones publicadas aquí . Así que estoy obteniendo sus referencias globales para poder usarlas más tarde. Tenga en cuenta que no tengo un oninit en mi lib, sin embargo, el código es sólo para la prueba por ahora.
El problema es que obtengo un error de segmentación cuando intento recuperar la referencia global para el jmethodID.
El código que hace esto es:
jclass filePermInfoCls = (*env)->FindClass(env, kFilePermissionInfoPath); if(!filePermInfoCls) { LOGE("getFilesPermissions: failed to get class reference."); return NULL; } gFilePermInfoClass = (jclass)(*env)->NewGlobalRef(env, filePermInfoCls); LOGI("got gFilePermInfoClass"); jmethodID filePermInfoClsConstructor = (*env)->GetMethodID(env, gFilePermInfoClass, "<init>", kFilePermInfoConstructorSig1); if(!filePermInfoClsConstructor) { LOGE("getFilesPermissions: failed to get method reference."); return NULL; } gFilePermInfoClsConstructor = (jmethodID)(*env)->NewGlobalRef(env, filePermInfoClsConstructor); LOGI("got gFilePermInfoClsConstructor");
El error real es:
06-14 09: 17: 26.648: W / dalvikvm (26012): Referencia indirecta no válida 0x4c0bdc40 en decodeIndirectRef 06-14 09: 17: 26.648: E / dalvikvm (26012): VM aborting
GFilePermInfoClass y gFilePermInfoClsConstructor son objetos jclass y jmethodID globales, para contener las referencias globales.
Cualquier ayuda en esto sería apreciada.
Gracias
- Android y JNI cómo pasar una matriz de datos Byte a JNI y recuperar Byte
- ByteBuffer no libera memoria
- Cómo depurar código nativo en un proyecto de biblioteca de Android?
- Android NDK y Gradle: Android.mk diferente por tipo de compilación
- Recuperar la carátula del álbum utilizando FFmpeg
- Pasar una cadena al código C en Android NDK
- Técnica subyacente de FaceDetector de Android
- Android JNI nativo C función llamada mata actividad
Un jmethodID
no es un objeto. No es necesario convertirlo a un GlobalRef
. Ditto jfieldID
.
- ¿Cuál es la diferencia entre la etiqueta layout_alignStart y layout_alignLeft?
- Libgdx: configurar otra pantalla, pero los botones permanentes de la pantalla antigua están activos