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