2011-08-07 16 views
5

Ho bisogno di implementare un metodo nativo, diciamo "public nativo void someFunc();". Ho due librerie, libabc.so e libdef.so. Java utilizza System.loadLibrary(); per caricare libabc.so (che non implementa il metodo), ma l'implementazione JNI è in libdef.so. Attualmente, sto seguendo quanto segue in libabc.so.Utilizzo di JNI per caricare un'altra libreria 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; 
} 

Tuttavia, sto ricevendo un errore (da logcat Android) "JNI_OnLoad restituito versione cattiva (-1) in /lib/libdef.so" Se carico libdef.so direttamente da Java, I don' t ottenere questo errore. Inoltre, se faccio un altro metodo nativo "loadDef()" e lo implemento con lo stesso codice, funziona anche. Il problema, penso, sta usando jvm-> GetEnv() ma non ne sono sicuro. Inoltre, non so nemmeno se questo mi permetterebbe di ottenere ciò che voglio (usa una libreria JNI per caricarne un'altra da implementare). Il motivo per cui lo sto facendo è complicato, ma non ci sono alternative.

+0

Oh, qualche altra informazione. Sul logcat, prima di ottenere l'errore, sto vedendo "Cercando di caricare lib /lib/libdef.so 0x0" Penso che stia cercando di caricare la libreria su 0x0. Perché? – Yifan

+0

Non sono sicuro che sia ragionevole aspettarsi che 'loadLibrary()' sia rientrante. Il fatto che funzioni da un normale metodo nativo sembra sradicare questo sospetto. Perché non ci provi con questa complicata ragione? Forse possiamo aiutare a pensare ad un'alternativa. –

+0

Potrei provare "RegisterNatives", ma ciò significa che devo caricare manualmente la libreria e trovare dove sono le funzioni. Se loadLibrary() non è rientrante e questo è il problema, potrei doverlo fare. – Yifan

risposta

0

Mentre non ho ancora una soluzione per il problema del caricamento di un'altra libreria JNI in JNI_OnLoad, ho trovato la prima funzione nativa che viene chiamata, sostituita, e in quella funzione, eseguo il codice loadLibrary. Quindi chiamo di nuovo il metodo nativo da JNI e viene eseguita la nuova versione del metodo.