[Input pipe] Try to fix thread not attached

This commit is contained in:
khanhduytran0 2020-11-06 05:20:41 +07:00
parent 5428dbdf61
commit 5d67ce24c6
2 changed files with 16 additions and 12 deletions

View File

@ -28,10 +28,10 @@ public class CallbackBridge {
sendMouseKeycode(button, 0, state == 1); sendMouseKeycode(button, 0, state == 1);
} }
private static boolean attached; private static boolean threadAttached;
public static void sendCursorPos(int x, int y) { public static void sendCursorPos(int x, int y) {
if (!attached) { if (!threadAttached) {
attached = CallbackBridge.nativeAttachThreadToOther(true, MainActivity.isInputStackCall); threadAttached = CallbackBridge.nativeAttachThreadToOther(true, MainActivity.isInputStackCall);
} }
DEBUG_STRING.append("CursorPos=" + x + ", " + y + "\n"); DEBUG_STRING.append("CursorPos=" + x + ", " + y + "\n");

View File

@ -36,6 +36,8 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) {
//Save dalvik global JavaVM pointer //Save dalvik global JavaVM pointer
dalvikJavaVMPtr = vm; dalvikJavaVMPtr = vm;
(*vm)->GetEnv(vm, (void**) &dalvikJNIEnvPtr_ANDROID, JNI_VERSION_1_4); (*vm)->GetEnv(vm, (void**) &dalvikJNIEnvPtr_ANDROID, JNI_VERSION_1_4);
isUseStackQueueCall = JNI_FALSE;
} else if (dalvikJavaVMPtr != vm) { } else if (dalvikJavaVMPtr != vm) {
runtimeJavaVMPtr = vm; runtimeJavaVMPtr = vm;
(*vm)->GetEnv(vm, (void**) &runtimeJNIEnvPtr_JRE, JNI_VERSION_1_4); (*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); LOGD("Debug: Attaching %s thread to %s, javavm.isNull=%d\n", isAndroid ? "Android" : "JRE", isAndroid ? "JRE" : "Android", (isAndroid ? runtimeJavaVMPtr : dalvikJavaVMPtr) == NULL);
#endif #endif
if (*secondJNIEnvPtr != NULL) return JNI_TRUE; if (*secondJNIEnvPtr != NULL || !isUseStackQueueCall) return JNI_TRUE;
if (isAndroid && runtimeJavaVMPtr) { if (isAndroid && runtimeJavaVMPtr) {
(*runtimeJavaVMPtr)->AttachCurrentThread(runtimeJavaVMPtr, secondJNIEnvPtr, NULL); (*runtimeJavaVMPtr)->AttachCurrentThread(runtimeJavaVMPtr, secondJNIEnvPtr, NULL);
@ -114,7 +116,10 @@ void sendData(int type, int i1, int i2, int i3, int i4) {
#ifdef DEBUG #ifdef DEBUG
LOGD("Debug: Send data, jnienv.isNull=%d\n", runtimeJNIEnvPtr_ANDROID == NULL); LOGD("Debug: Send data, jnienv.isNull=%d\n", runtimeJNIEnvPtr_ANDROID == NULL);
#endif #endif
if (runtimeJNIEnvPtr_ANDROID != NULL) { if (runtimeJNIEnvPtr_ANDROID == NULL) {
LOGE("BUG: Input is ready but thread is not attached yet.");
return;
}
(*runtimeJNIEnvPtr_ANDROID)->CallStaticVoidMethod( (*runtimeJNIEnvPtr_ANDROID)->CallStaticVoidMethod(
runtimeJNIEnvPtr_ANDROID, runtimeJNIEnvPtr_ANDROID,
inputBridgeClass_ANDROID, inputBridgeClass_ANDROID,
@ -122,7 +127,6 @@ void sendData(int type, int i1, int i2, int i3, int i4) {
type, type,
i1, i2, i3, i4 i1, i2, i3, i4
); );
}
} }
JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_CallbackBridge_nativeAttachThreadToOther(JNIEnv* env, jclass clazz, jboolean isAndroid, jboolean isUseStackQueue) { JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_CallbackBridge_nativeAttachThreadToOther(JNIEnv* env, jclass clazz, jboolean isAndroid, jboolean isUseStackQueue) {