From 745e1b8af25c7940406f76b3900df748cda24ff5 Mon Sep 17 00:00:00 2001 From: khanhduytran0 Date: Wed, 3 Feb 2021 10:39:53 +0700 Subject: [PATCH] [WIP] AWT input bridge --- app_pojavlauncher/src/main/jni/awt_bridge.c | 58 +++++++++++++-------- 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/app_pojavlauncher/src/main/jni/awt_bridge.c b/app_pojavlauncher/src/main/jni/awt_bridge.c index e18957254..4273ef35d 100644 --- a/app_pojavlauncher/src/main/jni/awt_bridge.c +++ b/app_pojavlauncher/src/main/jni/awt_bridge.c @@ -2,67 +2,81 @@ #include static JavaVM* dalvikJavaVMPtr; -static JNIEnv* dalvikJNIEnvPtr_ANDROID; -static JNIEnv* dalvikJNIEnvPtr_JRE; static JavaVM* runtimeJavaVMPtr; -static JNIEnv* runtimeJNIEnvPtr_ANDROID; -static JNIEnv* runtimeJNIEnvPtr_JRE; +static JNIEnv* runtimeJNIEnvPtr_GRAPHICS; +static JNIEnv* runtimeJNIEnvPtr_INPUT; + +jclass class_CTCScreen; +jmethodID method_GetRGB; + +jfieldID field_CTCRobotPeer; jint JNI_OnLoad(JavaVM* vm, void* reserved) { if (dalvikJavaVMPtr == NULL) { //Save dalvik global JavaVM pointer dalvikJavaVMPtr = vm; - (*vm)->GetEnv(vm, (void**) &dalvikJNIEnvPtr_ANDROID, JNI_VERSION_1_4); } else if (dalvikJavaVMPtr != vm) { runtimeJavaVMPtr = vm; - (*vm)->GetEnv(vm, (void**) &runtimeJNIEnvPtr_JRE, JNI_VERSION_1_4); } return JNI_VERSION_1_4; } +JNIEXPORT void JNICALL Java_net_kdt_pojavlaunch_AWTInputBridge_sendData(JNIEnv* env, jclass clazz, jint type, jint i1, jint i2, jint i3, jint i4) { + if (runtimeJNIEnvPtr_INPUT == NULL) { + if (runtimeJavaVMPtr == NULL) { + return; + } else { + (*runtimeJavaVMPtr)->AttachCurrentThread(runtimeJavaVMPtr, &runtimeJNIEnvPtr_INPUT, NULL); + } + } + + +} + // TODO: check for memory leaks // int printed = 0; int threadAttached = 0; JNIEXPORT jintArray JNICALL Java_net_kdt_pojavlaunch_utils_JREUtils_renderAWTScreenFrame(JNIEnv* env, jclass clazz /*, jobject canvas, jint width, jint height */) { - if (runtimeJNIEnvPtr_ANDROID == NULL) { + if (runtimeJNIEnvPtr_GRAPHICS == NULL) { if (runtimeJavaVMPtr == NULL) { return NULL; } else { - if (threadAttached == 0) { - (*runtimeJavaVMPtr)->AttachCurrentThread(runtimeJavaVMPtr, &runtimeJNIEnvPtr_ANDROID, NULL); - threadAttached = 1; - } + (*runtimeJavaVMPtr)->AttachCurrentThread(runtimeJavaVMPtr, &runtimeJNIEnvPtr_GRAPHICS, NULL); } } int *rgbArray; jintArray jreRgbArray, androidRgbArray; - jclass class_awt = (*runtimeJNIEnvPtr_ANDROID)->FindClass(runtimeJNIEnvPtr_ANDROID, "net/java/openjdk/cacio/ctc/CTCScreen"); - assert(class_awt != NULL); - jmethodID method_awt = (*runtimeJNIEnvPtr_ANDROID)->GetStaticMethodID(runtimeJNIEnvPtr_ANDROID, class_awt, "getCurrentScreenRGB", "()[I"); - assert(class_awt != NULL); - jreRgbArray = (jintArray) (*runtimeJNIEnvPtr_ANDROID)->CallStaticObjectMethod( - runtimeJNIEnvPtr_ANDROID, - class_awt, - method_awt + if (!method_GetRGB) { + class_CTCScreen = (*runtimeJNIEnvPtr_GRAPHICS)->FindClass(runtimeJNIEnvPtr_GRAPHICS, "net/java/openjdk/cacio/ctc/CTCScreen"); + assert(class_CTCScreen != NULL); + method_GetRGB = (*runtimeJNIEnvPtr_GRAPHICS)->GetStaticMethodID(runtimeJNIEnvPtr_GRAPHICS, class_CTCScreen, "getCurrentScreenRGB", "()[I"); + assert(method_GetRGB != NULL); + } + jreRgbArray = (jintArray) (*runtimeJNIEnvPtr_GRAPHICS)->CallStaticObjectMethod( + runtimeJNIEnvPtr_GRAPHICS, + class_CTCScreen, + method_GetRGB ); if (jreRgbArray == NULL) { return NULL; } // Copy JRE RGB array memory to Android. - int arrayLength = (*runtimeJNIEnvPtr_ANDROID)->GetArrayLength(runtimeJNIEnvPtr_ANDROID, jreRgbArray); - rgbArray = (*runtimeJNIEnvPtr_ANDROID)->GetIntArrayElements(runtimeJNIEnvPtr_ANDROID, jreRgbArray, 0); + int arrayLength = (*runtimeJNIEnvPtr_GRAPHICS)->GetArrayLength(runtimeJNIEnvPtr_GRAPHICS, jreRgbArray); + rgbArray = (*runtimeJNIEnvPtr_GRAPHICS)->GetIntArrayElements(runtimeJNIEnvPtr_GRAPHICS, jreRgbArray, 0); androidRgbArray = (*env)->NewIntArray(env, arrayLength); (*env)->SetIntArrayRegion(env, androidRgbArray, 0, arrayLength, rgbArray); - (*runtimeJNIEnvPtr_ANDROID)->ReleaseIntArrayElements(runtimeJNIEnvPtr_ANDROID, jreRgbArray, rgbArray, NULL); + (*runtimeJNIEnvPtr_GRAPHICS)->ReleaseIntArrayElements(runtimeJNIEnvPtr_GRAPHICS, jreRgbArray, rgbArray, NULL); // (*env)->DeleteLocalRef(env, androidRgbArray); // free(rgbArray); return androidRgbArray; } +JNIEXPORT void JNICALL +