我正在构建一个使用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.1
和libopenal.so
。但是引用的.1
版本无处不在:不在Application.mk或Android.mk中,不在输出库/或其他任何地方。
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引用一个(稍微)错误命名的库,或者如何更改它?
答案 0 :(得分:2)
我知道这个问题已经有几年了,但我最近在将游戏重新移植到Android时遇到了同样的问题。这个问题让我感到沮丧,我甚至尝试过上面的Alex链接,结果发现我遇到了同样的问题。在花了几天研究这个问题之后,我根据其他人在论坛中遇到的类似问题得出了以下结论。最后的.1通常表示使用的库不是为您的目标平台构建的(在这种情况下,显然是Android)或者是一个错误构建的库。
如果你想快速解决这个问题(没有将OpenAL-Soft静态编译到你的应用程序中,同时强制你的整个项目受LGPL支配),你可以简单地从SFML' s github下载一些预构建的库第here页......那就是我做了什么。如果您不需要,则无需替换.a文件。 arm,armv7,x86和mips的构建位于各自的文件夹中。
希望这有助于OP或未来的其他人。
答案 1 :(得分:1)
最简单的方法是将静态库用于OpenAL。您可以在与共享库相同的ZIP file中找到预构建的静态库。
答案 2 :(得分:0)
使用openal-soft distrib或git
编辑openal-soft / build / CMakeFiles / openal.dir / link.txt
删除'-Wl,-soname,libopenal.so.1'
并重建lib