type
status
date
slug
summary
tags
category
icon
password
启动JVM的通用流程
- 加载虚拟机实现的动态链接库(Android中是so文件);
一般通过
dlopen
方法加载so文件.- 设置启动参数,并使用
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虚拟机就创建成功了.
- 作者:姜康
- 链接:https://jiangkang.tech/article/e7731213-4fca-4ff3-b902-3bd7ed1d528c
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。