源码位置:art/runtime/runtime.cc
头文件位置:art/runtime/runtime.h
目录
实例化方法
单例
Current
获取当前实例,实现与定义都在头文件中。
229 static Runtime* Current() {
230 return instance_;
231 }
Create
静态方法
715 bool Runtime::Create(RuntimeArgumentMap&& runtime_options) {
716 // TODO: acquire a static mutex on Runtime to avoid racing.
717 if (Runtime::instance_ != nullptr) {
718 return false;
719 }
720 instance_ = new Runtime;
721 Locks::SetClientCallback(IsSafeToCallAbort);
722 if (!instance_->Init(std::move(runtime_options))) {
723 // TODO: Currently deleting the instance will abort the runtime on destruction. Now This will
724 // leak memory, instead. Fix the destructor. b/19100793.
725 // delete instance_;
726 instance_ = nullptr;
727 return false;
728 }
729 return true;
730 }
732 bool Runtime::Create(const RuntimeOptions& raw_options, bool ignore_unrecognized) {
733 RuntimeArgumentMap runtime_options;
734 return ParseOptions(raw_options, ignore_unrecognized, &runtime_options) &&
735 Create(std::move(runtime_options));
736 }
Create方法会调用Runtime实例的Init方法
其它方法
Init
实现十分复杂,这时就不详述了。
1.会创建JavaVMExt实例
1479 java_vm_ = JavaVMExt::Create(this, runtime_options, &error_msg);
这里才是真正创建java虚拟机的地方,详见:http://xinyiworld.top/wordpress_it/?p=14654
2.会调用 1489 Thread::Startup();
详见:http://xinyiworld.top/wordpress_it/?p=14590
3.创建Thread实例,封装绑定当前主线程。同时会创建JNIEnvExt实例。
会调用 1494 Thread* self = Thread::Attach("main", false, nullptr, false);
将当前线程,也就是主线程,关联到ART运行时去。详见:http://xinyiworld.top/wordpress_it/?p=14590
1046 self->tlsPtr_.name->assign(thread_name);
1047 ::art::SetThreadName(thread_name);
::art::SetThreadName
见http://xinyiworld.top/wordpress_it/?p=14712
Start
GetJavaVM
获取JavaVMExt指针,实现与定义都在头文件中。
296 JavaVMExt* GetJavaVM() const {
297 return java_vm_.get();
298 }
0 条评论