Android——java.lang.UnsatisfiedLinkError错误解决
最近在项目新开发过程中,新集成了一个开源组件,然而集成之后运行时出现了崩溃。崩溃日志如下:
java.lang.UnsatisfiedLinkError: No implementation found for boolean cn.bmob.v3.helper.BmobNative.init(android.content.Context, java.lang.String) (tried Java_cn_bmob_v3_helper_BmobNative_init and Java_cn_bmob_v3_helper_BmobNative_init__Landroid_content_Context_2Ljava_lang_String_2)
at cn.bmob.v3.helper.BmobNative.init(Native Method)
at cn.bmob.v3.BmobWrapper.<init>(BmobWrapper.java:48)
at cn.bmob.v3.BmobWrapper.V(BmobWrapper.java:35)
at cn.bmob.v3.BmobWrapper.Code(BmobWrapper.java:28)
at cn.bmob.v3.Bmob.initialize(Bmob.java:70)
参考https://blog.****.net/xiaxiayige/article/details/68925669
在android开发中,通常引用了一些第三方的sdk的so库之后,不同机型之间就会发生这样一个错误,Java.lang.UnsatisfiedLinkError
这是由于程序运行的时候未获取到争取的so库包产生的一个错误。
随机解压缩apk包,查看so库的类型,果然除了armeabi之外还包括了其他种类,而在此之前考虑到apk大小瘦身许多so只集成了armeabi类型的:
新集成的开源组件是
compile 'com.facebook.fresco:fresco:1.5.0'
本来最开始考虑的解决方案是下载其jar包,集成armeabi的so就好了,后面考虑这样做以后要是再集成新的组件也会出现同样的问题,解决其来非常繁琐。
后面查找资料发现,可以对apk需要的cpu架构进行过滤,在app的build.gradle 下的defaultConfig里面添加过滤即可:
ndk {
abiFilters 'armeabi' //兼容x86cpu架构 需要什么样的架构就添加什么样的
}
这样再次进行编译会发现apk体积也减少了,而且崩溃问题也即决了。
对于so库的集成到底需要集成几种架构类型的,个人是参考了微信的做法只集成了armeabi一个类型,既可以减少apk大小,兼容性也不错。