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.

Differential Revision: D16622133

fbshipit-source-id: 6a5c20bb405b945c06378a3423d5e7eb38ef244c
This commit is contained in:
Ramanpreet Nara 2019-08-02 10:04:20 -07:00 коммит произвёл Facebook Github Bot
Родитель 29ec6401f6
Коммит 82e4d28e25
5 изменённых файлов: 43 добавлений и 44 удалений

Просмотреть файл

@ -24,23 +24,23 @@ TurboModuleManager::TurboModuleManager(
jni::alias_ref<TurboModuleManager::javaobject> jThis, jni::alias_ref<TurboModuleManager::javaobject> jThis,
jsi::Runtime* rt, jsi::Runtime* rt,
std::shared_ptr<JSCallInvoker> jsCallInvoker, std::shared_ptr<JSCallInvoker> jsCallInvoker,
jni::alias_ref<TurboModuleManagerDelegate::javaobject> tmmDelegate jni::alias_ref<TurboModuleManagerDelegate::javaobject> delegate
): ):
javaPart_(jni::make_global(jThis)), javaPart_(jni::make_global(jThis)),
runtime_(rt), runtime_(rt),
jsCallInvoker_(jsCallInvoker), jsCallInvoker_(jsCallInvoker),
turboModuleManagerDelegate_(jni::make_global(tmmDelegate)) delegate_(jni::make_global(delegate))
{} {}
jni::local_ref<TurboModuleManager::jhybriddata> TurboModuleManager::initHybrid( jni::local_ref<TurboModuleManager::jhybriddata> TurboModuleManager::initHybrid(
jni::alias_ref<jhybridobject> jThis, jni::alias_ref<jhybridobject> jThis,
jlong jsContext, jlong jsContext,
jni::alias_ref<JSCallInvokerHolder::javaobject> jsCallInvokerHolder, jni::alias_ref<JSCallInvokerHolder::javaobject> jsCallInvokerHolder,
jni::alias_ref<TurboModuleManagerDelegate::javaobject> tmmDelegate jni::alias_ref<TurboModuleManagerDelegate::javaobject> delegate
) { ) {
auto jsCallInvoker = jsCallInvokerHolder->cthis()->getJSCallInvoker(); auto jsCallInvoker = jsCallInvokerHolder->cthis()->getJSCallInvoker();
return makeCxxInstance(jThis, (jsi::Runtime *) jsContext, jsCallInvoker, tmmDelegate); return makeCxxInstance(jThis, (jsi::Runtime *) jsContext, jsCallInvoker, delegate);
} }
void TurboModuleManager::registerNatives() { void TurboModuleManager::registerNatives() {
@ -61,23 +61,26 @@ void TurboModuleManager::installJSIBindings() {
return turboModuleLookup->second; return turboModuleLookup->second;
} }
auto cxxModule = turboModuleManagerDelegate_->cthis()->getTurboModule(name, jsCallInvoker_); auto cxxModule = delegate_->cthis()->getTurboModule(name, jsCallInvoker_);
if (cxxModule) { if (cxxModule) {
turboModuleCache_.insert({name, cxxModule}); turboModuleCache_.insert({name, cxxModule});
return 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) { if (legacyCxxModule) {
auto turboModule = std::make_shared<react::TurboCxxModule>(legacyCxxModule->cthis()->getModule(), jsCallInvoker_); auto turboModule = std::make_shared<react::TurboCxxModule>(legacyCxxModule->cthis()->getModule(), jsCallInvoker_);
turboModuleCache_.insert({name, turboModule}); turboModuleCache_.insert({name, turboModule});
return 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) { if (moduleInstance) {
auto turboModule = turboModuleManagerDelegate_->cthis()->getTurboModule(name, moduleInstance, jsCallInvoker_); auto turboModule = delegate_->cthis()->getTurboModule(name, moduleInstance, jsCallInvoker_);
turboModuleCache_.insert({name, turboModule}); turboModuleCache_.insert({name, turboModule});
return 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 react
} // namespace facebook } // namespace facebook

Просмотреть файл

@ -28,7 +28,7 @@ public:
jni::alias_ref<jhybridobject> jThis, jni::alias_ref<jhybridobject> jThis,
jlong jsContext, jlong jsContext,
jni::alias_ref<JSCallInvokerHolder::javaobject> jsCallInvokerHolder, jni::alias_ref<JSCallInvokerHolder::javaobject> jsCallInvokerHolder,
jni::alias_ref<TurboModuleManagerDelegate::javaobject> tmmDelegate jni::alias_ref<TurboModuleManagerDelegate::javaobject> delegate
); );
static void registerNatives(); static void registerNatives();
private: private:
@ -36,7 +36,7 @@ private:
jni::global_ref<TurboModuleManager::javaobject> javaPart_; jni::global_ref<TurboModuleManager::javaobject> javaPart_;
jsi::Runtime* runtime_; jsi::Runtime* runtime_;
std::shared_ptr<JSCallInvoker> jsCallInvoker_; std::shared_ptr<JSCallInvoker> jsCallInvoker_;
jni::global_ref<TurboModuleManagerDelegate::javaobject> turboModuleManagerDelegate_; jni::global_ref<TurboModuleManagerDelegate::javaobject> delegate_;
/** /**
* TODO(T48018690): * TODO(T48018690):
@ -46,14 +46,12 @@ private:
*/ */
std::unordered_map<std::string, std::shared_ptr<react::TurboModule>> turboModuleCache_; 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(); void installJSIBindings();
explicit TurboModuleManager( explicit TurboModuleManager(
jni::alias_ref<TurboModuleManager::jhybridobject> jThis, jni::alias_ref<TurboModuleManager::jhybridobject> jThis,
jsi::Runtime *rt, jsi::Runtime *rt,
std::shared_ptr<JSCallInvoker> jsCallInvoker, 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: public:
static auto constexpr kJavaDescriptor = "Lcom/facebook/react/turbomodule/core/TurboModuleManagerDelegate;"; 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; virtual std::shared_ptr<TurboModule> getTurboModule(std::string name, std::shared_ptr<JSCallInvoker> jsInvoker) = 0;
private: private:

Просмотреть файл

@ -25,8 +25,11 @@
namespace facebook { namespace facebook {
namespace react { namespace react {
JavaTurboModule::JavaTurboModule(const std::string &name, jni::global_ref<JTurboModule> instance, std::shared_ptr<JSCallInvoker> jsInvoker) JavaTurboModule::JavaTurboModule(
: TurboModule(name, jsInvoker), instance_(instance) {} const std::string &name,
jni::alias_ref<JTurboModule> instance,
std::shared_ptr<JSCallInvoker> jsInvoker)
: TurboModule(name, jsInvoker), instance_(jni::make_global(instance)) {}
jni::local_ref<JCxxCallbackImpl::JavaPart> createJavaCallbackFromJSIFunction( jni::local_ref<JCxxCallbackImpl::JavaPart> createJavaCallbackFromJSIFunction(
jsi::Function &function, jsi::Function &function,
@ -322,16 +325,20 @@ std::vector<jvalue> convertJSIArgsToJNIArgs(
} }
jsi::Value convertFromJMapToValue(JNIEnv *env, jsi::Runtime &rt, jobject arg) { jsi::Value convertFromJMapToValue(JNIEnv *env, jsi::Runtime &rt, jobject arg) {
// We currently use Java Argument.makeNativeMap() method to do this conversion // We currently use Java Argument.makeNativeMap() method to do this conversion
// This could also be done purely in C++, but iterative over map methods // This could also be done purely in C++, but iterative over map methods
// but those may end up calling reflection methods anyway // but those may end up calling reflection methods anyway
// TODO (axe) Investigate the best way to convert Java Map to Value // TODO (axe) Investigate the best way to convert Java Map to Value
jclass jArguments = env->FindClass("com/facebook/react/bridge/Arguments"); jclass jArguments = env->FindClass("com/facebook/react/bridge/Arguments");
static jmethodID jMakeNativeMap = env->GetStaticMethodID(jArguments, "makeNativeMap", "(Ljava/util/Map;)Lcom/facebook/react/bridge/WritableNativeMap;"); static jmethodID jMakeNativeMap = env->GetStaticMethodID(
auto constants = (jobject) env->CallStaticObjectMethod(jArguments, jMakeNativeMap, arg); jArguments,
auto jResult = jni::adopt_local(constants); "makeNativeMap",
auto result = jni::static_ref_cast<NativeMap::jhybridobject>(jResult); "(Ljava/util/Map;)Lcom/facebook/react/bridge/WritableNativeMap;");
return jsi::valueFromDynamic(rt, result->cthis()->consume()); auto constants =
(jobject)env->CallStaticObjectMethod(jArguments, jMakeNativeMap, arg);
auto jResult = jni::adopt_local(constants);
auto result = jni::static_ref_cast<NativeMap::jhybridobject>(jResult);
return jsi::valueFromDynamic(rt, result->cthis()->consume());
} }
jsi::Value JavaTurboModule::invokeJavaMethod( jsi::Value JavaTurboModule::invokeJavaMethod(

Просмотреть файл

@ -17,12 +17,16 @@ namespace facebook {
namespace react { namespace react {
struct JTurboModule : jni::JavaClass<JTurboModule> { struct JTurboModule : jni::JavaClass<JTurboModule> {
static auto constexpr kJavaDescriptor = "Lcom/facebook/react/turbomodule/core/interfaces/TurboModule;"; static auto constexpr kJavaDescriptor =
"Lcom/facebook/react/turbomodule/core/interfaces/TurboModule;";
}; };
class JSI_EXPORT JavaTurboModule : public TurboModule { class JSI_EXPORT JavaTurboModule : public TurboModule {
public: public:
JavaTurboModule(const std::string &name, jni::global_ref<JTurboModule> instance, std::shared_ptr<JSCallInvoker> jsInvoker); JavaTurboModule(
const std::string &name,
jni::alias_ref<JTurboModule> instance,
std::shared_ptr<JSCallInvoker> jsInvoker);
jsi::Value invokeJavaMethod( jsi::Value invokeJavaMethod(
jsi::Runtime &runtime, jsi::Runtime &runtime,
TurboModuleMethodValueKind valueKind, TurboModuleMethodValueKind valueKind,
@ -30,7 +34,8 @@ public:
const std::string &methodSignature, const std::string &methodSignature,
const jsi::Value *args, const jsi::Value *args,
size_t count); size_t count);
private:
private:
jni::global_ref<JTurboModule> instance_; jni::global_ref<JTurboModule> instance_;
jclass findClass(JNIEnv *env) const; jclass findClass(JNIEnv *env) const;
}; };