我正在编写一个android项目,它有Native层帮助java层,并且我被困在一个地方,当我尝试做一个System.loadLibrary时,它抛出错误,它无法链接它。
我使用Target特定的NDK来构建本机层,然后使用ant编译并创建apk。
在设备上运行时出现以下错误。
无法dlopen(libsomething.so)无法加载库:link_image [1995]:无法链接libsomething.so
该库被捆绑到apk中,并正确解压缩。如果我尝试手动删除库然后运行它,它实际上会抛出找不到的库。所以它能够找到这个库,但它会抛出这个错误,我无法找出为什么会出现这个错误。
请帮帮我。
答案 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。