2011-08-07 15 views
5

Necesito implementar un método nativo, digamos "public native void someFunc();". Tengo dos bibliotecas, libabc.so y libdef.so. Java usa System.loadLibrary(); cargar libabc.so (que no implementa el método), pero la implementación de JNI está en libdef.so. Actualmente, estoy haciendo lo siguiente en libabc.so.¿Utiliza JNI para cargar otra biblioteca JNI?

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved){ 
JNIEnv *env; 
jclass cls; 
jmethodID get_load_id; 
jstring name; 

jvm->GetEnv((void**)&env, JNI_VERSION_1_4); 
cls = env->FindClass("java/lang/System"); 
get_load_id = env->GetStaticMethodID(cls, "load", "(Ljava/lang/String;)V"); 
name = env->NewStringUTF("/lib/libdef.so"); 
env->CallStaticVoidMethod(cls, get_load_id, name); 

return JNI_VERSION_1_4; 
} 

Sin embargo, estoy recibiendo un error (de Logcat androide) "JNI_OnLoad volvió mala versión (-1) en /lib/libdef.so" Si se me carga libdef.so directamente desde Java, I don' obtener este error Además, si hago otro método nativo "loadDef()" y lo implemento con el mismo código, también funciona. El problema, creo, es usar jvm-> GetEnv() pero no estoy seguro. Además, ni siquiera sé si esto me permitiría lograr lo que quiero (utilizar una biblioteca JNI para cargar otra para implementar). El motivo por el que hago esto es complicado, pero no hay alternativas.

+0

Ah, algo más de información. En el logcat, antes de obtener el error, veo "Tratando de cargar lib /lib/libdef.so 0x0", creo que significa que está intentando cargar la biblioteca en 0x0. ¿Porqué es eso? – Yifan

+0

No estoy seguro de que sea razonable esperar que 'loadLibrary()' sea reentrante. El hecho de que esto funcione a partir de un método nativo normal parece tener esa sospecha. ¿Por qué no nos intentas con esa razón complicada? Quizás podamos ayudar a pensar en una alternativa. –

+0

Podría intentar 'RegisterNatives', pero eso significa que tengo que cargar la biblioteca manualmente y encontrar dónde están las funciones. Si loadLibrary() no es reentrante y ese es el problema, puede que tenga que hacer eso. – Yifan

Respuesta

0

Si bien todavía no tengo una solución para el problema de cargar otra biblioteca JNI en JNI_OnLoad, encontré la primera función nativa que se llama, la reemplacé, y en esa función, ejecuto el código loadLibrary. Luego vuelvo a llamar al método nativo desde JNI y ejecuta la nueva versión del método.