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

相关文章
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
385 2
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
|
存储 XML Java
Android 文件数据储存之内部储存 + 外部储存
简介:本文详细介绍了Android内部存储与外部存储的使用方法及核心原理。内部存储位于手机内存中,默认私有,适合存储SharedPreferences、SQLite数据库等重要数据,应用卸载后数据会被清除。外部存储包括公共文件和私有文件,支持SD卡或内部不可移除存储,需申请权限访问。文章通过代码示例展示了如何保存、读取、追加、删除文件以及将图片保存到系统相册的操作,帮助开发者理解存储机制并实现相关功能。
2984 2
|
Java Android开发
Android studio中build.gradle文件简单介绍
本文解析了Android项目中build.gradle文件的作用,包括jcenter仓库配置、模块类型定义、包名设置及依赖管理,涵盖本地、库和远程依赖的区别。
1070 19
|
存储 智能硬件
CPU的定义与功能与架构
CPU(中央处理器)是计算机的核心部件,负责执行程序指令、控制数据传输和进行运算。它能处理算术与逻辑运算,并协调其他硬件协同工作。x86架构源于英特尔,适用于PC和服务器,采用复杂指令集;ARM架构则由Acorn等公司开发,广泛用于移动设备和嵌入式系统,采用精简指令集,功耗低且能效比高。
1772 5
|
Android开发 开发者 Kotlin
Android实战经验之Kotlin中快速实现MVI架构
MVI架构通过单向数据流和不可变状态,提供了一种清晰、可预测的状态管理方式。在Kotlin中实现MVI架构,不仅提高了代码的可维护性和可测试性,还能更好地应对复杂的UI交互和状态管理。通过本文的介绍,希望开发者能够掌握MVI架构的核心思想,并在实际项目中灵活应用。
672 8
|
移动开发 安全 Java
Android历史版本与APK文件结构
通过以上内容,您可以全面了解Android的历史版本及其主要特性,同时掌握APK文件的结构和各部分的作用。这些知识对于理解Android应用的开发和发布过程非常重要,也有助于在实际开发中进行高效的应用管理和优化。希望这些内容对您的学习和工作有所帮助。
1743 83
|
开发工具 Android开发 iOS开发
Android与iOS生态差异深度剖析:技术架构、开发体验与市场影响####
本文旨在深入探讨Android与iOS两大移动操作系统在技术架构、开发环境及市场表现上的核心差异,为开发者和技术爱好者提供全面的视角。通过对比分析,揭示两者如何塑造了当今多样化的移动应用生态,并对未来发展趋势进行了展望。 ####
|
网络协议 Linux Android开发
深入探索Android系统架构与性能优化
本文旨在为读者提供一个全面的视角,以理解Android系统的架构及其关键组件。我们将探讨Android的发展历程、核心特性以及如何通过有效的策略来提升应用的性能和用户体验。本文不包含常规的技术细节,而是聚焦于系统架构层面的深入分析,以及针对开发者的实际优化建议。
519 21
|
存储 Linux API
深入探索Android系统架构:从内核到应用层的全面解析
本文旨在为读者提供一份详尽的Android系统架构分析,从底层的Linux内核到顶层的应用程序框架。我们将探讨Android系统的模块化设计、各层之间的交互机制以及它们如何共同协作以支持丰富多样的应用生态。通过本篇文章,开发者和爱好者可以更深入理解Android平台的工作原理,从而优化开发流程和提升应用性能。
|
安全 Android开发 iOS开发
深入探索iOS与Android系统架构差异及其对开发者的影响
本文旨在通过对比分析iOS和Android两大移动操作系统的系统架构,探讨它们在设计理念、技术实现及开发者生态方面的差异。不同于常规摘要仅概述内容要点,本摘要将简要触及核心议题,为读者提供对两大平台架构特点的宏观理解,铺垫

热门文章

最新文章