您的位置:首页 > 移动开发 > Android开发

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

2017-02-03 17:19 1046 查看
最近手上的一个项目,用了很多第三方库,也有一些调用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位的平板。

当然了具体深入的意义,请读者自行谷歌。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android
相关文章推荐