1 #include <stdint.h>
2 
3 #include <jni.h>
4 #include <thread>
5 #include <android/log.h>
6 
7 #include <jsi/jsi.h>
8 #include "EXGLNativeApi.h"
9 #include "EXPlatformUtils.h"
10 
11 extern "C" {
12 
13 // JNIEnv is valid only inside the same thread that it was passed from
14 // to support worklet we need register it from UI thread
15 thread_local JNIEnv* threadLocalEnv;
16 
17 JNIEXPORT jint JNICALL
18 Java_expo_modules_gl_cpp_EXGL_EXGLContextCreate
19 (JNIEnv *env, jclass clazz) {
20   return EXGLContextCreate();
21 }
22 
23 JNIEXPORT void JNICALL
24 Java_expo_modules_gl_cpp_EXGL_EXGLContextPrepare
25 (JNIEnv *env, jclass clazz, jlong jsiPtr, jint exglCtxId, jobject glContext) {
26   threadLocalEnv = env;
27   jclass GLContextClass = env->GetObjectClass(glContext);
28   jobject glContextRef = env->NewGlobalRef(glContext);
29   jmethodID flushMethodRef = env->GetMethodID(GLContextClass, "flush", "()V");
30 
31   std::function<void(void)> flushMethod = [glContextRef, flushMethodRef] {
32     threadLocalEnv->CallVoidMethod(glContextRef, flushMethodRef);
33   };
34   EXGLContextPrepare((void*) jsiPtr, exglCtxId, flushMethod);
35 }
36 
37 JNIEXPORT void JNICALL
38 Java_expo_modules_gl_cpp_EXGL_EXGLContextDestroy
39 (JNIEnv *env, jclass clazz, jint exglCtxId) {
40   EXGLContextDestroy(exglCtxId);
41 }
42 
43 JNIEXPORT void JNICALL
44 Java_expo_modules_gl_cpp_EXGL_EXGLContextFlush
45 (JNIEnv *env, jclass clazz, jint exglCtxId) {
46   EXGLContextFlush(exglCtxId);
47 }
48 
49 JNIEXPORT jint JNICALL
50 Java_expo_modules_gl_cpp_EXGL_EXGLContextCreateObject
51 (JNIEnv *env, jclass clazz, jint exglCtxId) {
52   return EXGLContextCreateObject(exglCtxId);
53 }
54 
55 JNIEXPORT void JNICALL
56 Java_expo_modules_gl_cpp_EXGL_EXGLContextDestroyObject
57 (JNIEnv *env, jclass clazz, jint exglCtxId, jint exglObjId) {
58   EXGLContextDestroyObject(exglCtxId, exglObjId);
59 }
60 
61 JNIEXPORT void JNICALL
62 Java_expo_modules_gl_cpp_EXGL_EXGLContextMapObject
63 (JNIEnv *env, jclass clazz, jint exglCtxId, jint exglObjId, jint glObj) {
64   EXGLContextMapObject(exglCtxId, exglObjId, glObj);
65 }
66 
67 JNIEXPORT jint JNICALL
68 Java_expo_modules_gl_cpp_EXGL_EXGLContextGetObject
69 (JNIEnv *env, jclass clazz, jint exglCtxId, jint exglObjId) {
70   return EXGLContextGetObject(exglCtxId, exglObjId);
71 }
72 
73 JNIEXPORT void JNICALL
74 Java_expo_modules_gl_cpp_EXGL_EXGLRegisterThread
75 (JNIEnv *env, jclass clazz) {
76   threadLocalEnv = env;
77 }
78 
79 JNIEXPORT bool JNICALL
80 Java_expo_modules_gl_cpp_EXGL_EXGLContextNeedsRedraw
81 (JNIEnv *env, jclass clazz, jint exglCtxId) {
82   return EXGLContextNeedsRedraw(exglCtxId);
83 }
84 
85 JNIEXPORT void JNICALL
86 Java_expo_modules_gl_cpp_EXGL_EXGLContextDrawEnded
87 (JNIEnv *env, jclass clazz, jint exglCtxId) {
88   EXGLContextDrawEnded(exglCtxId);
89 }
90 
91 }
92