1 // Copyright © 2021-present 650 Industries, Inc. (aka Expo)
2 
3 #pragma once
4 
5 #include "JNIDeallocator.h"
6 
7 #include <fbjni/fbjni.h>
8 #include <folly/dynamic.h>
9 
10 #include <react/jni/WritableNativeArray.h>
11 #include <react/jni/WritableNativeMap.h>
12 
13 namespace jni = facebook::jni;
14 namespace react = facebook::react;
15 
16 namespace expo {
17 class JSIInteropModuleRegistry;
18 
19 class JavaCallback : public jni::HybridClass<JavaCallback, Destructible> {
20 public:
21   static auto constexpr
22     kJavaDescriptor = "Lexpo/modules/kotlin/jni/JavaCallback;";
23   static auto constexpr TAG = "JavaCallback";
24 
25   using Callback = std::function<void(folly::dynamic)>;
26 
27   static void registerNatives();
28 
29   static jni::local_ref<JavaCallback::javaobject> newInstance(
30     JSIInteropModuleRegistry *jsiInteropModuleRegistry,
31     Callback callback
32   );
33 
34 private:
35   friend HybridBase;
36 
37 
38   JavaCallback(Callback callback);
39 
40   void invoke();
41 
42   void invokeBool(bool result);
43 
44   void invokeInt(int result);
45 
46   void invokeDouble(double result);
47 
48   void invokeFloat(float result);
49 
50   void invokeString(jni::alias_ref<jstring> result);
51 
52   void invokeArray(jni::alias_ref<react::WritableNativeArray::javaobject> result);
53 
54   void invokeMap(jni::alias_ref<react::WritableNativeMap::javaobject> result);
55 
56   Callback callback;
57 };
58 } // namespace expo
59