@@ -48,6 +48,10 @@ jint JNI_OnLoad(JavaVM* vm, __attribute__((unused)) void* reserved) {
4848 LOGI ("Saving DVM environ..." );
4949 //Save dalvik global JavaVM pointer
5050 pojav_environ -> dalvikJavaVMPtr = vm ;
51+ // Sets up the stuff that GLFW/JVM needs to communicate to Android
52+ // These methods are called from GLFW/JVM and connect to Android-side impls
53+ // These aren't separated out into a method because these can be ran so long as we are in Android-land
54+ // so that means this library must be loaded at least once in Android-land
5155 JNIEnv * dvEnv ;
5256 (* vm )-> GetEnv (vm , (void * * ) & dvEnv , JNI_VERSION_1_4 );
5357 pojav_environ -> bridgeClazz = (* dvEnv )-> NewGlobalRef (dvEnv ,(* dvEnv ) -> FindClass (dvEnv ,"org/lwjgl/glfw/CallbackBridge" ));
@@ -60,17 +64,7 @@ jint JNI_OnLoad(JavaVM* vm, __attribute__((unused)) void* reserved) {
6064 LOGI ("Saving JVM environ..." );
6165 pojav_environ -> runtimeJavaVMPtr = vm ;
6266 JNIEnv * vmEnv ;
63- (* vm )-> GetEnv (vm , (void * * ) & vmEnv , JNI_VERSION_1_4 );
64- pojav_environ -> vmGlfwClass = (* vmEnv )-> NewGlobalRef (vmEnv , (* vmEnv )-> FindClass (vmEnv , "org/lwjgl/glfw/GLFW" ));
65- pojav_environ -> method_glftSetWindowAttrib = (* vmEnv )-> GetStaticMethodID (vmEnv , pojav_environ -> vmGlfwClass , "glfwSetWindowAttrib" , "(JII)V" );
66- pojav_environ -> method_internalWindowSizeChanged = (* vmEnv )-> GetStaticMethodID (vmEnv , pojav_environ -> vmGlfwClass , "internalWindowSizeChanged" , "(J)V" );
67- pojav_environ -> method_internalChangeMonitorSize = (* vmEnv )-> GetStaticMethodID (vmEnv , pojav_environ -> vmGlfwClass , "internalChangeMonitorSize" , "(II)V" );
68- jfieldID field_keyDownBuffer = (* vmEnv )-> GetStaticFieldID (vmEnv , pojav_environ -> vmGlfwClass , "keyDownBuffer" , "Ljava/nio/ByteBuffer;" );
69- jobject keyDownBufferJ = (* vmEnv )-> GetStaticObjectField (vmEnv , pojav_environ -> vmGlfwClass , field_keyDownBuffer );
70- pojav_environ -> keyDownBuffer = (* vmEnv )-> GetDirectBufferAddress (vmEnv , keyDownBufferJ );
71- jfieldID field_mouseDownBuffer = (* vmEnv )-> GetStaticFieldID (vmEnv , pojav_environ -> vmGlfwClass , "mouseDownBuffer" , "Ljava/nio/ByteBuffer;" );
72- jobject mouseDownBufferJ = (* vmEnv )-> GetStaticObjectField (vmEnv , pojav_environ -> vmGlfwClass , field_mouseDownBuffer );
73- pojav_environ -> mouseDownBuffer = (* vmEnv )-> GetDirectBufferAddress (vmEnv , mouseDownBufferJ );
67+ (* pojav_environ -> runtimeJavaVMPtr )-> GetEnv (pojav_environ -> runtimeJavaVMPtr , (void * * ) & vmEnv , JNI_VERSION_1_4 );
7468 hookExec (vmEnv );
7569 installLwjglDlopenHook (vmEnv );
7670 installEMUIIteratorMititgation (vmEnv );
@@ -87,6 +81,26 @@ jint JNI_OnLoad(JavaVM* vm, __attribute__((unused)) void* reserved) {
8781 return JNI_VERSION_1_4 ;
8882}
8983
84+ // Sets up the stuff that Android needs to communicate to GLFW/JVM
85+ // These methods are called from Android and connect to GLFW/JVM-side impls
86+ // These are separated out into a method because GLFW loads much later than when we need to dlopen
87+ // pojavexec since it does more than just GLFW.
88+ // TODO: Add checks in case someone forgets to run this method. Probably see if pojav_environ->vmGlfwClass is null or not
89+ JNIEXPORT void JNICALL Java_org_lwjgl_glfw_GLFW_nativeInitializeGLFWNativeBridge (__attribute__((unused )) JNIEnv * env , __attribute__((unused )) jclass clazz ) {
90+ JNIEnv * vmEnv ;
91+ (* pojav_environ -> runtimeJavaVMPtr )-> GetEnv (pojav_environ -> runtimeJavaVMPtr , (void * * ) & vmEnv , JNI_VERSION_1_4 );
92+ pojav_environ -> vmGlfwClass = (* vmEnv )-> NewGlobalRef (vmEnv , (* vmEnv )-> FindClass (vmEnv , "org/lwjgl/glfw/GLFW" ));
93+ pojav_environ -> method_glftSetWindowAttrib = (* vmEnv )-> GetStaticMethodID (vmEnv , pojav_environ -> vmGlfwClass , "glfwSetWindowAttrib" , "(JII)V" );
94+ pojav_environ -> method_internalWindowSizeChanged = (* vmEnv )-> GetStaticMethodID (vmEnv , pojav_environ -> vmGlfwClass , "internalWindowSizeChanged" , "(J)V" );
95+ pojav_environ -> method_internalChangeMonitorSize = (* vmEnv )-> GetStaticMethodID (vmEnv , pojav_environ -> vmGlfwClass , "internalChangeMonitorSize" , "(II)V" );
96+ jfieldID field_keyDownBuffer = (* vmEnv )-> GetStaticFieldID (vmEnv , pojav_environ -> vmGlfwClass , "keyDownBuffer" , "Ljava/nio/ByteBuffer;" );
97+ jobject keyDownBufferJ = (* vmEnv )-> GetStaticObjectField (vmEnv , pojav_environ -> vmGlfwClass , field_keyDownBuffer );
98+ pojav_environ -> keyDownBuffer = (* vmEnv )-> GetDirectBufferAddress (vmEnv , keyDownBufferJ );
99+ jfieldID field_mouseDownBuffer = (* vmEnv )-> GetStaticFieldID (vmEnv , pojav_environ -> vmGlfwClass , "mouseDownBuffer" , "Ljava/nio/ByteBuffer;" );
100+ jobject mouseDownBufferJ = (* vmEnv )-> GetStaticObjectField (vmEnv , pojav_environ -> vmGlfwClass , field_mouseDownBuffer );
101+ pojav_environ -> mouseDownBuffer = (* vmEnv )-> GetDirectBufferAddress (vmEnv , mouseDownBufferJ );
102+ }
103+
90104#define ADD_CALLBACK_WWIN (NAME ) \
91105JNIEXPORT jlong JNICALL Java_org_lwjgl_glfw_GLFW_nglfwSet##NAME##Callback(JNIEnv * env, jclass cls, jlong window, jlong callbackptr) { \
92106 void** oldCallback = (void**) &pojav_environ->GLFW_invoke_##NAME; \
0 commit comments