【问题标题】:Android native library references incorrect shared libraryAndroid 原生库引用了错误的共享库
【发布时间】:2014-04-22 19:13:47
【问题描述】:

我正在构建一个使用 OpenAL Soft for Android 的 Android 原生应用程序。一切都构建得很好,在我的 libs 文件夹中生成了两个共享库:libdig.so(我的)和 libopenal.so(OpenAL 库)。

但是,当我尝试在设备上加载 libdig.so(使用 System.loadLibrary( "dig" );)时,链接失败并显示以下消息:

java.lang.UnsatisfiedLinkError: dlopen failed: could not load library "libopenal.so.1" needed by "libdig.so"; caused by library "libopenal.so.1" not found

现在从某种意义上说,问题很明显。 dlopen 正在寻找一个名为 libopenal.so.1 的依赖项,但系统上实际存在的文件(由 ant install 复制到那里)是 libopenal.so:没有 .1

换句话说,libopenal.so 库在任何地方都被调用,只是在内部,libdig.so 以某种方式将其引用为libopenal.so.1

同样相关:在构建 libopenal 时,实际的共享库名称是 libopenal.so.1.13.0,带有两个符号链接:libopenal.so.1libopenal.so。但是没有任何地方引用.1 版本:不在Application.mk 或Android.mk 中,不在输出libs/ 或其他任何地方。

Android.mk 这样链接库:

include $(CLEAR_VARS)

LOCAL_MODULE := openal
LOCAL_SRC_FILES := ../../../Fresh/lib/openal-soft-android-master/libs/$(TARGET_ARCH_ABI)/libopenal.so
LOCAL_EXPORT_C_INCLUDES := $(BASE_PATH)/Fresh/lib/openal-soft-android-master/include

include $(PREBUILT_SHARED_LIBRARY)

...

LOCAL_SHARED_LIBRARIES += openal

现在,有趣的是,如果我从系统中删除 libopenal.so.1 符号链接,ndk-build 将失败,并抱怨:

No rule to make target `openal-soft-android-master/libs/armeabi-v7a/libopenal.so', needed by `obj/local/armeabi-v7a/libopenal.so'.

这意味着在内部,ndk-build 正在尝试引用 .1 符号链接,即使它从未被命名并且输出文件将是 libopenal.so

我对 UNIX 或 Android 开发不够熟悉,无法真正理解 .1 符号链接的用途,所以我不知道为什么会有对那个文件的秘密引用。

有人遇到过这个问题吗?或者您是否更深入地了解共享库的编译或管理,这可以解释为什么 libdig.so 引用了一个(稍微)错误命名的库,或者如何更改它?

【问题讨论】:

    标签: android ant android-ndk shared-libraries dynamic-linking


    【解决方案1】:

    我知道这个问题已经有几年的历史了,但我最近在将我的游戏重新移植到 Android 时遇到了完全相同的问题。这个问题让我很沮丧,我什至尝试了上面 Alex 的链接,却发现我遇到了同样的问题。在花了几天时间研究这个问题之后,我根据其他人在论坛中遇到的类似问题得出了以下结论。最后的 .1 通常表示使用了不是为您的目标平台(在本例中是 Android,显然是)构建的库或完全不正确构建的库。

    如果您想快速解决此问题(无需将 OpenAL-Soft 静态编译到您的应用程序中,同时强制您的整个项目受 LGPL 约束),您可以简单地从 SFML 的 github 页面 here 下载一些预构建的库……反正我就是这么做的。如果不需要,您不必替换 .a 文件。 arm、armv7、x86 和 mips 的构建版本位于各自的文件夹中。

    希望这对 OP 或将来的其他人有所帮助。

    【讨论】:

    • 对“.so.1”的依赖来自链接器标志soname,用于构建依赖库(在本例中为openAL)。对于许多库,这可以通过 ./configure 的参数进行调整,但静态库根本没有这样的问题。
    【解决方案2】:

    最简单的方法是使用 OpenAL 的静态库。您可以在与共享库相同的ZIP file 中找到预构建的静态库。

    【讨论】:

      【解决方案3】:

      使用 openal-soft distrib 或 git
      编辑 openal-soft/build/CMakeFiles/openal.dir/link.txt
      删除 '-Wl,-soname,libopenal.so.1'
      并重建库

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-17
        • 1970-01-01
        • 1970-01-01
        • 2020-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多