1 // Copyright © 2021-present 650 Industries, Inc. (aka Expo) 2 3 #pragma once 4 5 #include "JSIObjectWrapper.h" 6 #include "JavaScriptRuntime.h" 7 #include "WeakRuntimeHolder.h" 8 #include "types/ExpectedType.h" 9 10 #include <fbjni/fbjni.h> 11 #include <jsi/jsi.h> 12 13 namespace jni = facebook::jni; 14 namespace jsi = facebook::jsi; 15 16 namespace expo { 17 18 /** 19 * Represents any JavaScript function. Its purpose is to expose the `jsi::Function` API back to Kotlin. 20 */ 21 class JavaScriptFunction : public jni::HybridClass<JavaScriptFunction>, JSIFunctionWrapper { 22 public: 23 static auto constexpr 24 kJavaDescriptor = "Lexpo/modules/kotlin/jni/JavaScriptFunction;"; 25 static auto constexpr TAG = "JavaScriptFunction"; 26 27 static void registerNatives(); 28 29 JavaScriptFunction( 30 std::weak_ptr<JavaScriptRuntime> runtime, 31 std::shared_ptr<jsi::Function> jsFunction 32 ); 33 34 JavaScriptFunction( 35 WeakRuntimeHolder runtime, 36 std::shared_ptr<jsi::Function> jsFunction 37 ); 38 39 std::shared_ptr<jsi::Function> get() override; 40 41 42 private: 43 friend HybridBase; 44 45 WeakRuntimeHolder runtimeHolder; 46 std::shared_ptr<jsi::Function> jsFunction; 47 48 jobject invoke( 49 jni::alias_ref<jni::JArrayClass<jni::JObject>> args, 50 jni::alias_ref<ExpectedType::javaobject> expectedReturnType 51 ); 52 }; 53 54 } // namespace expo 55