From 5127ac5c2a95f2505b5688fa7c2f810db725ca0f Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Wed, 22 May 2019 13:11:53 -0700 Subject: [PATCH] Implement support for legacy CxxModules Summary: ## Background Legacy Cxx NativeModules are implemented as Hybrid classes. Essentially, when a Cxx NativeModule is requested, you instantiate its hybrid class, which then creates a C++ counterpart. Then, the bridge uses the C++ counterpart's `getModule()` method to obtain ownership of the Cxx NativeModule. ## Summary This diff implements backwards-compability for Cxx NativeModules. If a Cxx NativeModule implements the `TurboModule` interface, then when the module is requested by name, we: 1. Instantiate its Java hybrid class, createing a C++ counterpart. 3. Obtain the CxxModule from the C++ counterpart using `getModule()` and use it to create a `TurboCxxModule` instance (this forwards all JavaScript method calls to the CxxModule) inside `TurboModuleManager`. 5. Return this `TurboCxxModule` to JS. Reviewed By: mdvacca Differential Revision: D15252041 fbshipit-source-id: cdbb62632d7a8735f7687daf62de63df9e3ad2c5 --- .../core/jni/jsireact/TurboModuleManager.cpp | 17 ++++++++++++++--- .../core/jni/jsireact/TurboModuleManager.h | 2 ++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/jsireact/TurboModuleManager.cpp b/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/jsireact/TurboModuleManager.cpp index 995d274dda0..0a7854f93ab 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/jsireact/TurboModuleManager.cpp +++ b/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/jsireact/TurboModuleManager.cpp @@ -12,7 +12,7 @@ #include #include - +#include #include #include "TurboModuleManager.h" @@ -55,13 +55,18 @@ void TurboModuleManager::installJSIBindings() { return; // Runtime doesn't exist when attached to Chrome debugger. } TurboModuleBinding::install(*runtime_, std::make_shared( - [this](const std::string &name) { + [this](const std::string &name) -> std::shared_ptr { auto cxxModule = turboModuleManagerDelegate_->cthis()->getTurboModule(name, jsCallInvoker_); if (cxxModule) { return cxxModule; } - const auto moduleInstance = getJavaModule(name); + auto legacyCxxModule = getLegacyCxxJavaModule(name); + if (legacyCxxModule) { + return std::make_shared(legacyCxxModule->cthis()->getModule(), jsCallInvoker_); + } + + auto moduleInstance = getJavaModule(name); if (moduleInstance) { return turboModuleManagerDelegate_->cthis()->getTurboModule(name, moduleInstance, jsCallInvoker_); @@ -80,5 +85,11 @@ jni::global_ref TurboModuleManager::getJavaModule(std::string name return module; } +jni::global_ref TurboModuleManager::getLegacyCxxJavaModule(std::string name) { + static auto method = turboModuleManagerDelegate_->getClass()->getMethod(const std::string&)>("getLegacyCxxModule"); + auto module = jni::make_global(method(turboModuleManagerDelegate_.get(), name)); + return module; +} + } // namespace react } // namespace facebook diff --git a/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/jsireact/TurboModuleManager.h b/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/jsireact/TurboModuleManager.h index 305b3b18594..fbb29834e0c 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/jsireact/TurboModuleManager.h +++ b/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/jsireact/TurboModuleManager.h @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -37,6 +38,7 @@ private: jni::global_ref turboModuleManagerDelegate_; jni::global_ref getJavaModule(std::string name); + jni::global_ref getLegacyCxxJavaModule(std::string name); void installJSIBindings(); explicit TurboModuleManager( jni::alias_ref jThis,