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
Java_expo_modules_gl_cpp_EXGL_EXGLContextCreate(JNIEnv * env,jclass clazz)18 Java_expo_modules_gl_cpp_EXGL_EXGLContextCreate
19 (JNIEnv *env, jclass clazz) {
20   return EXGLContextCreate();
21 }
22 
23 JNIEXPORT void JNICALL
Java_expo_modules_gl_cpp_EXGL_EXGLContextPrepare(JNIEnv * env,jclass clazz,jlong jsiPtr,jint exglCtxId,jobject glContext)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
Java_expo_modules_gl_cpp_EXGL_EXGLContextPrepareWorklet(JNIEnv * env,jclass clazz,jint exglCtxId)38 Java_expo_modules_gl_cpp_EXGL_EXGLContextPrepareWorklet
39 (JNIEnv *env, jclass clazz, jint exglCtxId) {
40   threadLocalEnv = env;
41   EXGLContextPrepareWorklet(exglCtxId);
42 }
43 
44 JNIEXPORT void JNICALL
Java_expo_modules_gl_cpp_EXGL_EXGLContextDestroy(JNIEnv * env,jclass clazz,jint exglCtxId)45 Java_expo_modules_gl_cpp_EXGL_EXGLContextDestroy
46 (JNIEnv *env, jclass clazz, jint exglCtxId) {
47   EXGLContextDestroy(exglCtxId);
48 }
49 
50 JNIEXPORT void JNICALL
Java_expo_modules_gl_cpp_EXGL_EXGLContextFlush(JNIEnv * env,jclass clazz,jint exglCtxId)51 Java_expo_modules_gl_cpp_EXGL_EXGLContextFlush
52 (JNIEnv *env, jclass clazz, jint exglCtxId) {
53   EXGLContextFlush(exglCtxId);
54 }
55 
56 JNIEXPORT jint JNICALL
Java_expo_modules_gl_cpp_EXGL_EXGLContextCreateObject(JNIEnv * env,jclass clazz,jint exglCtxId)57 Java_expo_modules_gl_cpp_EXGL_EXGLContextCreateObject
58 (JNIEnv *env, jclass clazz, jint exglCtxId) {
59   return EXGLContextCreateObject(exglCtxId);
60 }
61 
62 JNIEXPORT void JNICALL
Java_expo_modules_gl_cpp_EXGL_EXGLContextDestroyObject(JNIEnv * env,jclass clazz,jint exglCtxId,jint exglObjId)63 Java_expo_modules_gl_cpp_EXGL_EXGLContextDestroyObject
64 (JNIEnv *env, jclass clazz, jint exglCtxId, jint exglObjId) {
65   EXGLContextDestroyObject(exglCtxId, exglObjId);
66 }
67 
68 JNIEXPORT void JNICALL
Java_expo_modules_gl_cpp_EXGL_EXGLContextMapObject(JNIEnv * env,jclass clazz,jint exglCtxId,jint exglObjId,jint glObj)69 Java_expo_modules_gl_cpp_EXGL_EXGLContextMapObject
70 (JNIEnv *env, jclass clazz, jint exglCtxId, jint exglObjId, jint glObj) {
71   EXGLContextMapObject(exglCtxId, exglObjId, glObj);
72 }
73 
74 JNIEXPORT jint JNICALL
Java_expo_modules_gl_cpp_EXGL_EXGLContextGetObject(JNIEnv * env,jclass clazz,jint exglCtxId,jint exglObjId)75 Java_expo_modules_gl_cpp_EXGL_EXGLContextGetObject
76 (JNIEnv *env, jclass clazz, jint exglCtxId, jint exglObjId) {
77   return EXGLContextGetObject(exglCtxId, exglObjId);
78 }
79 
80 JNIEXPORT bool JNICALL
Java_expo_modules_gl_cpp_EXGL_EXGLContextNeedsRedraw(JNIEnv * env,jclass clazz,jint exglCtxId)81 Java_expo_modules_gl_cpp_EXGL_EXGLContextNeedsRedraw
82 (JNIEnv *env, jclass clazz, jint exglCtxId) {
83   return EXGLContextNeedsRedraw(exglCtxId);
84 }
85 
86 JNIEXPORT void JNICALL
Java_expo_modules_gl_cpp_EXGL_EXGLContextDrawEnded(JNIEnv * env,jclass clazz,jint exglCtxId)87 Java_expo_modules_gl_cpp_EXGL_EXGLContextDrawEnded
88 (JNIEnv *env, jclass clazz, jint exglCtxId) {
89   EXGLContextDrawEnded(exglCtxId);
90 }
91 
92 }
93