我的工作是 android 框架移植。
我有很多第 3 个 APK 无法在我的 Android Jelly Bean 上运行。 (它们都是 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 中做了什么? (我是否丢失了一些模块或共享库?)
非常感谢, 金库
最佳答案
看起来您的应用程序正在尝试分配过多的内存,而 Android 已经受够了。原因不一定是您的 libmono.so(或加载它的类,尽管这些可能是罪魁祸首),它恰好发生在该库的加载过程中。
native 库的 JNI_OnLoad() 函数返回一个 JNI 版本以指示它能够继续,或者如果确定它不能继续则返回 0。看起来分配失败导致它返回 0,表示它无法初始化,因此无法使用。
至于“无法映射库‘libmono.so’。没有可用的虚拟空间。” -- 这是一个开源项目,对吧?我想您会毫不费力地找到 JNI_OnLoad 源来自己回答这个问题。
关于android - JNI_OnLoad 在 android libmono.so 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12298790/