我正在使用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的项目属性如下:
对于libbridge.so:
我很困惑。当桥库试图使用utils库时,额外的“lib”会在哪里出现? utils库确实成功加载,如果我没有链接utils库并注释掉对utils库中所有东西的所有调用,那么桥库也是如此。
到目前为止,我已尝试将目标名称更改为“utils”而不是“libutils”,但它不起作用。我也尝试使用lib $(TargetName)作为soname设置,但它也不起作用。
答案 0 :(得分:0)
我不知道为什么日志会提到 liblibutils ,但如果您希望它在典型的Android系统上运行,则应更改您的代码。原因是libutils.so
是标准分布的一部分,位于/system/lib
。对于loadLibrary()
和本机加载器,/system/lib
优先于特定于应用程序的lib目录,而 libutils.so 从未有机会加载。因此, UnsatisfiedLinkError 是不可避免的。
为您的utils库使用一个更独特的名称,装载程序很高兴。
答案 1 :(得分:0)
我找到了问题的原因。原来我链接到一个错误的文件(错误的文件夹),旧版本的实用程序库所在的位置。