0

我正在使用 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 设置,但它也不起作用。

4

2 回答 2

0

我找到了问题的原因。原来,我链接到了旧版本的实用程序库所在的错误文件(错误文件夹)。

于 2014-10-12T15:09:25.050 回答
0

我不知道为什么日志提到liblibutils,但是如果您希望它在典型的 Android 系统上运行,则应该更改您的代码。原因是它libutils.so是标准发行版的一部分,并且位于/system/lib. 对于loadLibrary()本机加载程序,/system/lib优先于特定于应用程序的 lib 目录,并且您的libutils.so从来没有机会加载。因此,UnsatisfiedLinkError是不可避免的。

为您的 utils 库使用更独特的名称,加载器会很高兴。

于 2014-10-11T13:18:01.130 回答