2

我有一个使用 libjpeg-turbo 的 Android 应用程序的本机库。我正在使用 NDK 编译库和 libjpeg-turbo。一切似乎都可以正常编译和安装(我在 /data/data/com.company.app/lib 中看到手机上的所有 .so 文件),我正在打电话

System.loadLibrary("jpeg");
System.loadLibrary("zmq");
System.loadLibrary("MySuperLib");
System.loadLibrary("jnilibwrapper");

E/AndroidRuntime(8186):java.lang.UnsatisfiedLinkError:dlopen 失败:无法加载“libjnilibrapper.so”所需的库“libMySuperLib.so”;由于无法加载“libMySuperLib.so”所需的库“libjpeg.so.62”;由找不到库“libjpeg.so.62”引起

我找到了这个解决方法,像这样创建lib的符号链接让我通过了这个错误

root@klteatt:/data/data/com.company.app/lib # ln -s libjpeg.so libjpeg.so.62

但这当然不是解决方案。

我们哪里会出错?为什么它特别想要 libjpeg.so.62?

4

1 回答 1

1

该问题是由在编译时MySuperLib与的版本化 soname 链接引起的。libjpeg-turboAndroid 的 JNI 运行时当前不支持版本化的动态库,这就是它无法 "find" 的原因libjpeg.so,因为它只需要一个未版本化的 soname。

在没有版本信息的情况下进行编译的一种可能方法是libjpeg-turbo修改传递给. 通过将变量更改为包含'标志,将尽量避免创建嵌入了版本信息的库。创建未版本化的共享库通常是一个糟糕的主意,但由于此时您实际上无法在 Android 上“安装”共享库,因此这是相当安全的,因为您的库是唯一会使用未版本化的.libjpeg-turboMakefile.am *LDFLAGSlibtool*LDFLAGSlibtool-avoid-versionlibtoolMySuperLiblibjpeg.so

libjpeg-turbo以下是's的补丁示例Makefile.am,它将生成未版本化的 libjpeg.so:

--- Makefile.am 2014-08-28 09:57:37.000000000 -0700
+++ Makefile.am.patched 2014-08-28 09:57:20.000000000 -0700
@@ -1,5 +1,5 @@
 lib_LTLIBRARIES = libjpeg.la
-libjpeg_la_LDFLAGS = -version-info ${LIBTOOL_CURRENT}:${SO_MINOR_VERSION}:${SO_AGE} -no-undefined
+libjpeg_la_LDFLAGS = -avoid-version -no-undefined
 include_HEADERS = jerror.h jmorecfg.h jpeglib.h

 if WITH_TURBOJPEG

这是 libtool 的链接模式手册的链接,以获取更多选项和信息:http ://www.gnu.org/software/libtool/manual/html_node/Link-mode.html

于 2014-09-08T20:27:16.260 回答