ネイティブメソッドを実装する必要があります。「public native void someFunc();」としましょう。私は2つのライブラリ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に」私は、Javaから直接libdef.soロードする場合、私は「ドンこのエラーは発生しません。さらに、別のネイティブメソッド "loadDef()"を作成して同じコードで実装すると、それも機能します。問題は、私が思うに、jvm-> GetEnv()を使っていますが、わかりません。また、これで私が望むものを実現できるかどうかも分かりません(実装するために別のJNIライブラリを使用すること)。私がこれをやっている理由は複雑ですが、選択肢はありません。
さらに詳しい情報logcatでは、エラーが出る前に、「lib /lib/libdef.so 0x0をロードしようとしています」というメッセージが表示されます。これは、ライブラリを0x0にロードしようとしていることを意味します。何故ですか? – Yifan
'loadLibrary()'が再入可能であると期待するのは妥当かどうかはわかりません。これが正常なネイティブメソッドから動作するという事実は、その疑いを抱くようです。その複雑な理由で私たちを試してみてはいかがですか?代替案を考えるのに役立つかもしれません。 –
私は 'RegisterNatives'を試してみることができますが、これはライブラリを手動でロードして関数の場所を見つけなければならないことを意味します。 loadLibrary()がリエントラントでなく、それが問題である場合、私はそれをしなければならないかもしれません。 – Yifan