2011-08-07 6 views
5

Мне нужно реализовать собственный метод, скажем, «public native void someFunc();». У меня две библиотеки libabc.so и libdef.so. Java использует System.loadLibrary(); для загрузки libabc.so (который не реализует метод), но реализация JNI находится в libdef.so. В настоящее время я делаю следующее в libabc.so.Использование JNI для загрузки другой библиотеки 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; 
} 

Однако я получаю сообщение об ошибке (от андроида LogCat) «JNI_OnLoad вернулся плохой вариант (-1) в /lib/libdef.so» Если я загружаю libdef.so непосредственно из Java, я не» t получить эту ошибку. Кроме того, если я создаю другой собственный метод loadDef() и реализую его с тем же кодом, он также работает. Проблема, я думаю, заключается в использовании jvm-> GetEnv(), но я не уверен. Кроме того, я даже не знаю, позволит ли это мне достичь того, что я хочу (используйте одну библиотеку JNI для загрузки другой для реализации). Причина, по которой я это делаю, сложна, но альтернатив нет.

+0

О, дополнительная информация. На logcat, прежде чем получить ошибку, я вижу «Попытка загрузить lib /lib/libdef.so 0x0». Я думаю, это означает, что он пытается загрузить библиотеку в 0x0. Почему это? – Yifan

+0

Я не уверен, что разумно ожидать, что 'loadLibrary()' будет реентерабельным. Тот факт, что это работает из обычного родного метода, похоже, несут это подозрение. Почему бы вам не попробовать нас по этой сложной причине - может быть, мы сможем подумать об альтернативе. –

+0

Я мог бы попробовать 'RegisterNatives', но это означает, что мне нужно загрузить библиотеку вручную и найти, где находятся функции. Если loadLibrary() не реентерабелен, и это проблема, возможно, мне придется это сделать. – Yifan

ответ

0

Хотя у меня все еще нет решения проблемы с загрузкой другой библиотеки JNI в JNI_OnLoad, я обнаружил первую нативную функцию, которая вызывается, заменяет ее, и в этой функции я запускаю код loadLibrary. Затем я снова вызываю собственный метод из JNI и запускает новую версию метода.

Смежные вопросы