Skip to content

Commit 7691642

Browse files
committed
[WIP] Fix 26.2-snapshot-4 crash
TODO: Move loading pojavexec into the source lwjgl libs so we don't have to go back to merging (ew)
1 parent b85067c commit 7691642

11 files changed

Lines changed: 690 additions & 17 deletions

File tree

Binary file not shown.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
d562b83d28c54d14bbb2f0366ed428945100310e
1+
605f98796568deed3c6b9f22fef7f4d828e4d81c
Binary file not shown.
Binary file not shown.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3999dc44bce7e9d269e034e79c7e430f88a50f3e
1+
7c5d00495518243f799de8c1e3f6c8393f2f64d6

app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -862,9 +862,13 @@ public static String generateLaunchClasspath(JMinecraftVersionList.Version info,
862862
String internalLwjglVersion = iLwjglVersion >= 341 ? "3.4.1" : "3.3.3";
863863
File lwjgl3Folder = new File(Tools.DIR_GAME_HOME, "lwjgl3/"+internalLwjglVersion);
864864
String lwjglCore = lwjgl3Folder.getAbsolutePath() + "/lwjgl.jar";
865+
String lwjglMerged = lwjgl3Folder.getAbsolutePath() + "/lwjgl-"+internalLwjglVersion+"-merged-modules";
865866
String lwjglxFile = lwjgl3Folder + "/lwjgl-lwjglx.jar";
866867

868+
867869
launchClasspath.append(lwjglCore).append(":");
870+
// 2nd in priority in case we need to merge lwjgl.jar again for testing
871+
launchClasspath.append(lwjglMerged).append(":");
868872

869873
File[] lwjglModules = lwjgl3Folder.listFiles(pathname ->
870874
pathname.getName().endsWith(".jar") &&

app_pojavlauncher/src/main/jni/input_bridge_v3.c

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ jint JNI_OnLoad(JavaVM* vm, __attribute__((unused)) void* reserved) {
4848
LOGI("Saving DVM environ...");
4949
//Save dalvik global JavaVM pointer
5050
pojav_environ->dalvikJavaVMPtr = vm;
51+
// Sets up the stuff that GLFW/JVM needs to communicate to Android
52+
// These methods are called from GLFW/JVM and connect to Android-side impls
53+
// These aren't separated out into a method because these can be ran so long as we are in Android-land
54+
// so that means this library must be loaded at least once in Android-land
5155
JNIEnv *dvEnv;
5256
(*vm)->GetEnv(vm, (void**) &dvEnv, JNI_VERSION_1_4);
5357
pojav_environ->bridgeClazz = (*dvEnv)->NewGlobalRef(dvEnv,(*dvEnv) ->FindClass(dvEnv,"org/lwjgl/glfw/CallbackBridge"));
@@ -60,17 +64,7 @@ jint JNI_OnLoad(JavaVM* vm, __attribute__((unused)) void* reserved) {
6064
LOGI("Saving JVM environ...");
6165
pojav_environ->runtimeJavaVMPtr = vm;
6266
JNIEnv *vmEnv;
63-
(*vm)->GetEnv(vm, (void**) &vmEnv, JNI_VERSION_1_4);
64-
pojav_environ->vmGlfwClass = (*vmEnv)->NewGlobalRef(vmEnv, (*vmEnv)->FindClass(vmEnv, "org/lwjgl/glfw/GLFW"));
65-
pojav_environ->method_glftSetWindowAttrib = (*vmEnv)->GetStaticMethodID(vmEnv, pojav_environ->vmGlfwClass, "glfwSetWindowAttrib", "(JII)V");
66-
pojav_environ->method_internalWindowSizeChanged = (*vmEnv)->GetStaticMethodID(vmEnv, pojav_environ->vmGlfwClass, "internalWindowSizeChanged", "(J)V");
67-
pojav_environ->method_internalChangeMonitorSize = (*vmEnv)->GetStaticMethodID(vmEnv, pojav_environ->vmGlfwClass, "internalChangeMonitorSize", "(II)V");
68-
jfieldID field_keyDownBuffer = (*vmEnv)->GetStaticFieldID(vmEnv, pojav_environ->vmGlfwClass, "keyDownBuffer", "Ljava/nio/ByteBuffer;");
69-
jobject keyDownBufferJ = (*vmEnv)->GetStaticObjectField(vmEnv, pojav_environ->vmGlfwClass, field_keyDownBuffer);
70-
pojav_environ->keyDownBuffer = (*vmEnv)->GetDirectBufferAddress(vmEnv, keyDownBufferJ);
71-
jfieldID field_mouseDownBuffer = (*vmEnv)->GetStaticFieldID(vmEnv, pojav_environ->vmGlfwClass, "mouseDownBuffer", "Ljava/nio/ByteBuffer;");
72-
jobject mouseDownBufferJ = (*vmEnv)->GetStaticObjectField(vmEnv, pojav_environ->vmGlfwClass, field_mouseDownBuffer);
73-
pojav_environ->mouseDownBuffer = (*vmEnv)->GetDirectBufferAddress(vmEnv, mouseDownBufferJ);
67+
(*pojav_environ->runtimeJavaVMPtr)->GetEnv(pojav_environ->runtimeJavaVMPtr, (void**) &vmEnv, JNI_VERSION_1_4);
7468
hookExec(vmEnv);
7569
installLwjglDlopenHook(vmEnv);
7670
installEMUIIteratorMititgation(vmEnv);
@@ -87,6 +81,26 @@ jint JNI_OnLoad(JavaVM* vm, __attribute__((unused)) void* reserved) {
8781
return JNI_VERSION_1_4;
8882
}
8983

84+
// Sets up the stuff that Android needs to communicate to GLFW/JVM
85+
// These methods are called from Android and connect to GLFW/JVM-side impls
86+
// These are separated out into a method because GLFW loads much later than when we need to dlopen
87+
// pojavexec since it does more than just GLFW.
88+
// TODO: Add checks in case someone forgets to run this method. Probably see if pojav_environ->vmGlfwClass is null or not
89+
JNIEXPORT void JNICALL Java_org_lwjgl_glfw_GLFW_nativeInitializeGLFWNativeBridge(__attribute__((unused)) JNIEnv* env, __attribute__((unused)) jclass clazz) {
90+
JNIEnv *vmEnv;
91+
(*pojav_environ->runtimeJavaVMPtr)->GetEnv(pojav_environ->runtimeJavaVMPtr, (void**) &vmEnv, JNI_VERSION_1_4);
92+
pojav_environ->vmGlfwClass = (*vmEnv)->NewGlobalRef(vmEnv, (*vmEnv)->FindClass(vmEnv, "org/lwjgl/glfw/GLFW"));
93+
pojav_environ->method_glftSetWindowAttrib = (*vmEnv)->GetStaticMethodID(vmEnv, pojav_environ->vmGlfwClass, "glfwSetWindowAttrib", "(JII)V");
94+
pojav_environ->method_internalWindowSizeChanged = (*vmEnv)->GetStaticMethodID(vmEnv, pojav_environ->vmGlfwClass, "internalWindowSizeChanged", "(J)V");
95+
pojav_environ->method_internalChangeMonitorSize = (*vmEnv)->GetStaticMethodID(vmEnv, pojav_environ->vmGlfwClass, "internalChangeMonitorSize", "(II)V");
96+
jfieldID field_keyDownBuffer = (*vmEnv)->GetStaticFieldID(vmEnv, pojav_environ->vmGlfwClass, "keyDownBuffer", "Ljava/nio/ByteBuffer;");
97+
jobject keyDownBufferJ = (*vmEnv)->GetStaticObjectField(vmEnv, pojav_environ->vmGlfwClass, field_keyDownBuffer);
98+
pojav_environ->keyDownBuffer = (*vmEnv)->GetDirectBufferAddress(vmEnv, keyDownBufferJ);
99+
jfieldID field_mouseDownBuffer = (*vmEnv)->GetStaticFieldID(vmEnv, pojav_environ->vmGlfwClass, "mouseDownBuffer", "Ljava/nio/ByteBuffer;");
100+
jobject mouseDownBufferJ = (*vmEnv)->GetStaticObjectField(vmEnv, pojav_environ->vmGlfwClass, field_mouseDownBuffer);
101+
pojav_environ->mouseDownBuffer = (*vmEnv)->GetDirectBufferAddress(vmEnv, mouseDownBufferJ);
102+
}
103+
90104
#define ADD_CALLBACK_WWIN(NAME) \
91105
JNIEXPORT jlong JNICALL Java_org_lwjgl_glfw_GLFW_nglfwSet##NAME##Callback(JNIEnv * env, jclass cls, jlong window, jlong callbackptr) { \
92106
void** oldCallback = (void**) &pojav_environ->GLFW_invoke_##NAME; \

jre_lwjgl3glfw/lwjgl-3.3.3/src/main/java/org/lwjgl/glfw/GLFW.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -522,10 +522,10 @@ public class GLFW
522522
private static final String PROP_WINDOW_HEIGHT= "glfwstub.windowHeight";
523523
public static long mainContext = 0;
524524
private static long gamepadDataPointer;
525-
525+
private static native void nativeInitializeGLFWNativeBridge();
526526
static {
527527
try {
528-
System.loadLibrary("pojavexec");
528+
nativeInitializeGLFWNativeBridge();
529529
} catch (UnsatisfiedLinkError e) {
530530
e.printStackTrace();
531531
}

jre_lwjgl3glfw/lwjgl-3.4.1/build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ jar {
2020
// Modules to copy over to the components directory instead of patching and merging
2121
String[] excludedModules = [
2222
"lwjgl-lwjglx.jar",
23-
"lwjgl.jar",
2423
"jsr305.jar",
2524
"lwjgl-freetype.jar",
2625
"lwjgl-jemalloc.jar",

jre_lwjgl3glfw/lwjgl-3.4.1/src/main/java/org/lwjgl/glfw/GLFW.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -529,9 +529,10 @@ public class GLFW
529529
public static long mainContext = 0;
530530
private static long gamepadDataPointer;
531531

532+
private static native void nativeInitializeGLFWNativeBridge();
532533
static {
533534
try {
534-
System.loadLibrary("pojavexec");
535+
nativeInitializeGLFWNativeBridge();
535536
} catch (UnsatisfiedLinkError e) {
536537
e.printStackTrace();
537538
}

0 commit comments

Comments
 (0)