Мне нужно реализовать собственный метод, скажем, «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 для загрузки другой для реализации). Причина, по которой я это делаю, сложна, но альтернатив нет.
О, дополнительная информация. На logcat, прежде чем получить ошибку, я вижу «Попытка загрузить lib /lib/libdef.so 0x0». Я думаю, это означает, что он пытается загрузить библиотеку в 0x0. Почему это? – Yifan
Я не уверен, что разумно ожидать, что 'loadLibrary()' будет реентерабельным. Тот факт, что это работает из обычного родного метода, похоже, несут это подозрение. Почему бы вам не попробовать нас по этой сложной причине - может быть, мы сможем подумать об альтернативе. –
Я мог бы попробовать 'RegisterNatives', но это означает, что мне нужно загрузить библиотеку вручную и найти, где находятся функции. Если loadLibrary() не реентерабелен, и это проблема, возможно, мне придется это сделать. – Yifan