diff --git a/app/src/main/jni/input_bridge.c b/app/src/main/jni/input_bridge.c index 9e6ff453b..3f1f33097 100644 --- a/app/src/main/jni/input_bridge.c +++ b/app/src/main/jni/input_bridge.c @@ -11,28 +11,39 @@ JNIEnv* firstJNIEnv; JavaVM* secondJavaVM; JNIEnv* secondJNIEnv; -void attachThreadIfNeed(bool* isAttached) { - if (!*isAttached && secondJavaVM && secondJNIEnv) { - (*secondJavaVM)->AttachCurrentThread(secondJavaVM, &secondJNIEnv, NULL); +jint JNI_OnLoad(JavaVM* vm, void* reserved) { + if (dalvikJavaVMPtr_ANDROID == NULL) { + //Save dalvik global JavaVM pointer + dalvikJavaVMPtr_ANDROID = vm; + (*vm)->GetEnv(vm, (void**) &dalvikJNIEnvPtr_ANDROID, JNI_VERSION_1_4); + } else if (dalvikJavaVMPtr_ANDROID != vm) { + runtimeJavaVMPtr_JRE = vm; + (*vm)->GetEnv(vm, (void**) &runtimeJNIEnvPtr_JRE, JNI_VERSION_1_4); + } + return JNI_VERSION_1_4; +} + +void attachThreadIfNeed(bool* isAttached, JNIEnv** secondJNIEnvPtr) { + if (!*isAttached && secondJavaVM) { + (*secondJavaVM)->AttachCurrentThread(secondJavaVM, secondJNIEnvPtr, NULL); *isAttached = true; } + secondJNIEnv = *secondJNIEnvPtr; } JNIEXPORT void JNICALL Java_org_lwjgl_glfw_CallbackBridge_nativeSendData(JNIEnv* env, jclass clazz, jboolean isAndroid, jint type, jstring data) { if (isAndroid == JNI_TRUE) { firstJavaVM = dalvikJavaVMPtr; - firstJNIEnv = dalvikJNIEnvPtr; + firstJNIEnv = dalvikJNIEnvPtr_ANDROID; secondJavaVM = runtimeJavaVMPtr; - secondJNIEnv = runtimeJNIEnvPtr; - attachThreadIfNeed(&isAndroidThreadAttached); + attachThreadIfNeed(&isAndroidThreadAttached, &runtimeJNIEnvPtr_ANDROID); } else { firstJavaVM = runtimeJavaVMPtr; - firstJNIEnv = runtimeJNIEnvPtr; + firstJNIEnv = runtimeJNIEnvPtr_JRE; secondJavaVM = dalvikJavaVMPtr; - secondJNIEnv = dalvikJNIEnvPtr; - attachThreadIfNeed(&isRuntimeThreadAttached); + attachThreadIfNeed(&isRuntimeThreadAttached, dalvikJNIEnvPtr_JRE); } if (secondJavaVM != NULL) { diff --git a/app/src/main/jni/jre_launcher.c b/app/src/main/jni/jre_launcher.c index a05451557..e30ba86b3 100644 --- a/app/src/main/jni/jre_launcher.c +++ b/app/src/main/jni/jre_launcher.c @@ -55,27 +55,6 @@ typedef jint JLI_Launch_func(int argc, char ** argv, /* main argc, argc */ jint ergo /* ergonomics class policy */ ); -jint JNI_OnLoad(JavaVM* vm, void* reserved) -{ - if (dalvikJavaVMPtr == NULL) { - //Save dalvik global JavaVM pointer - dalvikJavaVMPtr = vm; - (*vm)->GetEnv(vm, (void**) &dalvikJNIEnvPtr, JNI_VERSION_1_4); -/* Boardwalk: not used - LOGD("JNI_OnLoad calling GetEnv()"); - JNIEnv* env = NULL; - (*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4); - LOGD("JNI_OnLoad calling initDalvikProxySelectorData()"); - initDalvikProxySelectorData(env); -*/ - } else if (&dalvikJavaVMPtr != &vm) { - runtimeJavaVMPtr = vm; - // (*vm)->GetEnv(vm, (void**) &runtimeJNIEnvPtr, JNI_VERSION_1_4); - } - LOGD("JNI_OnLoad returning()"); - return JNI_VERSION_1_4; -} - static void logArgs(int argc, char** argv) { /* BlockLauncher: disable logging int i; diff --git a/app/src/main/jni/utils.h b/app/src/main/jni/utils.h index bd3ef4cba..f35e51a7e 100644 --- a/app/src/main/jni/utils.h +++ b/app/src/main/jni/utils.h @@ -4,10 +4,12 @@ #include JavaVM* runtimeJavaVMPtr; -JNIEnv* runtimeJNIEnvPtr; +JNIEnv* runtimeJNIEnvPtr_ANDROID; +JNIEnv* runtimeJNIEnvPtr_JRE; JavaVM* dalvikJavaVMPtr; -JNIEnv* dalvikJNIEnvPtr; +JNIEnv* dalvikJNIEnvPtr_ANDROID; +JNIEnv* dalvikJNIEnvPtr_JRE; bool isAndroidThreadAttached, isRuntimeThreadAttached;