Fix crash

This commit is contained in:
khanhduytran0 2020-09-18 20:38:03 +07:00
parent e9b231b866
commit 389919d81a

View File

@ -2,8 +2,11 @@
#include "utils.h" #include "utils.h"
jclass inputBridgeClass; jclass inputBridgeClass_ANDROID;
jmethodID inputBridgeMethod; jmethodID inputBridgeMethod_ANDROID;
jclass inputBridgeClass_JRE;
jmethodID inputBridgeMethod_JRE;
JavaVM* firstJavaVM; JavaVM* firstJavaVM;
JNIEnv* firstJNIEnv; JNIEnv* firstJNIEnv;
@ -31,6 +34,13 @@ void attachThreadIfNeed(bool* isAttached, JNIEnv** secondJNIEnvPtr) {
secondJNIEnv = *secondJNIEnvPtr; secondJNIEnv = *secondJNIEnvPtr;
} }
void getJavaInputBridge(jclass* clazz, jmethod* method) {
if (*method == NULL) {
*clazz = (*secondJNIEnv)->FindClass(secondJNIEnv, "org/lwjgl/glfw/CallbackBridge");
*method = (*secondJNIEnv)->GetStaticMethodID(secondJNIEnv, *clazz, "receiveCallback", "(ILjava/lang/String;)V");
}
}
JNIEXPORT void JNICALL Java_org_lwjgl_glfw_CallbackBridge_nativeSendData(JNIEnv* env, jclass clazz, jboolean isAndroid, jint type, jstring data) { JNIEXPORT void JNICALL Java_org_lwjgl_glfw_CallbackBridge_nativeSendData(JNIEnv* env, jclass clazz, jboolean isAndroid, jint type, jstring data) {
if (isAndroid == JNI_TRUE) { if (isAndroid == JNI_TRUE) {
firstJavaVM = dalvikJavaVMPtr; firstJavaVM = dalvikJavaVMPtr;
@ -38,12 +48,14 @@ JNIEXPORT void JNICALL Java_org_lwjgl_glfw_CallbackBridge_nativeSendData(JNIEnv*
secondJavaVM = runtimeJavaVMPtr; secondJavaVM = runtimeJavaVMPtr;
attachThreadIfNeed(&isAndroidThreadAttached, &runtimeJNIEnvPtr_ANDROID); attachThreadIfNeed(&isAndroidThreadAttached, &runtimeJNIEnvPtr_ANDROID);
getJavaInputBridge(&inputBridgeClass_ANDROID, &inputBridgeMethod_ANDROID);
} else { } else {
firstJavaVM = runtimeJavaVMPtr; firstJavaVM = runtimeJavaVMPtr;
firstJNIEnv = runtimeJNIEnvPtr_JRE; firstJNIEnv = runtimeJNIEnvPtr_JRE;
secondJavaVM = dalvikJavaVMPtr; secondJavaVM = dalvikJavaVMPtr;
attachThreadIfNeed(&isRuntimeThreadAttached, &dalvikJNIEnvPtr_JRE); attachThreadIfNeed(&isRuntimeThreadAttached, &dalvikJNIEnvPtr_JRE);
getJavaInputBridge(&inputBridgeClass_JRE, &inputBridgeMethod_JRE);
} }
// printf("isAndroid=%p, isSecondJVMNull=%p\n", isAndroid, secondJavaVM == NULL); // printf("isAndroid=%p, isSecondJVMNull=%p\n", isAndroid, secondJavaVM == NULL);
@ -53,12 +65,13 @@ JNIEXPORT void JNICALL Java_org_lwjgl_glfw_CallbackBridge_nativeSendData(JNIEnv*
// printf("data=%s\n", data_c); // printf("data=%s\n", data_c);
jstring data_jre = (*secondJNIEnv)->NewStringUTF(secondJNIEnv, data_c); jstring data_jre = (*secondJNIEnv)->NewStringUTF(secondJNIEnv, data_c);
(*env)->ReleaseStringUTFChars(env, data, data_c); (*env)->ReleaseStringUTFChars(env, data, data_c);
(*secondJNIEnv)->CallStaticVoidMethod(
if (inputBridgeMethod == NULL) { secondJNIEnv,
inputBridgeClass = (*secondJNIEnv)->FindClass(secondJNIEnv, "org/lwjgl/glfw/CallbackBridge"); isAndroid == JNI_TRUE ? inputBridgeClass_ANDROID : inputBridgeClass_JRE,
inputBridgeMethod = (*secondJNIEnv)->GetStaticMethodID(secondJNIEnv, inputBridgeClass, "receiveCallback", "(ILjava/lang/String;)V"); isAndroid == JNI_TRUE ? inputBridgeMethod_ANDROID : inputBridgeMethod_JRE,
} type,
(*secondJNIEnv)->CallStaticVoidMethod(secondJNIEnv, inputBridgeClass, inputBridgeMethod, type, data_jre); data_jre
);
} }
// else: too early! // else: too early!
} }