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

时间:2014-04-22 19:13:48

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

我正在构建一个使用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中,不在输出库/或其他任何地方。

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引用一个(稍微)错误命名的库,或者如何更改它?

3 个答案:

答案 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