Android JNI SO库和对应的CPU架构详解

Android JNI SO库和对应的CPU架构详解

文章目录

  • Android JNI SO库和对应的CPU架构详解
    • 一、前言
    • 二、Android CPU架构
      • 1、Android系统支持的CPU架构
      • 2、如查查看手机的CPU架构
        • (1)Android13 大屏AML厂商的cpu信息:
        • (2)电脑Android Studio模拟器上的cpu信息:
        • (3)Android Studio生成不同类型so库
        • (4)Android Studio加载so库
          • 加载别人提供的so库,需要在app同级目录定义jniLibs目录放置对应类型的文件夹和so库。
          • 同时要在app下的build.gradle文件写入加载的jni目录代码:
    • 三、其他
      • 1、在电脑模拟器x86架构中,JniLibs放置其他类型文件和so夹,未放置x86文件和so,报错:
      • 2、Android 版本和对应发布时间
      • 3、如果正式版的应用,使用debug版的so 会有问题吗?或者debug版应用使用正式版so会有问题吗?
      • 4、使用so库的架构小结

一、前言

Android JNI生成的so库有很多不同架构类型,比如:armeabi、armeabi-v7a、arm64-v8a、x86;

Android 系统不同的cpu架构就要使用不同类型的so库,如果不考虑内存大小,放全套也是没有问题的;

但是实际使用中,很多时候只会放一套或者两套就可以了。

本文介绍Android cpu不同架构的so库区别,以及如何查看当前系统是什么cpu架构,

以便在实际场景中做出最优选择。

二、Android CPU架构

1、Android系统支持的CPU架构

armeabi:第五代、第六代ARM处理器,使用软件浮点运算,很古老的手机是这架构, 出现在2000年左右 。

armeabi-v7a:第七代ARM处理器,使用硬件浮点运算,2018年以前手机主流架构, 2007年开始出现 。

arm64-v8a:第八代64位处理器,当前主流架构, 2014年左右出现。

x86/x86-64:Intel处理器,Android模拟器用得比较多。 X86_64与X64都是讲的同一个东西 。

每一种CPU架构对应一个ABI,ABI定义了二进制文件(比如SO)如何运行在相应的系统平台。

不同的CPU架构平台需要不同的so才能正常执行相应的逻辑代码。

2、如查查看手机的CPU架构

通过prop属性ro.product.cpu.abi就可以查看当前cpu的架构类型。

adb shell   getprop ro.product.cpu.abi

Android9或者更新的版本 手机和平板:arm64-v8a

AndroidStudio自带模拟器: x86

(1)Android13 大屏AML厂商的cpu信息:
130|console:/ # getprop | grep cpu
[ro.product.cpu.abi]: [arm64-v8a]
[ro.product.cpu.abilist]: [arm64-v8a,armeabi-v7a,armeabi]
[ro.product.cpu.abilist32]: [armeabi-v7a,armeabi]
[ro.product.cpu.abilist64]: [arm64-v8a]
...
[ro.system.product.cpu.abilist64]: [arm64-v8a]
console:/ # 
(2)电脑Android Studio模拟器上的cpu信息:
C:\Users\As520>adb shell
generic_x86:/ $ getprop | grep cpu
[ro.product.cpu.abi]: [x86]
[ro.product.cpu.abilist]: [x86,armeabi-v7a,armeabi]
[ro.product.cpu.abilist32]: [x86,armeabi-v7a,armeabi]
[ro.product.cpu.abilist64]: []
generic_x86:/ $
C:\Users\As520>

电脑是window10 64位的,处理器x64,这里Android模拟器显示x86,

估计现在新的模拟器都是x86,可能没有x86-64 的说法的了,也可能是Intel做了合并。

(3)Android Studio生成不同类型so库

生成不同类型的so库,需要在app同级目录的build.gradle定义abiFilters和对应的so类型。

在这里插入图片描述

1、使用ndk或者cmake里面的 abiFilters定义生成不同so类型 都是可以的;

2、如果不写是默认生成全部四个类型的so集成到apk中,Studio Analyze可以查看apk文件里面的lib包;

3、如果只声明一个so类型,就会只集成一种so到apk中,减少了内存;

4、默认是生成的debug版本so,如果要生成release版本的so,点击右边build里面的assemble就会生成正式版的;

(4)Android Studio加载so库
加载别人提供的so库,需要在app同级目录定义jniLibs目录放置对应类型的文件夹和so库。

如下图所示:

在这里插入图片描述

同时要在app下的build.gradle文件写入加载的jni目录代码:
        sourceSets {
            main {
                jniLibs.srcDirs = ['jniLibs']
            }
        }

这里的jni目录名称:"jniLibs"是可以随便改的,只要和创建的目录对应就行,

但是x86、arm64-v8a 这些类型文件夹的名称是固定的。

值得注意的是,使用别人提供的so文件,还要知道定义so对应的native方法的包名和类型,否则无法形成映射关系。

三、其他

1、在电脑模拟器x86架构中,JniLibs放置其他类型文件和so夹,未放置x86文件和so,报错:

java.lang.UnsatisfiedLinkError: dlopen failed: library "libnative-lib.so" not found

在真机中,JniLibs放置其他类型文件和so夹,未放置arm64-v8a文件和so,同样是报上面的错误。

Android Studio 环境换各种类型的so文件夹都报错情况:

Unable to determine application id: com.android.tools.idea.run.ApkProvisionException: The currently selected variant "debug" uses split APKs, but none of the 1 split apks are compatible with the current device with ABIs "x86, armeabi-v7a, armeabi".

ApkProvisionException 表示 APK 供应异常,这里指的是在尝试为当前选定的 “debug” 变体生成 APK 时出现问题。

Studio 模拟器重启就好了。

2、Android 版本和对应发布时间

Android 1.0: 发布于2008年9月23日。
Android 1.1 (Petit Four): 发布于2009年2月9日。
Android 1.5 (Cupcake): 发布于2009年4月27日。
Android 1.6 (Donut): 发布于2009年9月15日。
Android 2.0-2.1 (Eclair): 发布于2009年10月26日。
Android 2.2 (Froyo): 发布于2010年5月20日。
Android 2.3 (Gingerbread): 发布于2010年12月6日。
Android 3.0-3.2 (Honeycomb): 发布于2011年2月22日。
Android 4.0 (Ice Cream Sandwich): 发布于2011年10月18日。
Android 4.1-4.3 (Jelly Bean): 发布于2012年7月9日。
Android 4.4 (KitKat): 发布于2013年10月31日。
Android 5.0-5.1 (Lollipop): 发布于2014年11月12日。
Android 6.0 (Marshmallow): 发布于2015年10月5日。
Android 7.0-7.1 (Nougat): 发布于2016年8月22日。
Android 8.0-8.1 (Oreo): 发布于2017年8月21日。
Android 9.0 (Pie): 发布于2018年8月6日。
Android 10: 发布于2019年9月3日。
Android 11: 发布于2020年9月8日。
Android 12: 发布于2021年10月4日。
Android 13: 发布于2022年8月16日。
Android 14: 发布于2023年5月11日。

可以看到Android发布的等级版本,每年升级一版雷打不动。

但是过程中有可能有Bate版本,或者多个API版本,比如AndroidAPI 33 和API 32都是Android13。

armeabi-v7a:2018年以前手机主流架构,arm64-v8a:2014年左右出现,当前主流架构 。

2015年到2018年,cpu的架构在armeabi-v7a和arm64-v8a 都有使用,2019年后基本都只使用arm64-v8a。

所以Android9 或者更新的Android手机系统正常情况只需要适配 arm64-v8a 就可以了。

3、如果正式版的应用,使用debug版的so 会有问题吗?或者debug版应用使用正式版so会有问题吗?

Android Studio直接跑的就是debug应用。添加签名文件后,就可以生成正式版本。

对比了两种so大小,确实有差异,但是测试上面两种情况都是可以正常运行的。

所以debug版本和release版本应该只是针对apk校验,对so相关的底层实现影响不大。

4、使用so库的架构小结

对于新版本系统(Android9以上)的Android手机系统只需要适配 arm64-v8a 就可以了;

如果要适配模拟器,可以加 x86,有些模拟器可能要x86-64.非必要一般不加x86模拟器的so。

如果不确定设备cpu架构类型可以使用adb shell 命令查询: getprop | grep cpu。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/494408.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前缀和算法(1)

目录 一维前缀和[模板] 一、题目描述 二、思路解析 三、代码 二维前缀和[模板] 一、题目描述 二、思路解析 三、代码 724.寻找数组的中心下标 一、题目描述 二、思路解析 三、代码 238.除自身以外数组的乘积 一、题目描述 二、思路解析 三、代码 一维前缀和[模…

数据结构——二叉搜索树详解

一、二叉搜索树定义 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 1.非空左子树上所有节点的值都小于根节点的值。 2.非空右子树上所有节点的值都大于根节点的值。 3.左右子树也都为二叉搜索树。 如下图所示&#xff1a…

上位机图像处理和嵌入式模块部署(qmacvisual区域提取)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 在图像处理中,有两部分比较重要,一个是区域分割,一个是区域提取。区域分割,比较好理解,…

IDEA的使用(概念,安装,配置,)以及什么是字符集,模版

目录 Intellij IDEA IDE的概念 IntelliJ IDEA的安装 IntelliJ IDEA的使用 基本配置 JDK配置 创建Module 基本用法 字体配置 主题配置 字符集 设置IDEA默认字符集 注释模板 字符集 字符集简介 常见字符集 Intellij IDEA 我们不可能一直使用记事本之类变成&#…

BUG定位---一起学习吧之测试

判断一个BUG是前端还是后端的,通常需要根据BUG的具体表现、发生的环境以及相关的技术栈来进行分析。以下是一些常用的判断方法: 错误发生的位置: 如果BUG涉及的是页面的布局、样式、交互效果等,那么很可能是前端的BUG。如果BUG与…

计算机网络:物理层 - 信道复用

计算机网络:物理层 - 信道复用 频分复用时分复用统计时分复用波分复用码分复用 计算机网络中,用户之间通过信道进行通信,但是信道是有限的,想要提高网络的效率,就需要提高信道的利用效率。因此计算机网络中普遍采用信道…

python学习12:python中的字符串格式化-数字精度控制

python中的字符串格式化-数字精度控制 1.使用辅助符号"m.n"来进行数据的宽度和精度的控制 m,控制宽度,要求是数字(一般是很少使用的),设置的宽度小于数字自身,不生效 n,控制小数点精度,要求是数…

PASSL代码解读[01] readme

介绍 PASSL 是一个基于 PaddlePaddle 的视觉库,用于使用 PaddlePaddle 进行最先进的视觉自监督学习研究。PASSL旨在加速自监督学习的研究周期:从设计一个新的自监督任务到评估所学的表征。 PASSL 主要特性: 自监督前沿算法实现 PASSL 实现了…

自动驾驶传感器:惯性导航IMU原理

自动驾驶传感器:惯性导航IMU原理 附赠自动驾驶学习资料和量产经验:链接 组合导航里包含了GNSS卫星导航模块与IMU惯性导航模块,前一篇文章写了GNSS模块,本章写IMU惯导,也是本系列最后一篇文章。 1. 惯性测量单元&…

python django实战开发序列化器的一个应用心得分享

需求: 查询的时候返回不包括SharePasswd 字段, 但是新增操作需要用到该字段 再不写多个model模型和序列化器的前提下实现 如果您在查询(GET 请求)时不希望返回 SharePasswd 字段,但在新增(POST 请求)时需要用到该字段…

数据结构 - 用队列实现栈/用栈实现队列

用栈实现队列 思路: 队列是遵循队头出数据,队列进数据。 创建两个栈,一个左栈,一个右栈。左栈用来插入新数据,右栈用来出数据 我们要借用栈的性质也实现一个出数据,和入数据的功能,该怎么样实…

[flask]异常抛出和捕获异常

Python学习之Flask全局异常处理流程_flask 异常处理-CSDN博客 读取文件错误 OSError: [Errno 22] Invalid argument:_[errno 22] invalid argument: ..\\data\\snli_1.0\\-CSDN博客 异常触发 assert触发异常: 在Python中,使用assert语句可以检查某个条…

“智慧食堂”设计与实现|Springboot+ Mysql+Vue+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW,文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文(设计)学生选题参考合集推荐收藏(包含Springboot、jsp、ssmvue等技术项目合集) 目录 1. 功…

Unity urp渲染管线下,动态修改材质球surfaceType

在项目中遇到了需要代码动态修改材质球的surfaceType,使其动态切换是否透明的需求。 urp渲染管线下,动态修改材质球的surfaceType,查了大部分帖子,都有一些瑕疵,可能会造成透明后阴影投射有问题。 其次在webgl平台上…

CSS(五)

一、定位 1.1 为什么需要定位 提问: 以下情况使用标准流或者浮动能实现吗? 1. 某个元素可以自由的在一个盒子内移动位置,并且压住其他盒子. 2. 当我们滚动窗口的时候,盒子是固定屏幕某个位置的。 以上效果,标准流或浮…

VBA高级应用30例应用2:MouseMove鼠标左键按下并移动鼠标事件

《VBA高级应用30例》(版权10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以…

数据安全之路:Databend 用户策略指南

在 Databend 中,我们致力于保护用户的数据安全。除了身份认证之外,我们还提供了多种访问策略,包括网络策略(Network Policy)、密码策略(Password Policy)和数据脱敏策略(Masking Pol…

【面试经典150 | 动态规划】三角形最小路径和

文章目录 写在前面Tag题目来源解题思路方法一:动态规划 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行…

如何使用Docker轻松构建和管理应用程序(二)

上一篇文章介绍了 Docker 基本概念,其中镜像、容器和 Dockerfile 。我们使用 Dockerfile 定义镜像,依赖镜像来运行容器,因此 Dockerfile 是镜像和容器的关键,Dockerfile 可以非常容易的定义镜像内容,同时在我们后期的微…

SpringBoot集成WebSocket实现简单的多人聊天室

上代码—gitee下载地址: https://gitee.com/bestwater/Spring-websocket.git下载代码,连上数据库执行SQL,就可以运行,最终效果