Android 源码中jni项目 加载so目录小结
Android 源码中jni项目 加载so目录小结
文章目录
- Android 源码中jni项目 加载so目录小结
- 一、前言
- 二、so目录验证测试
- 1、jni so文件错误报错
- (1)报错1 - 未找到so文件:
- (2)报错2 - so文件中未找到native方法:
- 2、验证的几种情况
- (1)apk下面的 lib/arm64/ 放置正确的so文件
- (2)apk下面的 lib/arm64/ 放置错误的so文件
- 所以上面两个测试,验证了 lib/arm64/ 目录才是首先选择的目录。
- (3)apk下面的 lib/arm64/ 不放置so文件
- ① system/lib 、vendor/lib64 、vendor/lib放置正确的so文件
- 测试验证了,system/lib 、vendor/lib64 、vendor/lib 系统不会读取里面的so。
- ② system/lib64 放置正确的so文件
- ③system/lib64 放置错误的so文件
- 测试验证了,系统应用会读取 system/lib64/ 下面的so。
- 三、其他
- 1、系统源码中加载so的具体实现
- 2、Android JNI SO库和对应的CPU架构详解
- 3、Android 系统源码项目加载预编好的so库
一、前言
如何实现把so放到Android设备目录system/lib64下面,系统应用apk就能自动获取里面的so?
如果实现了这个功能,后续修改了jni具体功能实现,
就不用修改这个apk的代码,只要替换这个so就可以完成不同的实现了。
其实这个功能不难,只要是系统源码编译的应用就可以;
具体如何编译可以看本文最后的介绍。
本文主要介绍一下,系统源码应用编译后,load so的顺序:
顺序就是优先apk目录下的 lib/arm64/,然后 system/lib64/,有的还会加载 vendor/lib64/
具体实现是cpp底层的,这里不做具体分析。
二、so目录验证测试
jni加载so代码:
static {System.loadLibrary("native-lib");
}
这里是没有写so路径的,so的固定命名规则是前面加 lib 后面加.so,所以正确的搜命名是:libnative-lib.so
这里拿一个其他错误的libnative-lib.so和一个正确的libnative-lib.so验证测试。
目录分别测试:apk下面的lib/arm64/,system/lib, system/lib64, vendor/lib64,vendor/lib
应用运行后保存主要有两种,一个是找不到so,一个是so找不到jni的方法。
1、jni so文件错误报错
(1)报错1 - 未找到so文件:
2024-09-04 16:10:42.987 1593-1593/? E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.demo.jnicallback, PID: 1593java.lang.UnsatisfiedLinkError: dlopen failed: library "libnative-lib.so" not foundat java.lang.Runtime.loadLibrary0(Runtime.java:1077)at java.lang.Runtime.loadLibrary0(Runtime.java:998)at java.lang.System.loadLibrary(System.java:1661)at com.liwenzhi.jnidemo.JniClass.<clinit>(JniClass.java:16)at com.demo.jnicallback.MainActivity.onCreate(MainActivity.java:27)
上面那几个目录下都没有so文件就会报这个错误。
(2)报错2 - so文件中未找到native方法:
--------- beginning of crash
2024-09-04 15:32:04.294 1600-1600/? E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.demo.jnicallback, PID: 1600java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String com.liwenzhi.jnidemo.JniClass.stringFromJNI() (tried Java_com_liwenzhi_jnidemo_JniClass_stringFromJNI and Java_com_liwenzhi_jnidemo_JniClass_stringFromJNI__)at com.liwenzhi.jnidemo.JniClass.stringFromJNI(Native Method)at com.demo.jnicallback.MainActivity.onCreate(MainActivity.java:28)
有so但是so里面的实现方法,包名不正常或者不存在这个 native方法就会报上面这个错误。
2、验证的几种情况
(1)apk下面的 lib/arm64/ 放置正确的so文件
其他目录不管放置错误的so文件还是不放置so文件都是不会报错的;
(2)apk下面的 lib/arm64/ 放置错误的so文件
其他目录不管放置正确的so文件还是不放置so文件都是会报错native方法不一致;
所以上面两个测试,验证了 lib/arm64/ 目录才是首先选择的目录。
(3)apk下面的 lib/arm64/ 不放置so文件
① system/lib 、vendor/lib64 、vendor/lib放置正确的so文件
运行后都是报错未找到so文件错误
测试验证了,system/lib 、vendor/lib64 、vendor/lib 系统不会读取里面的so。
其实这个情况不是绝对的,后面简单说一下,这个和应用的32位、64位有关,但是现在应用基本都是64位的了。
② system/lib64 放置正确的so文件
应用不会报错;
③system/lib64 放置错误的so文件
应用会报错native方法不一致;
测试验证了,系统应用会读取 system/lib64/ 下面的so。
上面几个测试,就验证了 so加载的顺序优先apk目录下的 lib/arm64/,然后 system/lib64/。
其实知道就行了,没啥太大必要进行验证测试。
三、其他
1、系统源码中加载so的具体实现
安卓so加载流程源码分析
https://oacia.dev/android-load-so/
android so的加载流程(Android 13~14)
https://blog.csdn.net/qq_61253776/article/details/141675312
在系统中确实看到有应用是加载到了 vendor/lib64 下面的so,
但是不知道为啥我编的系统应用无法加载到这个目录下面的so,这个有待研究!
2、Android JNI SO库和对应的CPU架构详解
armeabi:第五代、第六代ARM处理器,使用软件浮点运算,很古老的手机是这架构, 出现在2000年左右 。(32位)armeabi-v7a:第七代ARM处理器,使用硬件浮点运算,2018年以前手机主流架构, 2007年开始出现 。(32位)arm64-v8a:第八代64位处理器,当前主流架构, 2014年左右出现。(64位)x86/x86-64:Intel处理器,Android模拟器用得比较多。
X86_64与X64都是讲的同一个东西(64位) 。x86(32位)每一种CPU架构对应一个ABI,ABI定义了二进制文件(比如SO)如何运行在相应的系统平台。
详细介绍:
https://blog.csdn.net/wenzhi20102321/article/details/137064391
看看so和cpu框架,看看时间,大概就知道为啥现在应用都是64位框架的了,不可能再用十几年前的应用了吧。
如果真的使用32位的cpu框架,
apk下面的so目录是: lib/armeabi-v7a
system下面的so目录是 :system/lib
有的系统会在system/lib 和 system/lib64 都放so,防止运行的是32位的cpu框架的应用报错。
3、Android 系统源码项目加载预编好的so库
本来以为只是介绍一下编译使用的Android.mk或者Android.bp就可以了,
但是事实有点出乎意料,总结下来发现收获了一些知识点;
普通应用开发不一定用到这个知识,但是系统编译开发会用到这个知识,并且有的相关文件还不好解决。
https://blog.csdn.net/wenzhi20102321/article/details/141968262
相关文章:
Android 源码中jni项目 加载so目录小结
Android 源码中jni项目 加载so目录小结 文章目录 Android 源码中jni项目 加载so目录小结一、前言二、so目录验证测试1、jni so文件错误报错(1)报错1 - 未找到so文件:(2)报错2 - so文件中未找到native方法: …...

24/9/6算法笔记 kaggle 房屋价格
预测模型主要分为两大类: 回归模型:当你的目标变量是连续的数值时,你会使用回归模型进行预测。回归模型试图找到输入特征和连续输出之间的关联。一些常见的回归模型包括: 线性回归(Linear Regression)岭回归…...

【MA35D1】buildroot 编译使用经验
文章目录 芯片介绍Buildroot开发Linux实践环境搭建代码获取编译执行步骤(仅适用于我公司产品) 后续有需要更改的输出文件目录 芯片介绍 NuMicro MA35D1系列为一颗异核同构的多核心微处理器,适用于高端 Edge IIoT Gateway。它是基于双核 64 位…...

排查 MyBatis XML 配置中的 IF 语句与传值名称不匹配的 Bug
文章目录 本文档只是为了留档方便以后工作运维,或者给同事分享文档内容比较简陋命令也不是特别全,不适合小白观看,如有不懂可以私信,上班期间都是在得 前言,在改一个bug得时候发现一个有意思得问题,就是myb…...

数字证书与公钥基础设施
关注这个证书的其他相关笔记:NISP 一级 —— 考证笔记合集-CSDN博客 0x01:数字证书 数字证书是由第三方可信机构(一般是证书服务器)颁发的数字证书,可以证明身份的可信度。 数字证书具有以下特点以及性质:…...
拥抱数智化,JNPF低代码平台如何推动企业转型升级
随着信息技术的飞速发展,企业面临的市场竞争日益激烈,传统的业务流程和管理模式已经难以满足快速变化的市场需求。数智化转型成为企业持续发展的必由之路。在这一过程中,低代码开发平台扮演了至关重要的角色。本文将探讨JNPF低代码平台如何助…...

Linux shell脚本 (十二)case语句_linux awk case语句
case工作方式如上所示。取值后面必须为关键字 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。 取值将…...

【二等奖成品论文】2024年数学建模国赛B题25页成品论文+完整matlab代码、python代码等(后续会更新)
您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片,那是获取资料的入口! 【全网最全】2024年数学建模国赛B题31页完整建模过程25页成品论文matlab/python代码等(后续会更新「首先来看看目前已有的资料,还会…...
国内快速高效下载 HuggingFace上的各种大语言模型
预先安装: apt install aria2 # sudo apt install aria2apt install git-lfs # sudo apt install git-lfs下载hfd wget https://hf-mirror.com/hfd/hfd.shchmod ax hfd.sh设置环境变量 Linux export HF_ENDPOINThttps://hf-mirror.comWindows $env:HF_ENDPOINT…...
linux proxy 【linux 代理】
服务端 略 客户端 proxy_url"http://192.168.21.101:7890" export no_proxy"192.168.21.2,10.0.0.0/8,192.168.0.0/16,localhost,127.0.0.0/8,.coding.net,.tencentyun.com,.myqcloud.com" # proxy settings enable_proxy() {export http_proxy"${…...
AcWing907. 区间覆盖
参考的视频讲解:↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 【贪心算法08-区间问题03-区间覆盖】 每次贪心就是选择左端点里面<起始端点里面右边界最大的,这样就是保证了最少区间个数! 然后每次迭代都会更新一次起始端点st,反复运用本算法…...

Unity TMP (TextMeshPro) 更新中文字符集
TMP更新中文字符集 1 字符集缺失说明2 字体的字符表2.1 字符表更新模式:动态2.2 字符表更新模式:静态 3 更新字符集步骤3.1 打开纹理更新面板3.1 导入文本文件3.3 关于警告处理 4 修改TMP默认字体设置 1 字符集缺失说明 使用TMP显示中文需要用到中文字体…...

Leetcode3259. 超级饮料的最大强化能量
Every day a Leetcode 题目来源:3259. 超级饮料的最大强化能量 解法1:记忆化搜索 本题的状态定义 dfs(i,j)。其中 j0,1,分别表示最后选的是 energyDrinkA[i] 还是 energyDrinkB[i]。 为方便实现,把 energyDrinkA 和 energyDri…...

Java题集(由入门到精通)03
此系列文章收录大量Java经典代码题(也可以算是leetcode刷题指南),希望可以与大家一起努力学好Java。3、2、1,请看! 目录 1.创建学生成绩表 2.冒泡排序 3.模拟彩票中奖 4.杨辉三角 1.创建学生成绩表 输入n个学生的…...

zblog自动生成文章插件(百度AI写作配图,图文并茂)
最近工作比较忙,导致自己的几个网站都无法手动更新,于是乎也想偷个懒把,让AI帮忙打理下自己的网站。我接触chatgpt等AI工具还是比较早了,从openai推出gpt3.5就一直在用,说实话,开始的时候用AI自动更新网站还…...

华为 HCIP-Datacom H12-821 题库 (4)
有需要题库的可以看主页置顶 V群仅进行学习交流 1.缺省情况下,广播型网络中运行 IS-IS 的路由器,DIS 发送 CSNP报文的周期为多少秒? A、10 B、3.3 C、30 D、40 答案:A 解析: 广播型网络中运行 IS-IS 的路由器&am…...
使用seq_file
在《使用procfs》一文的源码示例中有说到proc文件系统每次读取的数据只能是1个页,如果超过则需多次读取,这样的话会增加读取次数,增多系统调用次数,影响了整体的效率,故而才有seq file序列文件的出现,该项功能使得内核对于大文件的读取更加容易。 对于seq file,其结构…...
期货赫兹量化-种群优化算法:进化策略,(μ,λ)-ES 和 (μ+λ)-ES
进化策略(Evolution Strategies, ES)是一种启发式算法,旨在模仿自然选择的过程来解决复杂的优化问题,尤其在没有显式解、或搜索空间巨大的情况下表现良好。基于自然界的进化原理,进化策略通过突变、选择等遗传算子迭代…...

pytest实战演练
pytest实战演练 pycharm常见操作 创建项目使用虚拟环境 创建文件夹的时候建议使用的创建方式 这样创建是因为python3.0版本之后导包无区别,之前版本导包会报错的 _init_.py文件中建议为空不写内容 _all_[]的含义 是将列表中的方法或变量或类暴漏出去便于使用的生效…...

7、关于LoFTR
7、关于LoFTR LoFTR论文链接:LoFTR LoFTR的提出,是将Transformer模型的注意力机制在特征匹配方向的应用,Transformer的提取特征的机制,在自身进行,本文提出可以的两张图像之间进行特征计算,非常适合进行特…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...

Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...