Использование JNI для загрузки другой библиотеки JNI? - PullRequest
5 голосов
/ 07 августа 2011

Мне нужно реализовать собственный метод, скажем, "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 Ответ

0 голосов
/ 08 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...