使用第三方库出现找不到so库UnsatisfiedLinkError错误的原因以及解决方案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用第三方库出现找不到so库UnsatisfiedLinkError错误的原因以及解决方案相关的知识,希望对你有一定的参考价值。

参考技术A

在开发项目的时候我们免不了使用一些第三方的库来进行快速开发,有些第三方库只是简单的一个 jar 包,但是有些使用了 jni 开发,因此会包含 so 库文件,这个时候如果不消息我们就会遇到一个错误: java.lang.UnsatisfiedLinkError ;

最近经常遇到有开发者在问使用环信 sdk 的时候出现这个错误;这里分享下问题原因以及解决方案;

这里需要先解释一下相关信息
hyphenatechatsdk 提供的指令集类型仅提供 armeabi-v7a 、 arm64-v8a 、 x86 三种;
armeabi 和 armeabi-v7a 是相近似的指令集, v7a 是增强型指令集,运行速度,效率均有所提高,他们都是 32 位指令,并且兼容; arm64-v8a 对应 arm64 位指令集;
arm64 位策略和 intel IA32 不一样: intel64 位指令是兼容 intel32 位指令, intel32 位指令编译的程序可以直接在 intel64 位机器上运行;但是 arm 不是, arm64 位和 arm32 位是彼此独立的指令系统,不兼容; arm 这样设计的原因是因为运行在嵌入式上,设计指标更趋向于效率,和耗电考量;实际上 arm64 位芯片上同时包含着 arm64 指令处理器和 arm32 位指令处理器,只不过两个处理器彼此独立;

影响链接的限制条件: armeabi 实际上可以运行在 arm64 位机器上,只不过 Google 增加了限制条件:

所以如果大家再遇到这样的问题,可以先根据以上信息排查下,无非就是某个库的 so 文件放多了,或者某个 so 库的文件放少了,或者是 jar 包和 so 不匹配了,这些只要细心看下 ide 的日志提示,很容易就解决,希望此篇文章能帮大家解决问题,谢谢!

文笔有限,如果问题,欢迎指正 _ ~

linux找不到动态链接库 .so文件的解决方法

如果使用自己手动生成的动态链接库.so文件,但是这个.so文件,没有加入库文件搜索路劲中,程序运行时可能会出现找不到动态链接库的情形。

可以通过ldd命名来查看可执行文件依赖的动态链接库,如下(其中D为可执行程序):

 其中的libjson_linux-gcc-4.6_libmt.so cannot found。

解决这个问题:

 (1)在系统中查找这个文件(当然要保证系统中已经有这个.so文件,只是查找路径没有设置正确而已):

  sudo find / -name libjson_linux-gcc-4.6_libmt.so

  结果:/home/liu/Desktop/jsoncpp-src-0.5.0/libs/linux-gcc-4.6/libjson_linux-gcc-4.6_libmt.so

(2)将.so文件路径的目录添加到/etc/ld.so.conf

   sudo vim /etc/ld.so.conf

  文件末尾新添加一行,/home/liu/Desktop/jsoncpp-src-0.5.0/libs/linux-gcc-4.6

(3)使得修改生效

  sudo /sbin/ldconfig

 

这样就不会有那个找不对.so文件的错误啦。

参考:http://www.blogjava.net/zhyiwww/archive/2007/12/14/167827.html

以上是关于使用第三方库出现找不到so库UnsatisfiedLinkError错误的原因以及解决方案的主要内容,如果未能解决你的问题,请参考以下文章

在使用jni调用so库时出现的找不到文件是怎么回事?

linux找不到动态链接库 .so文件的解决方法

AAR 生成方法

Linux下找不到so文件的解决办法

ld 链接器找不到 so 库

iOSCocoaPods 中找不到第三方库