Использование JNI для загрузки другой библиотеки JNI?
Мне нужно реализовать собственный метод, скажем, "public native void someFunc();". У меня есть две библиотеки, libabc.so и libdef.so. Java использует System.loadLibrary(); загрузить libabc.so (который не реализует метод), но реализация JNI находится в libdef.so. В настоящее время я делаю следующее в libabc.so.
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;
}
Тем не менее, я получаю сообщение об ошибке (из android logcat) "JNI_OnLoad вернул неверную версию (-1) в /lib/libdef.so". Если я загружаю libdef.so напрямую из Java, я не получаю эту ошибку. Кроме того, если я сделаю другой собственный метод "loadDef()" и реализую его с тем же кодом, он также будет работать. Проблема, я думаю, заключается в использовании jvm->GetEnv(), но я не уверен. Кроме того, я даже не знаю, позволит ли это мне добиться того, чего я хочу (используйте одну библиотеку JNI, чтобы загрузить другую для реализации). Причина, по которой я это делаю, сложна, но альтернативы нет.
1 ответ
Хотя у меня до сих пор нет решения проблемы загрузки другой библиотеки JNI в JNI_OnLoad, я нашел первую нативную функцию, которая вызывается, заменил ее, и в этой функции я запускаю код loadLibrary. Затем я снова вызываю нативный метод из JNI, и он запускает новую версию метода.