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_EXGLContextPrepareWorklet 39 (JNIEnv *env, jclass clazz, jint exglCtxId) { 40 threadLocalEnv = env; 41 EXGLContextPrepareWorklet(exglCtxId); 42 } 43 44 JNIEXPORT void JNICALL 45 Java_expo_modules_gl_cpp_EXGL_EXGLContextDestroy 46 (JNIEnv *env, jclass clazz, jint exglCtxId) { 47 EXGLContextDestroy(exglCtxId); 48 } 49 50 JNIEXPORT void JNICALL 51 Java_expo_modules_gl_cpp_EXGL_EXGLContextFlush 52 (JNIEnv *env, jclass clazz, jint exglCtxId) { 53 EXGLContextFlush(exglCtxId); 54 } 55 56 JNIEXPORT jint JNICALL 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 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 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 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 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 87 Java_expo_modules_gl_cpp_EXGL_EXGLContextDrawEnded 88 (JNIEnv *env, jclass clazz, jint exglCtxId) { 89 EXGLContextDrawEnded(exglCtxId); 90 } 91 92 } 93