Move ownership of TurboModule jni ref to JavaTurboModule

Summary: When you create a TurboModule from the JS side, we instantiate its Java class and simply make this `javaobject` a `jni::global_ref` in C++. But the reason why we need to make this a global ref is because `JavaTurboModule` needs it to be a global reference for method calls. Making this a `jni::global_ref` from the perspective to TurboModuleManager doesn't really make any sense. So, this diff refactors that bit of code.

Reviewed By: mdvacca

Differential Revision: D16555673

fbshipit-source-id: 2778fc5a372c41847e8296c2e22bb9a8826fcc52
This commit is contained in:
Ramanpreet Nara
2019-08-01 16:36:47 -07:00
committed by Facebook Github Bot
parent e6c8ace576
commit 88e03fa4db
5 changed files with 43 additions and 44 deletions
@@ -24,23 +24,23 @@ TurboModuleManager::TurboModuleManager(
jni::alias_ref<TurboModuleManager::javaobject> jThis,
jsi::Runtime* rt,
std::shared_ptr<JSCallInvoker> jsCallInvoker,
jni::alias_ref<TurboModuleManagerDelegate::javaobject> tmmDelegate
jni::alias_ref<TurboModuleManagerDelegate::javaobject> delegate
):
javaPart_(jni::make_global(jThis)),
runtime_(rt),
jsCallInvoker_(jsCallInvoker),
turboModuleManagerDelegate_(jni::make_global(tmmDelegate))
delegate_(jni::make_global(delegate))
{}
jni::local_ref<TurboModuleManager::jhybriddata> TurboModuleManager::initHybrid(
jni::alias_ref<jhybridobject> jThis,
jlong jsContext,
jni::alias_ref<JSCallInvokerHolder::javaobject> jsCallInvokerHolder,
jni::alias_ref<TurboModuleManagerDelegate::javaobject> tmmDelegate
jni::alias_ref<TurboModuleManagerDelegate::javaobject> delegate
) {
auto jsCallInvoker = jsCallInvokerHolder->cthis()->getJSCallInvoker();
return makeCxxInstance(jThis, (jsi::Runtime *) jsContext, jsCallInvoker, tmmDelegate);
return makeCxxInstance(jThis, (jsi::Runtime *) jsContext, jsCallInvoker, delegate);
}
void TurboModuleManager::registerNatives() {
@@ -61,23 +61,26 @@ void TurboModuleManager::installJSIBindings() {
return turboModuleLookup->second;
}
auto cxxModule = turboModuleManagerDelegate_->cthis()->getTurboModule(name, jsCallInvoker_);
auto cxxModule = delegate_->cthis()->getTurboModule(name, jsCallInvoker_);
if (cxxModule) {
turboModuleCache_.insert({name, cxxModule});
return cxxModule;
}
auto legacyCxxModule = getLegacyCxxJavaModule(name);
static auto getLegacyCxxModule = delegate_->getClass()->getMethod<jni::alias_ref<CxxModuleWrapper::javaobject>(const std::string&)>("getLegacyCxxModule");
auto legacyCxxModule = getLegacyCxxModule(delegate_.get(), name);
if (legacyCxxModule) {
auto turboModule = std::make_shared<react::TurboCxxModule>(legacyCxxModule->cthis()->getModule(), jsCallInvoker_);
turboModuleCache_.insert({name, turboModule});
return turboModule;
}
auto moduleInstance = getJavaModule(name);
static auto getJavaModule = javaClassStatic()->getMethod<jni::alias_ref<JTurboModule>(const std::string&)>("getJavaModule");
auto moduleInstance = getJavaModule(javaPart_.get(), name);
if (moduleInstance) {
auto turboModule = turboModuleManagerDelegate_->cthis()->getTurboModule(name, moduleInstance, jsCallInvoker_);
auto turboModule = delegate_->cthis()->getTurboModule(name, moduleInstance, jsCallInvoker_);
turboModuleCache_.insert({name, turboModule});
return turboModule;
}
@@ -87,19 +90,5 @@ void TurboModuleManager::installJSIBindings() {
);
}
jni::global_ref<JTurboModule> TurboModuleManager::getJavaModule(std::string name) {
static auto method = javaClassStatic()->getMethod<jni::alias_ref<JTurboModule>(const std::string&)>("getJavaModule");
auto module = jni::make_global(method(javaPart_.get(), name));
return module;
}
jni::global_ref<CxxModuleWrapper::javaobject> TurboModuleManager::getLegacyCxxJavaModule(std::string name) {
static auto method = turboModuleManagerDelegate_->getClass()->getMethod<jni::alias_ref<CxxModuleWrapper::javaobject>(const std::string&)>("getLegacyCxxModule");
auto module = jni::make_global(method(turboModuleManagerDelegate_.get(), name));
return module;
}
} // namespace react
} // namespace facebook
@@ -28,7 +28,7 @@ public:
jni::alias_ref<jhybridobject> jThis,
jlong jsContext,
jni::alias_ref<JSCallInvokerHolder::javaobject> jsCallInvokerHolder,
jni::alias_ref<TurboModuleManagerDelegate::javaobject> tmmDelegate
jni::alias_ref<TurboModuleManagerDelegate::javaobject> delegate
);
static void registerNatives();
private:
@@ -36,7 +36,7 @@ private:
jni::global_ref<TurboModuleManager::javaobject> javaPart_;
jsi::Runtime* runtime_;
std::shared_ptr<JSCallInvoker> jsCallInvoker_;
jni::global_ref<TurboModuleManagerDelegate::javaobject> turboModuleManagerDelegate_;
jni::global_ref<TurboModuleManagerDelegate::javaobject> delegate_;
/**
* TODO(T48018690):
@@ -46,14 +46,12 @@ private:
*/
std::unordered_map<std::string, std::shared_ptr<react::TurboModule>> turboModuleCache_;
jni::global_ref<JTurboModule> getJavaModule(std::string name);
jni::global_ref<CxxModuleWrapper::javaobject> getLegacyCxxJavaModule(std::string name);
void installJSIBindings();
explicit TurboModuleManager(
jni::alias_ref<TurboModuleManager::jhybridobject> jThis,
jsi::Runtime *rt,
std::shared_ptr<JSCallInvoker> jsCallInvoker,
jni::alias_ref<TurboModuleManagerDelegate::javaobject> tmmDelegate
jni::alias_ref<TurboModuleManagerDelegate::javaobject> delegate
);
};
@@ -20,7 +20,7 @@ class TurboModuleManagerDelegate : public jni::HybridClass<TurboModuleManagerDel
public:
static auto constexpr kJavaDescriptor = "Lcom/facebook/react/turbomodule/core/TurboModuleManagerDelegate;";
virtual std::shared_ptr<TurboModule> getTurboModule(std::string name, jni::global_ref<JTurboModule> turboModule, std::shared_ptr<JSCallInvoker> jsInvoker) = 0;
virtual std::shared_ptr<TurboModule> getTurboModule(std::string name, jni::alias_ref<JTurboModule> turboModule, std::shared_ptr<JSCallInvoker> jsInvoker) = 0;
virtual std::shared_ptr<TurboModule> getTurboModule(std::string name, std::shared_ptr<JSCallInvoker> jsInvoker) = 0;
private: