Android引入.so文件的正确姿势以及加载指定CPU架构的so库(android is 32-bit instead of 64-bit)

  最近项目中用到了串口通信,以前对这块也不了解,刚开始以为啥卡这部分是手机的NFC实现的,跑去研究了一下NFC,结果完全找错了方向,尴尬。然后赶紧回头找找串口通信的资料,结果找了好多资料和demo,demo完全跑不起来,后来去Android群里找群友问了一下才知道原因,这里感谢一下群里热心的群友们。
  首先先要明确的是你的设备里面所涉及的串口通信是厂家定制的还是通用的,厂家通用的会提供demo给你,因为里面串口协议这些可能更改过,生成的so文件无法兼容,如果是通用的就直接网上找了,这个就简单了。然后问题又来了,我这里厂家所提供的demo在三台设备上测试可以跑起来(我这里有三台设备,cpu架构不同),于是我兴高采烈的集成到了项目里面,然后bug就出来了,厂家提供的demo里面so文件只有32位的,没有提供64位,结果我集成到项目里面就报了如下错误:
UnsatisfiedLinkError: dlopen "/data/data//lib/arm64/libxxx.so is 32-bit instead of 64-bit
这完全不科学呀,同样的代码呀,怎么会错呢?于是我开始百度了起来,,走了不少弯路,终于想到了我项目里面集成极光推送和百度地图,里面使用到了64位的文件夹,所以加载串口so文件的时候也会去64位的文件加载,于是想到通过设置只加载32位so文件来解决这个问题,因为64位是兼容32位的。这里记录如下:
  首先在项目app 的build.gradle中添加支持的cpu架构,设置只加载32为的so文件,如下:

        ndk {
            // 设置支持的SO库架构
            abiFilters "armeabi", "armeabi-v7a", "x86"
        }

添加了这个后项目会报错,因为gradle的配置中,并不知道是否要做操作系统的兼容,这时只要在项目的gradle.properties文件中加上 android.useDeprecatedNdk=true 即可。

注:设置后一定要删除app的build目录或者clean之后重新构建,我这里因为缓存的原因,一直提示还是在加载的64位so文件,坑了一笔。
错误就记录到这里了。
这里提到了加在so文件就顺便说一下加载so文件的方式。
一、加载so文件的两种方式:
1.在主项目的libs文件夹中加载,如图:
在这里插入图片描述
还要在app的build.gradle文件中加上如下代码:

sourceSets {
        main {
            //jni库的调用会到资源文件夹下libs里面找so文件
            jniLibs.srcDirs = ['libs']
        }
    }

2.在main文件夹jniLibs文件夹中加载 ,没有就自己创建,这里是系统默认会去调用so文件的地方,如图:
在这里插入图片描述
转载自:https://blog.csdn.net/u014727709/article/details/86531407
欢迎start,欢迎评论,欢迎指正

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想你依然心痛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值