android加载库失败

时间:2015-09-30 07:28:21

标签: java android c android-ndk java-native-interface

当我使用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

1 个答案:

答案 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(如果有的话)。如果没有调用它,请检查所有可以静态调用的函数(注意,有些可能隐藏在宏后面)并尝试删除它们以查看是否能够加载库