1879827bbSŁukasz Kosmaty // Copyright © 2021-present 650 Industries, Inc. (aka Expo) 2879827bbSŁukasz Kosmaty 3879827bbSŁukasz Kosmaty #pragma once 4879827bbSŁukasz Kosmaty 5879827bbSŁukasz Kosmaty #include "JSIObjectWrapper.h" 6879827bbSŁukasz Kosmaty #include "JavaScriptRuntime.h" 7879827bbSŁukasz Kosmaty #include "WeakRuntimeHolder.h" 8879827bbSŁukasz Kosmaty #include "types/ExpectedType.h" 9879827bbSŁukasz Kosmaty 10879827bbSŁukasz Kosmaty #include <fbjni/fbjni.h> 11879827bbSŁukasz Kosmaty #include <jsi/jsi.h> 12879827bbSŁukasz Kosmaty 13879827bbSŁukasz Kosmaty namespace jni = facebook::jni; 14879827bbSŁukasz Kosmaty namespace jsi = facebook::jsi; 15879827bbSŁukasz Kosmaty 16879827bbSŁukasz Kosmaty namespace expo { 17879827bbSŁukasz Kosmaty 18879827bbSŁukasz Kosmaty /** 19879827bbSŁukasz Kosmaty * Represents any JavaScript function. Its purpose is to expose the `jsi::Function` API back to Kotlin. 20879827bbSŁukasz Kosmaty */ 21*29e8b6f8SŁukasz Kosmaty class JavaScriptFunction : public jni::HybridClass<JavaScriptFunction, Destructible>, JSIFunctionWrapper { 22879827bbSŁukasz Kosmaty public: 23879827bbSŁukasz Kosmaty static auto constexpr 24879827bbSŁukasz Kosmaty kJavaDescriptor = "Lexpo/modules/kotlin/jni/JavaScriptFunction;"; 25879827bbSŁukasz Kosmaty static auto constexpr TAG = "JavaScriptFunction"; 26879827bbSŁukasz Kosmaty 27879827bbSŁukasz Kosmaty static void registerNatives(); 28879827bbSŁukasz Kosmaty 29*29e8b6f8SŁukasz Kosmaty static jni::local_ref<JavaScriptFunction::javaobject> newInstance( 30*29e8b6f8SŁukasz Kosmaty JSIInteropModuleRegistry *jsiInteropModuleRegistry, 31*29e8b6f8SŁukasz Kosmaty std::weak_ptr<JavaScriptRuntime> runtime, 32*29e8b6f8SŁukasz Kosmaty std::shared_ptr<jsi::Function> jsFunction 33*29e8b6f8SŁukasz Kosmaty ); 34*29e8b6f8SŁukasz Kosmaty 35879827bbSŁukasz Kosmaty JavaScriptFunction( 36879827bbSŁukasz Kosmaty std::weak_ptr<JavaScriptRuntime> runtime, 37879827bbSŁukasz Kosmaty std::shared_ptr<jsi::Function> jsFunction 38879827bbSŁukasz Kosmaty ); 39879827bbSŁukasz Kosmaty 40879827bbSŁukasz Kosmaty JavaScriptFunction( 41879827bbSŁukasz Kosmaty WeakRuntimeHolder runtime, 42879827bbSŁukasz Kosmaty std::shared_ptr<jsi::Function> jsFunction 43879827bbSŁukasz Kosmaty ); 44879827bbSŁukasz Kosmaty 45879827bbSŁukasz Kosmaty std::shared_ptr<jsi::Function> get() override; 46879827bbSŁukasz Kosmaty 47879827bbSŁukasz Kosmaty 48879827bbSŁukasz Kosmaty private: 49879827bbSŁukasz Kosmaty friend HybridBase; 50879827bbSŁukasz Kosmaty 51879827bbSŁukasz Kosmaty WeakRuntimeHolder runtimeHolder; 52879827bbSŁukasz Kosmaty std::shared_ptr<jsi::Function> jsFunction; 53879827bbSŁukasz Kosmaty 54879827bbSŁukasz Kosmaty jobject invoke( 55879827bbSŁukasz Kosmaty jni::alias_ref<jni::JArrayClass<jni::JObject>> args, 56879827bbSŁukasz Kosmaty jni::alias_ref<ExpectedType::javaobject> expectedReturnType 57879827bbSŁukasz Kosmaty ); 58879827bbSŁukasz Kosmaty }; 59879827bbSŁukasz Kosmaty 60879827bbSŁukasz Kosmaty } // namespace expo 61