VS-Android产生"错误"链接到共享库时的名称

时间:2014-10-11 08:54:40

标签: java android c++ android-ndk vs-android

我正在使用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

我很困惑。当桥库试图使用utils库时,额外的“lib”会在哪里出现? utils库确实成功加载,如果我没有链接utils库并注释掉对utils库中所有东西的所有调用,那么桥库也是如此。

到目前为止,我已尝试将目标名称更改为“utils”而不是“libutils”,但它不起作用。我也尝试使用lib $(TargetName)作为soname设置,但它也不起作用。

2 个答案:

答案 0 :(得分:0)

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

为您的utils库使用一个更独特的名称,装载程序很高兴。

答案 1 :(得分:0)

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