我们回到这个函数。
extern "C" jint JNI_CreateJavaVM(JavaVM** p_vm, JNIEnv** p_env, void* vm_args) {
ScopedTrace trace(__FUNCTION__);
...
bool ignore_unrecognized = args->ignoreUnrecognized;
if (!Runtime::Create(options, ignore_unrecognized)) {
return JNI_ERR;
}
...
Runtime* runtime = Runtime::Current();
bool started = runtime->Start();
*p_env = Thread::Current()->GetJniEnv();
*p_vm = runtime->GetJavaVM();
return JNI_OK;
}
其实我们在 Runtime::Create 中已经分析了好多了。 Runtime::Create 也就是 Runtime::Init 。这里做了好多内容主要包括:
javaVm和JNIEnv的初始化
ota文件加载以及整个heap的建立
classlinker的建立
接下来我们来看 runtime->Start()。
bool Runtime::Start() {
Thread* self = Thread::Current();
self->TransitionFromRunnableToSuspended(kNative);
started_ = true;
if (jit_options_->UseJitCompilation() || jit_options_->GetSaveProfilingInfo()) {
std::string error_msg;
if (!IsZygote()) {
CreateJit();
} else if (jit_options_->UseJitCompilation()) {
}
}
{
ScopedTrace trace2("InitNativeMethods");
InitNativeMethods();
}
InitThreadGroups(self);
system_class_loader_ = CreateSystemClassLoader(this);
if (is_zygote_) {
if (!InitZygote()) {
return false;
}
} else {
if (is_native_bridge_loaded_) {
PreInitializeNativeBridge(".");
}
InitNonZygoteOrPostFork(self->GetJniEnv(),
/* is_system_server */ false,
action,
GetInstructionSetString(kRuntimeISA));
}
StartDaemonThreads();
return true;
}
这个函数份量好重啊!
jit的建立
initnativeMethods java代码so的加载
systemClassLoader的建立
daemonThreads 的建立 ----垃圾回收主要线程