From c5f753d040bdc2594ec71793a73eb1f795ce3637 Mon Sep 17 00:00:00 2001 From: khanhduytran0 Date: Thu, 5 Nov 2020 12:24:27 +0700 Subject: [PATCH] [Mod installer] Bug fix: thread never attached --- .../java/net/kdt/pojavlaunch/AsyncThread.java | 40 ------------------- .../kdt/pojavlaunch/InstallModActivity.java | 18 ++++++--- .../java/org/lwjgl/glfw/CallbackBridge.java | 8 +++- app/src/main/jni/input_bridge_v3.c | 3 ++ 4 files changed, 22 insertions(+), 47 deletions(-) delete mode 100644 app/src/main/java/net/kdt/pojavlaunch/AsyncThread.java diff --git a/app/src/main/java/net/kdt/pojavlaunch/AsyncThread.java b/app/src/main/java/net/kdt/pojavlaunch/AsyncThread.java deleted file mode 100644 index 4bc4777ee..000000000 --- a/app/src/main/java/net/kdt/pojavlaunch/AsyncThread.java +++ /dev/null @@ -1,40 +0,0 @@ -package net.kdt.pojavlaunch; - -import android.support.annotation.*; - -public abstract class AsyncThread extends Thread -{ - private boolean isCancelled = true; - - @WorkerThread - protected abstract Result doInBackground(Params... params); - - @MainThread - protected void onPreExecute() {} - - @SuppressWarnings({"UnusedDeclaration"}) - @MainThread - protected void onPostExecute(Result result) {} - - @SuppressWarnings({"UnusedDeclaration"}) - @MainThread - protected void onProgressUpdate(Progress... values) {} - - @SuppressWarnings({"UnusedParameters"}) - @MainThread - protected void onCancelled(Result result) { - onCancelled(); - } - - @MainThread - protected void onCancelled() {} - - public final boolean isCancelled() { - return isCancelled; - } - - public final boolean cancel() { - super.stop(); - return true; - } -} diff --git a/app/src/main/java/net/kdt/pojavlaunch/InstallModActivity.java b/app/src/main/java/net/kdt/pojavlaunch/InstallModActivity.java index c9c99ed90..2034882c5 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/InstallModActivity.java +++ b/app/src/main/java/net/kdt/pojavlaunch/InstallModActivity.java @@ -70,13 +70,21 @@ public class InstallModActivity extends LoggableActivity { // final Surface surface = new Surface(tex); new Thread(new Runnable(){ + private boolean attached = false; @Override public void run() { - while (IS_JRE_RUNNING) { - Canvas canvas = mTextureView.lockCanvas(); - JREUtils.renderAWTScreenFrame(canvas, w, h); - mTextureView.unlockCanvasAndPost(canvas); - } + try { + while (IS_JRE_RUNNING) { + if (!attached) { + attached = CallbackBridge.nativeAttachThreadToOther(true, MainActivity.isInputStackCall); + Thread.sleep(100); + continue; + } + Canvas canvas = mTextureView.lockCanvas(); + JREUtils.renderAWTScreenFrame(canvas, w, h); + mTextureView.unlockCanvasAndPost(canvas); + } + } catch (InterruptedException e) {} } }, "AWTSurfaceUpdater").start(); diff --git a/app/src/main/java/org/lwjgl/glfw/CallbackBridge.java b/app/src/main/java/org/lwjgl/glfw/CallbackBridge.java index 54944882b..f72cbffbd 100644 --- a/app/src/main/java/org/lwjgl/glfw/CallbackBridge.java +++ b/app/src/main/java/org/lwjgl/glfw/CallbackBridge.java @@ -28,7 +28,12 @@ public class CallbackBridge { sendMouseKeycode(button, 0, state == 1); } + private static boolean attached; public static void sendCursorPos(int x, int y) { + if (!attached) { + attached = CallbackBridge.nativeAttachThreadToOther(true, MainActivity.isInputStackCall); + } + DEBUG_STRING.append("CursorPos=" + x + ", " + y + "\n"); mouseX = x; mouseY = y; @@ -119,7 +124,7 @@ public class CallbackBridge { private static native void nativeSendData(boolean isAndroid, int type, String data); */ - public static native void nativeAttachThreadToOther(boolean isAndroid, boolean isUsePushPoll); + public static native boolean nativeAttachThreadToOther(boolean isAndroid, boolean isUsePushPoll); private static native boolean nativeSendChar(int codepoint); // GLFW: GLFWCharModsCallback deprecated, but is Minecraft still use? private static native boolean nativeSendCharMods(int codepoint, int mods); @@ -135,7 +140,6 @@ public class CallbackBridge { static { System.loadLibrary("pojavexec"); - CallbackBridge.nativeAttachThreadToOther(true, MainActivity.isInputStackCall); } } diff --git a/app/src/main/jni/input_bridge_v3.c b/app/src/main/jni/input_bridge_v3.c index a5c00ef15..e13bab041 100644 --- a/app/src/main/jni/input_bridge_v3.c +++ b/app/src/main/jni/input_bridge_v3.c @@ -81,6 +81,9 @@ void attachThread(bool isAndroid, JNIEnv** secondJNIEnvPtr) { #ifdef DEBUG 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; + if (isAndroid && runtimeJavaVMPtr) { (*runtimeJavaVMPtr)->AttachCurrentThread(runtimeJavaVMPtr, secondJNIEnvPtr, NULL); } else if (!isAndroid && dalvikJavaVMPtr) {