【发布时间】:2014-04-22 19:13:47
【问题描述】:
我正在构建一个使用 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 中,不在输出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 ant android-ndk shared-libraries dynamic-linking