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

相关文章
|
3月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
|
5月前
|
Java Android开发 C++
Android Studio JNI 使用模板:c/cpp源文件的集成编译,快速上手
本文提供了一个Android Studio中JNI使用的模板,包括创建C/C++源文件、编辑CMakeLists.txt、编写JNI接口代码、配置build.gradle以及编译生成.so库的详细步骤,以帮助开发者快速上手Android平台的JNI开发和编译过程。
394 1
|
2月前
|
存储 人工智能 编译器
【AI系统】CPU 指令集架构
本文介绍了指令集架构(ISA)的基本概念,探讨了CISC与RISC两种主要的指令集架构设计思路,分析了它们的优缺点及应用场景。文章还简述了ISA的历史发展,包括x86、ARM、MIPS、Alpha和RISC-V等常见架构的特点。最后,文章讨论了CPU的并行处理架构,如SISD、SIMD、MISD、MIMD和SIMT,并概述了这些架构在服务器、PC及嵌入式领域的应用情况。
94 4
|
6月前
|
Java Android开发
Android面试题经典之Glide取消加载以及线程池优化
Glide通过生命周期管理在`onStop`时暂停请求,`onDestroy`时取消请求,减少资源浪费。在`EngineJob`和`DecodeJob`中使用`cancel`方法标记任务并中断数据获取。当网络请求被取消时,`HttpUrlFetcher`的`cancel`方法设置标志,之后的数据获取会返回`null`,中断加载流程。Glide还使用定制的线程池,如AnimationExecutor、diskCacheExecutor、sourceExecutor和newUnlimitedSourceExecutor,其中某些禁止网络访问,并根据CPU核心数动态调整线程数。
177 2
|
3月前
|
Android开发 UED
Android 中加载 Gif 动画
【10月更文挑战第20天】加载 Gif 动画是 Android 开发中的一项重要技能。通过使用第三方库或自定义实现,可以方便地在应用中展示生动的 Gif 动画。在实际应用中,需要根据具体情况进行合理选择和优化,以确保用户体验和性能的平衡。可以通过不断的实践和探索,进一步掌握在 Android 中加载 Gif 动画的技巧和方法,为开发高质量的 Android 应用提供支持。
|
4月前
|
存储 缓存 开发者
CPU的架构涵盖哪些方面
CPU(中央处理单元)的架构指的是CPU的设计和组织方式,包括其内部结构、数据通路、指令集、寄存器配置、存储器管理和输入输出等一系列设计原则和技术的综合体现。
144 1
|
3月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
190 0
|
5月前
|
开发工具 git 索引
repo sync 更新源码 android-12.0.0_r34, fatal: 不能重置索引文件至版本 ‘v2.27^0‘。
本文描述了在更新AOSP 12源码时遇到的repo同步错误,并提供了通过手动git pull更新repo工具来解决这一问题的方法。
195 1
|
4月前
|
存储 缓存 开发者
CPU的架构指什么?
CPU(中央处理单元)的架构指的是CPU的设计和组织方式,包括其内部结构、数据通路、指令集、寄存器配置、存储器管理和输入输出等一系列设计原则和技术的综合体现。
367 0
|
5月前
|
Android开发 开发者
Android、Flutter为不同的CPU架构包打包APK(v7a、v8a、x86)
Android、Flutter为不同的CPU架构包打包APK(v7a、v8a、x86)
389 1

热门文章

最新文章

下一篇
开通oss服务