Android本机链接器特别需要名为libjpeg.so.62的文件

时间:2014-08-20 02:22:44

标签: java android android-ndk loadlibrary libjpeg-turbo

我有一个使用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?

1 个答案:

答案 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