diff --git a/android/sdk/src/main/jni/src/bridge/entry.cc b/android/sdk/src/main/jni/src/bridge/entry.cc index 68ad6bdeb6f..67caa5a19df 100644 --- a/android/sdk/src/main/jni/src/bridge/entry.cc +++ b/android/sdk/src/main/jni/src/bridge/entry.cc @@ -570,7 +570,7 @@ jlong InitInstance(JNIEnv* j_env, v8::Isolate* isolate = v8_vm->isolate_; isolate->SetData(kRuntimeSlotIndex, reinterpret_cast(runtime_id)); } else { - engine = std::make_shared(std::move(engine_cb_map), param); + engine = std::make_shared(); reuse_engine_map[group] = std::make_pair(engine, 1); runtime->SetEngine(engine); } @@ -586,20 +586,20 @@ jlong InitInstance(JNIEnv* j_env, << ", use_count = " << engine.use_count(); } else { TDF_BASE_DLOG(INFO) << "engine create"; - engine = std::make_shared(std::move(engine_cb_map), param); + engine = std::make_shared(); runtime->SetEngine(engine); reuse_engine_map[group] = std::make_pair(engine, 1); } } else { // kDefaultEngineId TDF_BASE_DLOG(INFO) << "default create engine"; - engine = std::make_shared(std::move(engine_cb_map), param); + engine = std::make_shared(); runtime->SetEngine(engine); } + engine->AsyncInit(param, std::move(engine_cb_map)); runtime->SetScope(engine->CreateScope("", std::move(scope_cb_map))); TDF_BASE_DLOG(INFO) << "group = " << group; runtime->SetGroupId(group); TDF_BASE_LOG(INFO) << "InitInstance end, runtime_id = " << runtime_id; - return runtime_id; } diff --git a/core/include/core/engine.h b/core/include/core/engine.h index d6114d451d0..33691a30d8d 100644 --- a/core/include/core/engine.h +++ b/core/include/core/engine.h @@ -38,18 +38,18 @@ class Scope; -class Engine { +class Engine: public std::enable_shared_from_this { public: using RegisterMap = hippy::base::RegisterMap; using VM = hippy::napi::VM; using VMInitParam = hippy::napi::VMInitParam; using RegisterFunction = hippy::base::RegisterFunction; - Engine( - std::unique_ptr map = std::make_unique(), - const std::shared_ptr& param = nullptr); + Engine(); virtual ~Engine(); + void AsyncInit(const std::shared_ptr& param = nullptr, + std::unique_ptr map = std::make_unique()); void Enter(); void Exit(); std::shared_ptr CreateScope( diff --git a/core/src/engine.cc b/core/src/engine.cc index 9e4b7047d25..1591b676c97 100644 --- a/core/src/engine.cc +++ b/core/src/engine.cc @@ -27,14 +27,7 @@ constexpr uint32_t Engine::kDefaultWorkerPoolSize = 1; -Engine::Engine(std::unique_ptr map, const std::shared_ptr& init_param) - : vm_(nullptr), map_(std::move(map)), scope_cnt_(0) { - SetupThreads(); - - std::shared_ptr task = std::make_shared(); - task->callback = [=] { CreateVM(init_param); }; - js_runner_->PostTask(task); -} +Engine::Engine() : vm_(nullptr), scope_cnt_(0) {} Engine::~Engine() { TDF_BASE_DLOG(INFO) << "~Engine"; @@ -78,8 +71,7 @@ void Engine::SetupThreads() { void Engine::CreateVM(const std::shared_ptr& param) { TDF_BASE_DLOG(INFO) << "Engine CreateVM"; vm_ = hippy::napi::CreateVM(param); - - RegisterMap::const_iterator it = map_->find(hippy::base::kVMCreateCBKey); + auto it = map_->find(hippy::base::kVMCreateCBKey); if (it != map_->end()) { RegisterFunction f = it->second; if (f) { @@ -91,6 +83,23 @@ void Engine::CreateVM(const std::shared_ptr& param) { } } +void Engine::AsyncInit(const std::shared_ptr& param, std::unique_ptr map) { + SetupThreads(); + + map_ = std::move(map); + auto weak_engine = weak_from_this(); + auto task = std::make_shared(); + task->callback = [weak_engine, param] { + auto engine = weak_engine.lock(); + TDF_BASE_DCHECK(engine); + if (!engine) { + return; + } + engine->CreateVM(param); + }; + js_runner_->PostTask(task); +} + void Engine::Enter() { TDF_BASE_DLOG(INFO) << "Engine Enter"; std::lock_guard lock(cnt_mutex_); diff --git a/ios/sdk/base/HippyJSEnginesMapper.mm b/ios/sdk/base/HippyJSEnginesMapper.mm index 1f0032aa9b0..3b7af8381c0 100644 --- a/ios/sdk/base/HippyJSEnginesMapper.mm +++ b/ios/sdk/base/HippyJSEnginesMapper.mm @@ -55,6 +55,7 @@ + (instancetype)defaultInstance { return ref.first; } else { std::shared_ptr engine = std::make_shared(); + engine->AsyncInit(); [self setEngine:engine forKey:key]; return engine; }