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

news/2024/5/20 2:32:24/文章来源:https://blog.csdn.net/wenzhi20102321/article/details/137064391

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。

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

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

相关文章

【Leetcode每日一题】 递归 - 计算布尔二叉树的值(难度⭐⭐)(44)

1. 题目解析 题目链接:2331. 计算布尔二叉树的值 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 算法思路概述: 问题解释:我们面对的是一个节点可能含有逻辑运算符(AN…

PCL点云处理之M估计样本一致性(MSAC)平面拟合(二百三十六)

PCL点云处理之M估计样本一致性(MSAC)平面拟合(二百三十五六) 一、算法介绍二、使用步骤1.代码2.效果一、算法介绍 写论文当然用RANSAC的优化变种算法MSAC啊,RANSAC太土太LOW了哈哈 MSAC算法(M-estimator Sample Consensus)是RANSAC(Random Sample Consensus)的一种…

git笔记之撤销、回退、reset方面的笔记

git笔记之撤销、回退、reset方面的笔记 code review! 文章目录 git笔记之撤销、回退、reset方面的笔记1.git 已经commit了,还没push,如何撤销到初始状态git reset --soft HEAD~1git reset HEAD~1(等同于 git reset --mixed HEAD~1&#xff0…

探索BPMN:业务流程模型与表示法

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【论文速读】| 对大语言模型解决攻击性安全挑战的实证评估

本次分享论文为:An Empirical Evaluation of LLMs for Solving Offensive Security Challenges 基本信息 原文作者:Minghao Shao, Boyuan Chen, Sofija Jancheska, Brendan Dolan-Gavitt, Siddharth Garg, Ramesh Karri, Muhammad Shafique 作者单位&a…

MATLAB机器学习工具箱——傻瓜式操作

一、使用回归学习器预测北京二手房房价 软件:MATLAB R2023 a 数据: 第一步:导入原始数据和待预测数据 第二步 :打开工具箱中的回归学习器导入学习数据 1.新建会话 2.寻找导入learning data 3.自动锁定前7列为自变量&#xff…

【计算机考研】408到底有多难?

你真以为大家是学不会408吗? 不是!单纯是因为时间不够!!! 再准确一些就是不会分配时间 408的知识其实并不难,要说想上130那确实有难度,但是100在时间充裕的情况下还是可以做到的 我本人是双…

数据分析web可视化神器---streamlit框架,无需懂前端也能搭建出精美的web网站页面

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 所属的专栏:数据分析系统化教学,零基础到进阶实战 景天的主页:景天科技苑 文章目录 Streamlit什么是streamli…

[Linux_IMX6ULL驱动开发]-基础驱动

驱动的含义 如何理解嵌入式的驱动呢,我个人认为,驱动就是嵌入式上层应用操控底层硬件的桥梁。因为上层应用是在用户态,是无法直接操控底层的硬件的。我们需要利用系统调用(open、read、write等),进入内核态…

RuleApp资源社区,知识付费社区,可对接typecho的小程序APP

强大的文章/社区/自媒体客户端,支持打包为安卓,苹果,小程序。包括文章模块,用户模块,支付模块,聊天模块,商城模块等基础功能,包含VIP会员,付费阅读等收费体系&#xff0c…

C程序编译、链接与项目构建

C程序编译、链接与项目构建 摘要C编译环境静、动态库介绍gcc与g和程序编译、链接Visual Studio创建和链接库动态库的显示调用Windows下显示动态库的加载/查找方式 Make介绍安装使用 CMake介绍安装使用构建方式内部构建外部构建构建使用静/动态库常用[系统]变量常用指令CMake模块…

PostgreSQL关系型数据库介绍与部署

使用背景 在过去的几年中,PostgreSQL的使用量逐渐增加,而Oracle和MySQL的使用量则有所下降。这主要是由于以下几个原因:开源和免费、功能丰富、可扩展性强、安全性高、跨平台支持好、社区活跃、成熟稳定。这些因素使得PostgreSQL成为了许多开…

2024/3/23打卡数组分割(第14届蓝桥杯)——二项式+快速幂

题目 思路 分析该题,要将集合 划分成两个子集 ,且两个子集的和都是偶数。 可知:偶数 偶数 偶数;偶数 奇数 奇数;奇数 奇数 偶数; 分析可得:如果该集合的和为奇数,就不能分…

八、C#计数排序算法

简介 计数排序是一种非比较性的排序算法,适用于排序一定范围内的整数。它的基本思想是通过统计每个元素的出现次数,然后根据元素的大小依次输出排序结果。 实现原理 首先找出待排序数组中的最大值max和最小值min。 创建一个长度为max-min1的数组count…

IP如何异地共享文件?

【天联】 组网由于操作简单、跨平台应用、无网络要求、独创的安全加速方案等原因,被几十万用户广泛应用,解决了各行业客户的远程连接需求。采用穿透技术,简单易用,不需要在硬件设备中端口映射即可实现远程访问。 异地共享文件 在…

Calico配置路由反射器 (RR) 模式

RR介绍 在 Calico 网络中,默认使用 Node-to-Node Mesh 全互联模式,即集群中的每个节点之间都会相互建立 BGP 连接,用于路由交换。然而,随着集群规模的扩大,全互联模式会导致连接数成倍增加,产生性能问题。为…

Linux 注入依赖环境

文章目录 配置依赖程序安装 JDK安装 Tomcat安装 mysql 配置依赖程序 下面配置依赖程序都以CentOS为例。 安装 JDK 可以直接使用 yum(CentOS) 直接进行安装。 先搜索,确定软件包的完整名称。 yum list | grep jdk再进行安装 进行安装的时候一定要先确保处在“管理…

前端学习--品优购项目

文章目录 前端学习--品优购项目1.案例铺垫文件建立与命名必备文件网站favicon图标网站TDK三大标签SEO优化常用命名 2.LOGO SEO优化3.实际代码4.申请免费域名 前端学习–品优购项目 1.案例铺垫 文件建立与命名 一个项目中为了方便实用和查找内容会有多个文件夹,比如…

idea插件开发案例:将批量插入方法转换成分批批量插入

代码: idea-plugin-demo 1.背景 excel导入时都会使用批量插入或者批量更新到数据库,这在mysql下没有问题。 但因为公司国产化需求,换成达梦数据库就不行了,报sql超长。 一开始想写mybatis拦截器处理,又怕出现bug,这个问…

MySQL为什么会选错索引

在平时不知道一有没有遇到过这种情况,我明明创建了索引,但是MySQL为何不用索引呢?为何要进行全索引扫描呢? 一、对索引进行函数操作 假设现在维护了一个交易系统,其中交易记录表 tradelog 包含交易流水号(tradeid)、交…