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