JNI学习

本文深入解析JNI的两种注册方式及调用流程,详解Android中so文件的加载过程,包括不同版本的so路径来源,以及类加载的双亲委派机制。探讨热修复技术在类加载过程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,JNI原理

1.两种注册方式:动态注册和静态注册

2.java层调用native层,native层调用java层

https://www.jianshu.com/p/5847a2cb68c0

二,so加载过程

1.先找so具体路径

so路径主要来源有两大类:1. vender/lib system/lib系统路径 2. data/app/XXX/lib app路径

不同版本会有差异。

2.在调用native方法load

参考大神文章:

https://mp.weixin.qq.com/s?__biz=MzA3NTYzODYzMg==&mid=2653577702&idx=1&sn=1288c77cd8fc2db68dc92cf18d675ace&scene=4#wechat_redirect

三,类加载过程

1.apk安装的时候PMS

apk安装的时候,PMS会扫描压缩文件中apk中的dex ,so等文件,并且创建对应目录,将其拷贝到对应目录

2.app进程启动的时候

虚拟机加载类的过程:1.先find 2.再load

PathClassLoader创建完成后,就已经拥有了目标程序的文件路径,native lib路径,以及parent类加载器对象。接下来开始执行loadClass()来加载相应的类.

3.类的双亲委派机制

类的加载顺序:1.先判断是否加载过,加载过直接返回 2,调用父类加载器加载,加载过直接返回 3.最后调用当前类加载器加载

4.热修复

一个Classloader可以包含多个dex文件,每个dex文件被封装到一个Element对象,这些Element对象排列成有序的数组 dexElements。当查找某个类时,会遍历所有的dex文件,如果找到则直接返回,不再继续遍历dexElements。也就是说当两个类不同的dex中出现,会优先处理排在前面的dex文件,这便是热修复的核心精髓,将需要修复的类所打包的dex文件插入到dexElements前面

 

参考:

NDK编译
https://developer.android.com/ndk/guides/application_mk?hl=zh_cn

Android Build 系统
https://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/index.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值