我正在构建一个使用 OpenAL Soft for Android 的 Android native 应用程序。一切都构建得很好,在我的 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
,带有两个符号链接(symbolic link):libopenal.so.1
和 libopenal.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
符号链接(symbolic link),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
符号链接(symbolic link),即使它从未被命名并且输出文件将是libopenal。所以
。
我对 UNIX 或 Android 开发不够熟悉,无法真正理解 .1
符号链接(symbolic link)的用途,所以我不知道为什么会有对该文件的 secret 引用。
有人遇到过这个问题吗?或者您是否对共享库的编译或管理有更深入的了解,可以解释为什么 libdig.so 引用了一个(稍微)错误命名的库,或者如何更改它?
最佳答案
我知道这个问题已经有几年了,但我最近在将游戏重新移植到 Android 时遇到了完全相同的问题。这个问题让我很沮丧,我什至尝试了上面亚历克斯的链接,却发现我遇到了同样的问题。经过几天的研究这个问题后,我根据论坛上其他人遇到的类似问题得出了以下结论。末尾的 .1 通常表示使用的库不是为您的目标平台(在本例中,显然是 Android)构建的,或者是完全错误构建的库。
如果您想要快速解决此问题(无需将 OpenAL-Soft 静态编译到您的应用程序中,同时强制整个项目受 LGPL 约束),您只需从 SFML 的 github 页面 here 下载一些预构建的库即可。 ……无论如何,我就是这么做的。如果不需要,则不必替换 .a 文件。 arm、armv7、x86 和 mips 的构建位于各自的文件夹中。
希望这对 OP 或将来的其他人有所帮助。
关于Android 原生库引用了错误的共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23228259/