当我使用System.loadLibrary()
加载我的so文件时,很少会失败并且Logcat会说
Cannot load library: reloc_library[1286]: 121 cannot locate '__cxa_atexit'
java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1285]: 169 cannot locate '__cxa_atexit'...
at java.lang.Runtime.loadLibrary(Runtime.java:370)
at java.lang.System.loadLibrary(System.java:535)
搜索互联网后,我找不到任何关于
的信息cannot locate '__cxa_atexit'
(尤其是关键词__cxa_atexit)。为什么找不到这个功能?这个函数似乎在libc.so中。我不在我的本机代码中使用C ++,只有C.我的NDK版本是android-ndk-r10e。我认为“找不到__cxa_atexit”可能是一个相对的线索。
大多数时候(也许数十亿的应用程序启动),它可以很好地工作,但很少像上面那样崩溃。换句话说,我不能让它在我的测试手机上崩溃,但是,它会在某些用户身上很少崩溃。
此问题可能与another problem相同。
更新
这次崩溃发生的大多数手机都是android 4.0.3和android 4.0.4。这两个版本都是API-15。
更新
在阅读了一些Android的源代码后,我发现这个问题可能与dlopen有关。错误消息“无法加载库:reloc_library ...”来自在运行时被劫持的函数dlopen。跟踪是runtime dlopen - > find_library - > init_library - > link_image - > reloc_library。
也许当它解析我的so文件中的符号时,它会发现“__cxa_atexit”未定义。然后它在加载的符号中查找,但什么都没找到。 (为什么找不到__cxa_atexit?)最后它运行到1285行,代码为:
DL_ERR("%5d cannot locate '%s'...\n", pid, sym_name);
我对链接器一无所知。任何人都可以解释或猜测为什么找不到__cxa_atexit?这是Android的错误吗?
更新
它在所有Android版本上崩溃,不仅仅是4.0.3& 4.0.4。
4.0.3&amp ;;上的错误消息4.0.4是
java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1286]: 121 cannot locate '__cxa_atexit'
如上所述。
当加载其他一些4.0.3& 4.0.4,它是
cannot locate 'strcpy'
4.2.2上的错误消息是
java.lang.UnsatisfiedLinkError: Cannot load library: load_library(linker.cpp:767): can't read file /mnt/asec/app-name-1/lib/libname.so: I/O error
答案 0 :(得分:-1)
首先,请确保您调用System.loadLibrary(),如下所示:
public class MainActivity extends Activity {
static {
System.loadLibrary("main")
}
...
}
然后,根据the second answer in this post, 问题出在您的本机库中静态加载的一些外部依赖项。他们只挂在Android 4.0上,它运行良好4.2及以上。所以你应该检查你的文件。
我只是在这里回答:
如果遇到问题,请将__android_log_print放入库的JNI_onLoad(如果有的话)。如果没有调用它,请检查所有可以静态调用的函数(注意,有些可能隐藏在宏后面)并尝试删除它们以查看是否能够加载库