我正在使用 VS-Android 来构建我的 NDK 程序。我有两个库,“bridge”和“utils”,第一个使用第二个。两个库都成功编译,文件被正确命名为 libbridge.so 和 libutils.so。但是,当我尝试加载文件时,我得到一个 UnsatisfiedLinkError 说 libbridge.so 无法访问 liblibutils。为什么要搜索 liblibutils?
这是我用来加载库的 Java 代码:
static
{
System.loadLibrary("utils"); // This loads OK
System.loadLibrary("bridge"); // This is found but causes the UnsatisfiedLinkError
}
我得到的确切错误是:
java.lang.UnsatisfiedLinkError: dlopen failed: could not load library "liblibutils"
needed by "libbridge.so"; caused by library "liblibutils" not found
两个库文件都位于同一个文件夹中:
(projectfolder)/libs/armeabi-v7a/libbridge.so
(projectfolder)/libs/armeabi-v7a/libutils.so
现在,在 Visual Studio 中,libutils.so 的链接阶段的相关输出是这样的:
-o E:/NDKProject/Debug/armeabi-v7a/libutils.so -lc -lm -llog -lgcc -Wl,-soname,libutils
以及 libbridge.so 的相关输出:
-o E:/NDKProject/Debug/armeabi-v7a/libbridge.so
-LE:/NDKProject/Debug/armeabi-v7a -lutils -lc -lm -llog -lgcc -Wl,-soname,libbridge
libutils.so 的项目属性如下:
- 目标名称:libutils
- 'soname' 设置:$(TargetName)
对于 libbridge.so:
- 目标名称:libbridge
- 'soname' 设置:$(TargetName)
- 附加依赖项:-lutils
我很困惑。当 bridge 库尝试使用 utils 库时,额外的“lib”从哪里来?utils 库确实加载成功,如果我不链接 utils 库并注释掉对 utils 库中内容的所有调用,桥库也会成功加载。
到目前为止,我已经尝试将目标名称更改为“utils”而不是“libutils”,但它不起作用。我也尝试使用 lib$(TargetName) 作为 soname 设置,但它也不起作用。