mirror of
https://github.com/AngelAuraMC/Amethyst-Android.git
synced 2025-09-18 09:07:48 -04:00
[WIP] AWT input bridge
This commit is contained in:
parent
329cbca489
commit
745e1b8af2
@ -2,67 +2,81 @@
|
||||
#include <assert.h>
|
||||
|
||||
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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user