From 5d67ce24c664b1355e2aa3cde33528fa90cf977a Mon Sep 17 00:00:00 2001 From: khanhduytran0 Date: Fri, 6 Nov 2020 05:20:41 +0700 Subject: [PATCH] [Input pipe] Try to fix thread not attached --- .../java/org/lwjgl/glfw/CallbackBridge.java | 6 ++--- app/src/main/jni/input_bridge_v3.c | 22 +++++++++++-------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/lwjgl/glfw/CallbackBridge.java b/app/src/main/java/org/lwjgl/glfw/CallbackBridge.java index f72cbffbd..c82a98f9b 100644 --- a/app/src/main/java/org/lwjgl/glfw/CallbackBridge.java +++ b/app/src/main/java/org/lwjgl/glfw/CallbackBridge.java @@ -28,10 +28,10 @@ public class CallbackBridge { sendMouseKeycode(button, 0, state == 1); } - private static boolean attached; + private static boolean threadAttached; public static void sendCursorPos(int x, int y) { - if (!attached) { - attached = CallbackBridge.nativeAttachThreadToOther(true, MainActivity.isInputStackCall); + if (!threadAttached) { + threadAttached = CallbackBridge.nativeAttachThreadToOther(true, MainActivity.isInputStackCall); } DEBUG_STRING.append("CursorPos=" + x + ", " + y + "\n"); diff --git a/app/src/main/jni/input_bridge_v3.c b/app/src/main/jni/input_bridge_v3.c index bfcc25d20..ab29affdc 100644 --- a/app/src/main/jni/input_bridge_v3.c +++ b/app/src/main/jni/input_bridge_v3.c @@ -36,6 +36,8 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) { //Save dalvik global JavaVM pointer dalvikJavaVMPtr = vm; (*vm)->GetEnv(vm, (void**) &dalvikJNIEnvPtr_ANDROID, JNI_VERSION_1_4); + + isUseStackQueueCall = JNI_FALSE; } else if (dalvikJavaVMPtr != vm) { runtimeJavaVMPtr = vm; (*vm)->GetEnv(vm, (void**) &runtimeJNIEnvPtr_JRE, JNI_VERSION_1_4); @@ -85,7 +87,7 @@ jboolean attachThread(bool isAndroid, JNIEnv** secondJNIEnvPtr) { LOGD("Debug: Attaching %s thread to %s, javavm.isNull=%d\n", isAndroid ? "Android" : "JRE", isAndroid ? "JRE" : "Android", (isAndroid ? runtimeJavaVMPtr : dalvikJavaVMPtr) == NULL); #endif - if (*secondJNIEnvPtr != NULL) return JNI_TRUE; + if (*secondJNIEnvPtr != NULL || !isUseStackQueueCall) return JNI_TRUE; if (isAndroid && runtimeJavaVMPtr) { (*runtimeJavaVMPtr)->AttachCurrentThread(runtimeJavaVMPtr, secondJNIEnvPtr, NULL); @@ -114,15 +116,17 @@ void sendData(int type, int i1, int i2, int i3, int i4) { #ifdef DEBUG LOGD("Debug: Send data, jnienv.isNull=%d\n", runtimeJNIEnvPtr_ANDROID == NULL); #endif - if (runtimeJNIEnvPtr_ANDROID != NULL) { - (*runtimeJNIEnvPtr_ANDROID)->CallStaticVoidMethod( - runtimeJNIEnvPtr_ANDROID, - inputBridgeClass_ANDROID, - inputBridgeMethod_ANDROID, - type, - i1, i2, i3, i4 - ); + if (runtimeJNIEnvPtr_ANDROID == NULL) { + LOGE("BUG: Input is ready but thread is not attached yet."); + return; } + (*runtimeJNIEnvPtr_ANDROID)->CallStaticVoidMethod( + runtimeJNIEnvPtr_ANDROID, + inputBridgeClass_ANDROID, + inputBridgeMethod_ANDROID, + type, + i1, i2, i3, i4 + ); } JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_CallbackBridge_nativeAttachThreadToOther(JNIEnv* env, jclass clazz, jboolean isAndroid, jboolean isUseStackQueue) {