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