type
status
date
slug
summary
tags
category
icon
password

启动JVM的通用流程

  1. 加载虚拟机实现的动态链接库(Android中是so文件);
    1. 一般通过dlopen方法加载so文件.
  1. 设置启动参数,并使用JNI_CreateJavaVM(JavaVM**, JNIEnv**, void*)方法创建虚拟机;
这个时候就可以执行Java程序了.
我这里用C++写了个简单的例子,用来创建JVM:

C++创建虚拟机

代码没什么好说的,按照指定的流程加载就行,实际运用的时候启动参数得设置很多.
在使用app_process创建并启动zygote进程之前,会先启动虚拟机.
在AndroidRuntime::start()方法中有这么一段代码:
JniInvocation其实是一个中间层,通过这个中国层,那些使用JNI invocation API的应用可以动态选择JNI的实现方式.在Android中就是动态选择Dalvik虚拟机和ART虚拟机(可通过persist.sys.dalvik.vm.lib.2指定)
libnativehelper/JniInvocation.c中:
这里默认就是libart.so,然后使用dlopen系统调用进行加载,查找主要的JNI接口.然后将接口的实现切换为ART虚拟机.
在startVM中,首先会初始化大量的启动参数,然后就调用JNI_CreateJavaVM()方法创建ART虚拟机:
这个时候ART虚拟机就创建成功了.
Android系统启动流程-Native方法的注册Android系统启动流程-桌面程序的启动
Loading...