我有一个使用libjpeg-turbo的Android应用程序的本机库。我正在使用NDK编译库和libjpeg-turbo。这一切似乎都在编译和安装正常(我在手机上看到所有.so文件/data/data/com.company.app/lib)我正在调用
System.loadLibrary("jpeg");
System.loadLibrary("zmq");
System.loadLibrary("MySuperLib");
System.loadLibrary("jnilibwrapper");
E / AndroidRuntime(8186):java.lang.UnsatisfiedLinkError:dlopen失败: 无法加载“libjnilibrapper.so”所需的库“libMySuperLib.so”; 导致无法加载所需的库“libjpeg.so.62” “libMySuperLib.so”;由库“libjpeg.so.62”未找到引起的
我发现这个解决方法,制作一个lib的符号链接就这样让我传递了这个错误
root @ klteatt:/data/data/com.company.app/lib#ln -s libjpeg.so libjpeg.so.62
但当然这不是解决方案。
我们哪里可能出错?为什么要特别想要libjpeg.so.62?
答案 0 :(得分:1)
问题是由MySuperLib
在编译时与libjpeg-turbo
版本化的soname链接引起的。 Android的JNI运行时目前不支持版本化的动态库,这就是为什么它不能“找到”libjpeg.so
,因为它只需要一个无版本的soname。
在没有版本控制信息的情况下编译libjpeg-turbo
的一种可能方法是修改libjpeg-turbo
的{{1}} Makefile.am
变量,该变量将传递给*LDFLAGS
。通过将libtool
变量更改为包含*LDFLAGS
的{{1}}标记,libtool
将尝试避免创建嵌入了版本信息的库。创建无版本的共享库通常是一个可怕的想法,但由于此时您无法在Android上实际“安装”共享库,因此它是相当安全的,因为您的-avoid-version
库是唯一的一个将使用未版本化的libtool
。
以下是MySuperLib
的{{1}}补丁的示例,该补丁将生成无版本的libjpeg.so:
libjpeg.so
以下是libtool链接模式手册的链接,以获取更多选项和信息:http://www.gnu.org/software/libtool/manual/html_node/Link-mode.html