Android本机库引用了不正确的共享库
我正在构建一个Android本机应用程序,使用。一切都构建得很好,在我的libs文件夹中形成了两个共享库:libdig.so(我的)和libopenal.so(OpenAL库) 但是,当我尝试在设备上加载libdig.so时(使用Android本机库引用了不正确的共享库,android,ant,android-ndk,shared-libraries,dynamic-linking,Android,Ant,Android Ndk,Shared Libraries,Dynamic Linking,我正在构建一个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
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中,不在output 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
symlink,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引用了一个(稍微)命名错误的库,或者如何更改它?最简单的方法是使用静态库进行OpenAL。您可以在与共享库相同的位置找到预构建的静态库。我知道这个问题已经有好几年了,但最近我在将游戏重新移植到Android时遇到了完全相同的问题。这个问题让我很沮丧,我甚至尝试了Alex上面的链接,结果发现我也有同样的问题。在花了几天的时间研究这个问题之后,我根据别人在论坛上遇到的类似问题得出了以下结论。最后的.1通常表示使用的库不是为您的目标平台构建的(在本例中,显然是Android),或者完全是构建错误的库 如果你想快速解决这个问题(不需要静态地将OpenAL软件编译到你的应用程序中,同时强迫你的整个项目受制于LGPL),你可以从SFML的github页面下载一些预构建的库。。。反正我就是这么做的。如果不需要,则不必替换.a文件。arm、armv7、x86和mips的版本位于各自的文件夹中
希望这对OP或其他人将来有所帮助。使用openal soft distrib或git
编辑openal soft/build/cmakfiles/openal.dir/link.txt
删除'-Wl,-soname,libopenal.so.1'
和重建库对“.so.1”的依赖关系来自用于构建依赖关系库的链接器标志soname(在本例中为openAL)。对于许多库,可以通过参数将其调整为./configure,但静态libs根本没有这样的问题。