Android 原生库引用了错误的共享库

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

我正在构建一个使用 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.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 符号链接(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/

相关文章:

eclipse - 如何在控制台参数中而不是在 Eclipse 中为 ANT 设置 JRE

android - flutter -FCM : how to store background message to SQLite

android - 使用VB.NET向android模拟器发送通知得到错误401

java - ANT 构建失败 : package javax. servlet.jsp 不存在

android - Windows 中的 Android 版 FFMPEG 无法成功编译

android - 在安卓设备上运行 native adobe XMP

android - 运行 ./gradlew buildNative 通过,但 gradle build 没有

java - 在 ViewPager 中时,ListFragment 在事务后显示空屏幕

java - Android(Java)网络编程资源

java - 如何在 Ant 构建脚本期间运行 JUnit 测试,同时从生成的 jar 中省略测试类?