Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android本机库引用了不正确的共享库_Android_Ant_Android Ndk_Shared Libraries_Dynamic Linking - Fatal编程技术网

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

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

我正在构建一个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中,不在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根本没有这样的问题。