Try fix JavaVM and JNIEnv "maze"

This commit is contained in:
khanhduytran0
2020-09-17 17:22:07 +07:00
parent 3788842c1f
commit eb649071ac
3 changed files with 24 additions and 32 deletions

View File

@@ -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) {

View File

@@ -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;

View File

@@ -4,10 +4,12 @@
#include <stdbool.h>
JavaVM* runtimeJavaVMPtr;
JNIEnv* runtimeJNIEnvPtr;
JNIEnv* runtimeJNIEnvPtr_ANDROID;
JNIEnv* runtimeJNIEnvPtr_JRE;
JavaVM* dalvikJavaVMPtr;
JNIEnv* dalvikJNIEnvPtr;
JNIEnv* dalvikJNIEnvPtr_ANDROID;
JNIEnv* dalvikJNIEnvPtr_JRE;
bool isAndroidThreadAttached, isRuntimeThreadAttached;