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方法.

总结

  1. 灵活使用ReigsterNatives方法,不一定必须在JNI_OnLoad()方法中调用,也可以自行调用
  1. JNI中绝大部分方法都在JNIEnv中;
Android系统启动流程-SystemServer分析Android系统启动流程-ART虚拟机的启动
Loading...