2011-08-07 29 views
5

ネイティブメソッドを実装する必要があります。「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ライブラリを使用すること)。私がこれをやっている理由は複雑ですが、選択肢はありません。

+0

さらに詳しい情報logcatでは、エラーが出る前に、「lib /lib/libdef.so 0x0をロードしようとしています」というメッセージが表示されます。これは、ライブラリを0x0にロードしようとしていることを意味します。何故ですか? – Yifan

+0

'loadLibrary()'が再入可能であると期待するのは妥当かどうかはわかりません。これが正常なネイティブメソッドから動作するという事実は、その疑いを抱くようです。その複雑な理由で私たちを試してみてはいかがですか?代替案を考えるのに役立つかもしれません。 –

+0

私は 'RegisterNatives'を試してみることができますが、これはライブラリを手動でロードして関数の場所を見つけなければならないことを意味します。 loadLibrary()がリエントラントでなく、それが問題である場合、私はそれをしなければならないかもしれません。 – Yifan

答えて

0

JNI_OnLoadに別のJNIライブラリをロードする問題に対する解決策はまだありませんが、呼び出された最初のネイティブ関数が見つかり、その関数でloadLibraryコードを実行しました。次に、JNIからネイティブメソッドを再度呼び出すと、メソッドの新しいバージョンが実行されます。

関連する問題