最近项目中用到了串口通信,以前对这块也不了解,刚开始以为啥卡这部分是手机的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文件的地方,如图: