无法dlopen(libsomething.so)无法加载库:link_image [1995]:无法链接libsomething.so

时间:2011-01-18 11:48:38

标签: android android-ndk

我正在编写一个android项目,它有Native层帮助java层,并且我被困在一个地方,当我尝试做一个System.loadLibrary时,它抛出错误,它无法链接它。

我使用Target特定的NDK来构建本机层,然后使用ant编译并创建apk。

在设备上运行时出现以下错误。

无法dlopen(libsomething.so)无法加载库:link_image [1995]:无法链接libsomething.so

该库被捆绑到apk中,并正确解压缩。如果我尝试手动删除库然后运行它,它实际上会抛出找不到的库。所以它能够找到这个库,但它会抛出这个错误,我无法找出为什么会出现这个错误。

请帮帮我。

4 个答案:

答案 0 :(得分:11)

首先找到.so文件的位置。然后可以尝试:

以下示例假定共享库的位置为: /data/data/my.package/lib/libmysharedlibrary.so

try {
    //System.loadLibrary("mysharedlibrary");
    System.load("/data/data/my.package/lib/libmysharedlibrary.so");
} catch (UnsatisfiedLinkError use) {
    Log.e("JNI", "WARNING: Could not load libmysharedlibrary.so");
}

答案 1 :(得分:10)

我陷入了同样的问题。最后我从这篇文章得到了答案: http://mpigulski.blogspot.com/2010/09/debugging-dlopen-unsatisfiedlinkerror.html

使用

arm-linux-androideabi-readelf.exe  -d libs/armeabi/libmy.so

然后找到一个错误名称的NEEDED共享库。

答案 2 :(得分:4)

有时(大部分时间!)你的库需要@musefan提到的其他库。你可以列出他们做readelf -d libs / armeabi / libmy.so。但是这里有一个问题:因为Android没有任何控制库版本的机制(就像在普通的Linux中你有liblzma.so.1,liblzma.so.2等)你需要的库是(liblzma.so)但是没有您的图书馆导入的某些符号。这是现场的例子:你使用 android::ZipFileRO::getEntryInfo 函数位于libutils.so中。所有版本的库都具有此功能,但该功能的PROTOTYPE已于2010年底更改,因此您为4.0.4 NDK构建的应用程序将无法在具有相同症状的FroYo设备或GB设备上运行:dlopen无法加载库。以下是如何检测此类情况的方法:您需要PC上的内容os / system / lib文件夹。如果您是开发或构建的第三方应用程序(如果您是平台开发人员),则可能是从您的设备转储的文件夹。然后发出命令 arm-linux-gnueabi-ld -rpath-link /path/to/system/lib ./lib_mylib.so 如果出现错误,你会看到一些谎言 lib_mylib.so: undefined reference to android :: ZipFileRO :: getEntryInfo(void *,int *,long *,long *,long *,long *,long *)const'`

答案 3 :(得分:3)

使用调用 System.load(String pathName)方法并只传递libraryName而不是完整路径到库时,也可以找到此错误。

解决方案:使用 System.loadLibrary(String libName)方法,现在传递libraryName。