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:

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

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.