Android本机库引用了不正确的共享库



我正在构建一个使用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时遇到了完全相同的问题。这个问题让我很沮丧,我甚至尝试了上面亚历克斯的链接,结果发现我也有同样的问题。在花了几天时间研究这个问题后,我根据其他人在论坛上遇到的类似问题得出了以下结论。结尾的.1通常表示使用了一个不是为您的目标平台(在本例中,显然是Android)构建的库,或者完全使用了错误构建的库。

如果你想快速解决这个问题(不需要在应用程序中静态编译OpenAL Soft,同时强制整个项目服从LGPL),你只需从SFML的github页面下载一些预构建的库。。。我就是这么做的。如果不需要的话,你不必替换.a文件。arm、armv7、x86和mips的构建都在它们各自的文件夹中。

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

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

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

相关内容

  • 没有找到相关文章

最新更新