地图和语音.so库的问题

前言

项目里面(接收了别人的代码)遇到过两次so库的问题了,第一次是高德地图,在华为P9(今年出的机子上面报错,应该是处理器[架构abi]都换成64位了),一直没有找到原因,后来使用官网的最新2D地图(全换了,都是泪),没有意识到主要问题。昨天又遇到录制语音转码(libmp3lame.so)的时候,在小米5的机子上面崩溃。

报的错误–两个都是这个引起的

java.lang.UnsatisfiedLinkError: No implementation found for void com.pocketdigi.utils.FLameUtils.initEncoder(int, int, int, int, int) 
(tried Java_com_pocketdigi_utils_FLameUtils_initEncoder and Java_com_pocketdigi_utils_FLameUtils_initEncoder__IIIII)
java.lang.UnsatisfiedLinkError: dlopen failed: "/data/app/com.day.likecrm-2/lib/arm64/libmp3lame.so" is 32-bit instead of 64-bit

原因

使用推送的时候加了.so文件,需要在jniLibs里面建文件夹
这里写图片描述
手机会优先去找与处理器一样的文件夹下的.so文件(处理器64位,会去找,没有找到就使用32位的)

JAVA加载JNI库(so文件)的规则:
如果APP需要加载的所有so都是32bit,则使用32bit方式加载so库;如果APP需要加载的so库中只要有一个so是64bit的,则必须以64bit方式加载so库;不能同时加载32bit和64bit的so库。—原文链接

解决的方法

1.删除处理对应的文件夹

我的项目中删除了arm64-v8a就可以了,但是这样做,会把其他第三方的.so也会删除,所以没有选择这种(其实第二种本质也差不多)


 2.在build.gradle中加配置

解决方案也很简单,在build.gradle中加上,这句话的意思大概就是,告诉程序加载如下的so文件

defaultConfig {
……

ndk {
    abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}

}
就相当于让程序只去上面的文件夹中找(个人觉得和删除64的文件夹差不多。。。)
2.2的as这样就可以了,2.2一下的还要在gradle.properties文件中加上

android.useDeprecatedNdk=true

因为gradle的配置中,并不知道是否要做操作系统的兼容

个人理解: android64位机子兼容32位.so库文件,所以都是用32的没有问题,如上面说的要不都是用32,要不都是用64,不能混合使用。(也避免了其他的由于32或64的原因.so出错)

菜鸟记录自己遇到的问题,希望也能帮到遇到同样问题的朋友!

我解决这个问题的主要参考文章

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值