1 // Copyright © 2021-present 650 Industries, Inc. (aka Expo)
2
3 #include "JNIFunctionBody.h"
4 #include "Exceptions.h"
5 #include "JavaReferencesCache.h"
6
7 namespace jni = facebook::jni;
8 namespace react = facebook::react;
9
10 namespace expo {
11
12 jni::local_ref<jni::JObject>
invoke(jobjectArray args)13 JNIFunctionBody::invoke(jobjectArray args) {
14 // Do NOT use getClass here!
15 // Method obtained from `getClass` will point to the overridden version of the method.
16 // Because of that, it can't be cached - we will try to invoke the nonexistent method
17 // if we receive an object of a different class than the one used to obtain the method id.
18 // The only cacheable method id can be obtain from the base class.
19 static const auto method = jni::findClassLocal("expo/modules/kotlin/jni/JNIFunctionBody")
20 ->getMethod<jni::local_ref<jni::JObject>(jobjectArray)>(
21 "invoke",
22 "([Ljava/lang/Object;)Ljava/lang/Object;"
23 );
24
25 auto result = jni::Environment::current()->CallObjectMethod(this->self(), method.getId(), args);
26 throwPendingJniExceptionAsCppException();
27 return jni::adopt_local(static_cast<jni::JniType<jni::JObject>>(result));
28 }
29
invoke(jobjectArray args,jobject promise)30 void JNIAsyncFunctionBody::invoke(
31 jobjectArray args,
32 jobject promise
33 ) {
34 // Do NOT use getClass here!
35 // Method obtained from `getClass` will point to the overridden version of the method.
36 // Because of that, it can't be cached - we will try to invoke the nonexistent method
37 // if we receive an object of a different class than the one used to obtain the method id.
38 // The only cacheable method id can be obtain from the base class.
39 static const auto method = jni::findClassLocal("expo/modules/kotlin/jni/JNIAsyncFunctionBody")
40 ->getMethod<
41 void(jobjectArray , jobject)
42 >(
43 "invoke",
44 "([Ljava/lang/Object;Lexpo/modules/kotlin/jni/PromiseImpl;)V"
45 );
46
47 jni::Environment::current()->CallVoidMethod(this->self(), method.getId(), args, promise);
48 throwPendingJniExceptionAsCppException();
49 }
50
51 } // namespace expo
52