Мне нужно реализовать собственный метод, скажем, "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, чтобы загрузить другую для реализации). Причина, по которой я это делаю, сложна, но альтернатив нет.