type
status
date
slug
summary
tags
category
icon
password
在使用app_process 创建zygote进程的过程中会执行下面这些操作:
- 创建ART虚拟机
- 注册Native方法
- 找到ZygoteInit,通过反射调用它的main方法进入Java世界
这里说一下注册Native方法的一些细节.
入口
源码在
frameworks/base/core/jni/AndroidRuntime.cpp
中.要注册的方法
其中
register_xx
其实是一个函数指针,遍历的时候会依次执行这些方法:可以看到需要传入用到JNI方法的Java类名以及用到的Native方法签名.
实际注册操作都是通过
jniRegisterNativeMethods
方法:实现在
libnativehelper/JNIHelp.c
中:这些要注册的Native方法实现大部分都在
frameworks/base/core/jni
下.我门来看一下Canvas中Native方法的注册:
使用JNIEnv的
RegisterNatives
方法实际上就是在Java的native方法名与C++中的JNI调用方法签名之间建立一个映射关系,从而避免了在C++中必须写那些丑陋的方法名了.而
RegisterNatives
的使用在JNI开发中还是非常常见的,比如我们经常会在JNI_Onload方法中注册Native方法,还是会使用到RegisterNatives
方法.总结
- 灵活使用
ReigsterNatives
方法,不一定必须在JNI_OnLoad()
方法中调用,也可以自行调用
- JNI中绝大部分方法都在JNIEnv中;
- 作者:姜康
- 链接:https://jiangkang.tech/article/6c5a7989-bf07-4e91-a901-f4139dd07e6f
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。