源码位置: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::SetThreadNamehttp://xinyiworld.top/wordpress_it/?p=14712

Start

GetJavaVM

获取JavaVMExt指针,实现与定义都在头文件中。

 296   JavaVMExt* GetJavaVM() const {
 297     return java_vm_.get();
 298   }

0 条评论

发表回复

您的电子邮箱地址不会被公开。