// Copyright © 2021-present 650 Industries, Inc. (aka Expo) #pragma once #include "JavaScriptRuntime.h" #include "JavaScriptModuleObject.h" #include #include #include #include #include namespace jni = facebook::jni; namespace jsi = facebook::jsi; namespace react = facebook::react; namespace expo { /** * A JNI wrapper to initialize CPP part of modules and access all data from the module registry. */ class JSIInteropModuleRegistry : public jni::HybridClass { public: static auto constexpr kJavaDescriptor = "Lexpo/modules/kotlin/jni/JSIInteropModuleRegistry;"; static auto constexpr TAG = "JSIInteropModuleRegistry"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); /** * Initializes the `ExpoModulesHostObject` and adds it to the global object. */ void installJSI( jlong jsRuntimePointer, jni::alias_ref jsInvokerHolder, jni::alias_ref nativeInvokerHolder ); /** * Gets a module for a given name. It will throw an exception if the module doesn't exist. * * @param moduleName * @return An instance of `JavaScriptModuleObject` */ jni::local_ref getModule(const std::string &moduleName) const; std::shared_ptr jsInvoker; std::shared_ptr nativeInvoker; private: friend HybridBase; std::unique_ptr runtimeHolder; jni::global_ref javaPart_; explicit JSIInteropModuleRegistry(jni::alias_ref jThis); inline jni::local_ref callGetJavaScriptModuleObjectMethod(const std::string &moduleName) const; }; } // namespace expo