【问题标题】:Unable to dlopen(libsomething.so) Cannot load library: link_image[1995]: failed to link libsomething.so无法 dlopen(libsomething.so) 无法加载库:link_image [1995]:无法链接 libsomething.so
【发布时间】:2011-01-18 11:48:37
【问题描述】:

我正在编写一个具有帮助 java 层的 Native 层的 android 项目,并且我被困在一个地方,当我尝试执行 System.loadLibrary 时,它会抛出无法链接它的错误。

我正在使用 Target 特定的 NDK 构建原生层,然后使用 ant 编译和创建 apk。

在设备上运行时出现以下错误。

无法 dlopen(libsomething.so) 无法加载库:link_image[1995]:无法链接 libsomething.so

该库被捆绑到 apk 中,并被正确解包。如果我尝试手动删除该库然后运行它,它实际上会抛出该库未找到。所以它能够找到库,但它抛出了这个错误,我无法找出为什么会出现这个错误。

请帮帮我。

【问题讨论】:

    标签: android android-ndk


    【解决方案1】:

    首先找到 .so 文件的位置。然后可以试试:

    以下示例假设共享库的位置为: /data/data/my.package/lib/libmysharedlibrary.so

    try {
        //System.loadLibrary("mysharedlibrary");
        System.load("/data/data/my.package/lib/libmysharedlibrary.so");
    } catch (UnsatisfiedLinkError use) {
        Log.e("JNI", "WARNING: Could not load libmysharedlibrary.so");
    }
    

    【讨论】:

    • 就像我说的,库位于所需的位置。我确实得到一个日志输出,说它正在尝试加载库,但在实际尝试加载时,它给了我这个错误。但是,也将尝试进行此更改。奇怪的是,相同的 apk 可以在一台设备上运行,但不能在另一台设备上运行。我完全不知道为什么会发生这种行为。
    • 你能更新两台设备上库文件的路径吗?
    • 它是打包在apk中的,所以在安装的时候会自动解压到同一个目录。即/data/data/package/lib/libsomething.so
    • 如果两个设备上的路径都是正确的,那真的很奇怪。能否贴一下logcat输出的相关部分(异常详情:6/7行)。
    • 我发现了问题。我的库试图在内部链接到其他一些共享库,并且其他共享库在设备上不存在引发链接错误,但存在于运行良好的设备上。 :) 通过 Logcat 并不清楚为什么会发生这种情况,所以很困惑,但是在进行了一些代码比较和一些试验和错误之后,结果证明是这样的。不过谢谢你的帮助。
    【解决方案2】:

    我陷入了同样的问题。最后我从这篇文章中得到了答案: http://mpigulski.blogspot.com/2010/09/debugging-dlopen-unsatisfiedlinkerror.html

    使用

    arm-linux-androideabi-readelf.exe  -d libs/armeabi/libmy.so
    

    然后发现一个错误名称的 NEEDED 共享库。

    【讨论】:

    • 我正在与似乎相同的问题作斗争。我在 NEEDED 下列出了 6 个,但你怎么知道设备中存在什么?有些设备可以工作,有些则不能。
    【解决方案3】:

    有时(大多数时候!)您的库需要@musefan 提到的其他库。你可以列出他们做 readelf -d libs/armeabi/libmy.so。但是这里有一个问题:由于 Android 没有任何机制来控制库版本(就像在普通 linux 中你有 liblzma.so.1、liblzma.so.2 等),你需要的库在那里(liblzma.so)但是没有您的库导入的一些符号。这是一个活生生的例子:你使用 android::ZipFileRO::getEntryInfo 位于 libutils.so 中的函数。该库的所有版本都具有此功能,但是该功能的原型已在 2010 年底更改,因此您为 4.0.4 NDK 构建的应用程序将无法在具有相同症状的 FroYo 设备或 GB 设备上运行:dlopen 无法加载图书馆。以下是如何检测此类情况的方法:您需要 PC 上的内容 os /system/lib 文件夹。如果您是第 3 方应用程序开发或构建(如果您是平台开发人员),它可能是从您的设备转储的文件夹。然后发出命令 arm-linux-gnueabi-ld -rpath-link /path/to/system/lib ./lib_mylib.so 如果发生错误,您会看到一些谎言
    lib_mylib.so: undefined reference toandroid::ZipFileRO::getEntryInfo(void*, int*, long*, long*, long*, long*, long*) const'`

    【讨论】:

      【解决方案4】:

      您也可以在调用 System.load(String pathName) 方法并仅传递 libraryName 而不是库的完整路径时发现此错误。

      解决方案:使用 System.loadLibrary(String libName) 方法,现在传递 libraryName。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-18
        • 1970-01-01
        • 2016-10-29
        • 2018-06-09
        • 1970-01-01
        • 2020-07-25
        • 2020-10-03
        • 1970-01-01
        相关资源
        最近更新 更多