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

简介: 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文件夹中加载,如图:

20190117210840124.png


还要在app的build.gradle文件中加上如下代码:

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


2.在main文件夹jniLibs文件夹中加载 ,没有就自己创建,这里是系统默认会去调用so文件的地方,如图:

20190117211212731.png

相关文章
|
5天前
|
监控 安全 API
orhanobut/logger - 强大的Android日志打印库
orhanobut/logger - 强大的Android日志打印库
15 1
|
6天前
|
Android开发
Android studio 2021.3.1不生成iml文件
Android studio 2021.3.1不生成iml文件
23 5
|
6天前
|
Android开发
Android stdio 无法新建或打开AIDL文件(解决方法)
Android stdio 无法新建或打开AIDL文件(解决方法)
17 0
|
6天前
|
Android开发
android string.xml文件中的整型和string型代替
android string.xml文件中的整型和string型代替
11 0
|
6天前
|
Android开发 异构计算
高通android设备themal读取cpu温度
高通android设备themal读取cpu温度
14 0
|
6天前
|
Android开发
android 12 U盘 /mnt/media_rw 下读取文件异常 没有权限
android 12 U盘 /mnt/media_rw 下读取文件异常 没有权限
42 0
|
6天前
|
XML Android开发 数据安全/隐私保护
android 11后文件读写访问权限申请
android 11后文件读写访问权限申请
18 0
|
21小时前
|
消息中间件 设计模式 开发者
构建高效微服务架构:后端开发的现代实践
【5月更文挑战第21天】 在快速迭代的软件开发领域,微服务架构已经成为支持复杂应用和持续交付的关键设计模式。本文将深入探索微服务的核心原则、技术栈选择以及它们如何影响现代后端开发流程。通过分析微服务的设计理念和最佳实践,我们将了解如何构建一个既灵活又高效的系统,以应对不断变化的业务需求和技术挑战。
|
1天前
|
消息中间件 监控 数据管理
构建高效微服务架构:从理论到实践
【5月更文挑战第21天】 在现代软件开发的浪潮中,微服务架构已成为企业追求敏捷开发、持续交付和系统弹性的关键解决方案。本文深入探讨了构建一个高效微服务架构的核心原则与实践策略,旨在为开发者提供一个清晰的指南,帮助他们在设计分布式系统时做出明智的决策。我们将从微服务的基本概念出发,逐步展开对关键组件、通信机制和数据管理的讨论,并分享实际案例分析以验证理论的有效性。
|
1天前
|
缓存 负载均衡 数据库
构建高性能微服务架构:策略与实践
【5月更文挑战第21天】 随着现代业务需求的不断演进,传统的单体应用架构已难以满足快速迭代和灵活部署的要求。微服务架构应运而生,以其服务的细粒度、独立性和弹性优势成为企业转型的重要选择。本文将深入探讨如何构建一个高性能的微服务系统,从服务划分原则到性能优化技巧,旨在为开发者提供一套系统的微服务性能提升方案。文章将重点讨论在设计高并发、低延迟的微服务时需要考虑的关键因素,包括服务治理、缓存策略、负载均衡以及异步通信机制等。