From 86deaf55c0e92f6e8427db74d5b488ee590232fd Mon Sep 17 00:00:00 2001 From: khanhduytran0 Date: Fri, 11 Dec 2020 18:47:25 +0700 Subject: [PATCH] Bug fix: game stills run after close window --- app/src/main/jni/egl_bridge.c | 14 +++++++++++++- app/src/main/jni/input_bridge_v3.c | 13 +++++++++++++ app/src/main/jni/utils.h | 2 ++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/app/src/main/jni/egl_bridge.c b/app/src/main/jni/egl_bridge.c index 32e209893..04686c739 100644 --- a/app/src/main/jni/egl_bridge.c +++ b/app/src/main/jni/egl_bridge.c @@ -190,8 +190,20 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL_nativeRegalMakeCurrent(JNIEnv *e RegalMakeCurrent(potatoBridge.eglContext); } +bool stopMakeCurrent; JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_GLFW_nativeEglSwapBuffers(JNIEnv *env, jclass clazz) { - return eglSwapBuffers(potatoBridge.eglDisplay, potatoBridge.eglSurface); + if (stopMakeCurrent) { + return JNI_FALSE; + } + + jboolean result = (jboolean) eglSwapBuffers(potatoBridge.eglDisplay, potatoBridge.eglSurface); + if (!result) { + if (eglGetError() == EGL_BAD_SURFACE) { + stopMakeCurrent = true; + closeGLFWWindow(); + } + } + return result; } JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_GLFW_nativeEglSwapInterval(JNIEnv *env, jclass clazz, jint interval) { diff --git a/app/src/main/jni/input_bridge_v3.c b/app/src/main/jni/input_bridge_v3.c index 679514637..a0894a3d4 100644 --- a/app/src/main/jni/input_bridge_v3.c +++ b/app/src/main/jni/input_bridge_v3.c @@ -138,6 +138,19 @@ void sendData(int type, int i1, int i2, int i3, int i4) { ); } +void closeGLFWWindow() { + jclass glfwClazz = (*runtimeJNIEnvPtr_JRE)->FindClass(runtimeJNIEnvPtr_JRE, "org/lwjgl/glfw/GLFW"); + assert(glfwClazz != NULL); + jmethodID glfwMethod = (*runtimeJNIEnvPtr_JRE)->GetStaticMethodID(runtimeJNIEnvPtr_JRE, glfwMethod, "glfwSetWindowShouldClose", "(JZ)V"); + assert(glfwMethod != NULL); + + (*runtimeJNIEnvPtr_JRE)->CallStaticVoidMethod( + runtimeJNIEnvPtr_JRE, + glfwClazz, glfwMethod, + (jlong) showingWindow, JNI_TRUE + ); +} + JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_CallbackBridge_nativeAttachThreadToOther(JNIEnv* env, jclass clazz, jboolean isAndroid, jboolean isUseStackQueueBool) { #ifdef DEBUG LOGD("Debug: JNI attaching thread, isUseStackQueue=%d\n", isUseStackQueue); diff --git a/app/src/main/jni/utils.h b/app/src/main/jni/utils.h index dcebbeb66..d93933a2d 100644 --- a/app/src/main/jni/utils.h +++ b/app/src/main/jni/utils.h @@ -22,5 +22,7 @@ char** convert_to_char_array(JNIEnv *env, jobjectArray jstringArray); jobjectArray convert_from_char_array(JNIEnv *env, char **charArray, int num_rows); void free_char_array(JNIEnv *env, jobjectArray jstringArray, const char **charArray); +void closeGLFWWindow(); + #endif // _BINARY_UTILS_H_