3

私の仕事は Android フレームワークの移植です。

Android Jelly Bean で実行できない 3 番目の APK がたくさんあります。(これらはすべて libmono.so へのリンカです)

libmono.so の JNI_OnLoad() 関数で、実行時にすべて失敗します。以下は私のエラーログと分析です。

//1. Android dalvik vm native.cpp ( dvmLoadNativeCode(){ ...dlopen()...})

**D/dalvikvm(2629): Added shared lib /data/data/pl.idreams.jellydefense/lib/libmono.so 0xaed3a578**

//2. Android リンカは libmono.so をロードし、JNI_OnLoad 関数アドレスを返します // Android dalvik vm native.cpp ( dvmLoadNativeCode(){ ...dlsym(handle, "JNI_OnLoad")...})

**D/linker(2629): TRACE:  1252 SEARCH JNI_OnLoad in libmono.so@0xa5cf9000 0467e784 86**
**D/linker(2629): TRACE:  1252 FOUND JNI_OnLoad in libmono.so (0000a3a4) 340**

//3. Android dalvik vm native.cpp ( dvmLoadNativeCode(){ ..version = (*func)(gDvmJni.jniVm, NULL);..}) // JNI_OnLoad 関数を実行し、JNI バージョンを返します。libmono はエラー メッセージの下にダンプします

**E/linker(2629): ERROR: OOPS:     0 cannot map library 'libmono.so'. no vspace available.**

//4. libmono は JNI バージョン = 0 を返します

**W/dalvikvm(2629): JNI_OnLoad returned bad version (0) in /data/data/pl.idreams.jellydefense/lib/libmono.so 0xaed3a578**

JNI_OnLoad が Libmono.so で失敗した理由を教えてもらえますか?

JNI_OnLoad は Libmono.so で何をしますか? (一部のモジュールまたは共有ライブラリを失いますか?)

どうもありがとう、ちんく

4

1 に答える 1

1

アプリケーションが割り当てようとしているメモリが多すぎて、Android には十分なメモリが割り当てられていないようです。原因は必ずしも libmono.so (またはそれをロードするクラスですが、これらが原因である可能性があります) ではなく、そのライブラリのロード中にたまたま発生するだけです。

ネイティブ ライブラリの JNI_OnLoad() 関数は、続行できることを示す JNI バージョンを返すか、続行できないと判断した場合は 0 を返します。割り当てに失敗すると、初期化できなかったため使用できないことを示すために 0 が返されているようです。

「ライブラリ 'libmono.so' をマップできません。利用可能な vspace がありません。」について。-- これはオープン ソース プロジェクトですよね。JNI_OnLoad ソースを見つけて自分で答えるのに問題はないと思います。

于 2012-09-06T11:27:48.427 に答える