关于android某些手机java.lang.UnsatisfiedLinkError: No implementation found for ......的问题

来源:互联网 发布:淘宝卖什么好呢 编辑:程序博客网 时间:2024/05/20 07:38

最近手上的一个项目,用了很多第三方库,也有一些调用C++库的内容。

过程当中遇到了java.lang.UnsatisfiedLinkError这样的问题。之前没有遇到过,而且是部分手机的问题,耗费了一些时间来查询和解决。

多余的话不说了,以下是原因解决方法


原因:

报这样的错,百度一下,都是说是不能加载底层方法导致的。但是开发者会说,底层包是有这样的方法的。

到底是什么原因导致的呢,不妨我们这样来做:打个apk包,把后缀改成zip或其他,打开这个压缩文件,找到lib文件夹,(如图)

进入文件夹可以看到以下文件夹(如图)

(不一定和我完全一致)。

检查这些文件夹下的文件是否一致(每个文件夹下的文件数量和文件名称应该是一样的),对比会发现文件肯定或多或少,这就是UnsatisfiedLinkError的原因。


为什么有的手机可以有的手机不可以呢?因为手机cup的芯片不一样。

如果是arm64-v8a的芯片,android就加载arm64-v8a文件夹下的so文件,以此类推。


解决方法:

所以这个地方jniLibs下的文件夹下一定要保持一致,不然编译apk包之后各个型号文件夹下的文件会不一致(如图),

就拿我目前这个项目来说吧,引用了太多的第三方,整个项目包括第三方的module,所有的jniLibs都要保持一致

(这就是我之前报错的原因,这些文件夹没有保持一致)最终我做了一些删减,只保留了最少的也就是armeabi和armeabi-v7a两个文件夹,问题解决。高版本的cup芯片会向下兼容。

当然了,有些开发者会说需求需要其他版本的包怎么办。那就让第三方so文件提供者,编译出对应的版本,从而解决问题。


最后,说一些这些文件夹是什么含义。

这些都是android设备的cup类型:
armeabiv-v7a: 第7代及以上的ARM处理器;
arm64-v8a: 第8代、64位ARM处理器;
armeabi: 第5代、第6代的ARM处理器;
mips:一种RISC处理器。
mips64:64位的。
x86: 平板;

x86_64:64位的平板。


当然了具体深入的意义,请读者自行谷歌。





1 0
原创粉丝点击