From 8a6d23a06fc03209d17390ade9ec6043f6716aac Mon Sep 17 00:00:00 2001 From: khanhduytran0 Date: Wed, 9 Sep 2020 06:09:50 +0700 Subject: [PATCH] JNI: Attach Android thread to JRE, is it safe? --- app/src/main/jni/egl_bridge.c | 2 +- app/src/main/jni/input_bridge.c | 7 ++++++- app/src/main/jni/jre_launcher.c | 2 +- app/src/main/jni/utils.h | 5 ++++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/src/main/jni/egl_bridge.c b/app/src/main/jni/egl_bridge.c index a0bcf3eeb..b8a48faaf 100644 --- a/app/src/main/jni/egl_bridge.c +++ b/app/src/main/jni/egl_bridge.c @@ -154,7 +154,7 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_GLFW_nativeEglMakeCurrent(JNIEnv* printf("First frame error: %p\n", eglGetError()); #endif - isEglMakeCurrentCalled = 1; + isInputReady = true; return success == EGL_TRUE ? JNI_TRUE : JNI_FALSE; } diff --git a/app/src/main/jni/input_bridge.c b/app/src/main/jni/input_bridge.c index d6b4b781d..28c1bbfed 100644 --- a/app/src/main/jni/input_bridge.c +++ b/app/src/main/jni/input_bridge.c @@ -3,7 +3,12 @@ #include "utils.h" JNIEXPORT void JNICALL Java_net_kdt_pojavlaunch_LWJGLInputSender_sendDataToJRE(JNIEnv* env, jclass clazz, jint type, jstring data) { - if (isEglMakeCurrentCalled == 1) { + if (isInputReady) { + if (!isAndroidThreadAttached) { + (*runtimeJavaVMPtr)->AttachCurrentThread(runtimeJavaVMPtr, &runtimeJNIEnvPtr, NULL); + isAndroidThreadAttached = true; + } + // Convert Dalvik string to JRE string: should or use directly? char *data_c = (char*)(*env)->GetStringUTFChars(env, data, 0); jstring data_jre = (*runtimeJNIEnvPtr)->NewStringUTF(runtimeJNIEnvPtr, data_c); diff --git a/app/src/main/jni/jre_launcher.c b/app/src/main/jni/jre_launcher.c index e92fb38fe..4cbd54f35 100644 --- a/app/src/main/jni/jre_launcher.c +++ b/app/src/main/jni/jre_launcher.c @@ -68,7 +68,7 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) */ } else if (dalvikJavaVMPtr != vm) { runtimeJavaVMPtr = vm; - (*vm)->GetEnv(vm, (void**) &runtimeJNIEnvPtr, JNI_VERSION_1_4); + // (*vm)->GetEnv(vm, (void**) &runtimeJNIEnvPtr, JNI_VERSION_1_4); } LOGD("JNI_OnLoad returning()"); return JNI_VERSION_1_4; diff --git a/app/src/main/jni/utils.h b/app/src/main/jni/utils.h index 4682d2777..202b0a607 100644 --- a/app/src/main/jni/utils.h +++ b/app/src/main/jni/utils.h @@ -1,13 +1,16 @@ #ifndef _BINARY_UTILS_H_ #define _BINARY_UTILS_H_ +#include + JavaVM *runtimeJavaVMPtr; JNIEnv *runtimeJNIEnvPtr; JavaVM *dalvikJavaVMPtr; JNIEnv *dalvikJNIEnvPtr; -int isEglMakeCurrentCalled; +bool isInputReady; +bool isAndroidThreadAttached; char** convert_to_char_array(JNIEnv *env, jobjectArray jstringArray); jobjectArray convert_from_char_array(JNIEnv *env, char **charArray, int num_rows);