diff --git a/app_pojavlauncher/build.gradle b/app_pojavlauncher/build.gradle index 28e06603e..8b000b025 100644 --- a/app_pojavlauncher/build.gradle +++ b/app_pojavlauncher/build.gradle @@ -190,7 +190,7 @@ android { afterEvaluate { // Explicit dependencies for which the apk relies on - tasks.mergeDebugAssets.dependsOn(":forge_installer:jar", ":arc_dns_injector:jar", ":jre_lwjgl3glfw:jar") + tasks.mergeDebugAssets.dependsOn(":forge_installer:jar", ":arc_dns_injector:jar", ":lwjgl2_methods_injector:jar", ":jre_lwjgl3glfw:jar") } dependencies { diff --git a/app_pojavlauncher/src/main/assets/components/lwjgl2_methods_injector/lwjgl2_methods_injector.jar b/app_pojavlauncher/src/main/assets/components/lwjgl2_methods_injector/lwjgl2_methods_injector.jar new file mode 100644 index 000000000..443d15880 Binary files /dev/null and b/app_pojavlauncher/src/main/assets/components/lwjgl2_methods_injector/lwjgl2_methods_injector.jar differ diff --git a/app_pojavlauncher/src/main/assets/components/lwjgl2_methods_injector/version b/app_pojavlauncher/src/main/assets/components/lwjgl2_methods_injector/version new file mode 100644 index 000000000..dbd01091b --- /dev/null +++ b/app_pojavlauncher/src/main/assets/components/lwjgl2_methods_injector/version @@ -0,0 +1 @@ +b35956195a536dfa5895ca6d40d13c718de4d7fa \ No newline at end of file diff --git a/app_pojavlauncher/src/main/assets/components/lwjgl3/lwjgl-glfw-classes.jar b/app_pojavlauncher/src/main/assets/components/lwjgl3/lwjgl-glfw-classes.jar index 585f0836a..b9223a886 100644 Binary files a/app_pojavlauncher/src/main/assets/components/lwjgl3/lwjgl-glfw-classes.jar and b/app_pojavlauncher/src/main/assets/components/lwjgl3/lwjgl-glfw-classes.jar differ diff --git a/app_pojavlauncher/src/main/assets/components/lwjgl3/version b/app_pojavlauncher/src/main/assets/components/lwjgl3/version index 67d8d9ed7..4005b5be5 100644 --- a/app_pojavlauncher/src/main/assets/components/lwjgl3/version +++ b/app_pojavlauncher/src/main/assets/components/lwjgl3/version @@ -1 +1 @@ -e403bab275e3c403fef51031200eb421c2ceedc0 \ No newline at end of file +1ef00ef84bfab4d14eab3fd810e31669ddbefb89 \ No newline at end of file diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/AsyncAssetManager.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/AsyncAssetManager.java index e2cb00827..c6636ea29 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/AsyncAssetManager.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/AsyncAssetManager.java @@ -86,9 +86,10 @@ public class AsyncAssetManager { unpackComponent(ctx, "lwjgl3", false); unpackComponent(ctx, "security", true); unpackComponent(ctx, "arc_dns_injector", true); + unpackComponent(ctx, "lwjgl2_methods_injector", true); unpackComponent(ctx, "forge_installer", true); } catch (IOException e) { - Log.e("AsyncAssetManager", "Failed o unpack components !",e ); + Log.e("AsyncAssetManager", "Failed to unpack components !",e ); } ProgressLayout.clearProgress(ProgressLayout.EXTRACT_COMPONENTS); }); diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java index 8fb177ba3..4c0f4f4c5 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/JREUtils.java @@ -326,6 +326,8 @@ public class JREUtils { // Some phones are not using the right number of cores, fix that userArgs.add("-XX:ActiveProcessorCount=" + java.lang.Runtime.getRuntime().availableProcessors()); + // Adds missing lwjgl2 openal methods + userArgs.add("-javaagent:"+new File(Tools.DIR_DATA,"lwjgl2_methods_injector/lwjgl2_methods_injector.jar").getAbsolutePath()); userArgs.addAll(JVMArgs); activity.runOnUiThread(() -> Toast.makeText(activity, activity.getString(R.string.autoram_info_msg,LauncherPreferences.PREF_RAM_ALLOCATION), Toast.LENGTH_SHORT).show()); diff --git a/arc_dns_injector/build.gradle b/arc_dns_injector/build.gradle index 0e42efa9c..bf97f0dfd 100644 --- a/arc_dns_injector/build.gradle +++ b/arc_dns_injector/build.gradle @@ -17,4 +17,4 @@ jar { versionFile.write(getGitHash(project.projectDir)) } destinationDirectory.set(file("../app_pojavlauncher/src/main/assets/components/arc_dns_injector/")) -} +} \ No newline at end of file diff --git a/lwjgl2_methods_injector/.gitignore b/lwjgl2_methods_injector/.gitignore new file mode 100644 index 000000000..42afabfd2 --- /dev/null +++ b/lwjgl2_methods_injector/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/lwjgl2_methods_injector/build.gradle b/lwjgl2_methods_injector/build.gradle new file mode 100644 index 000000000..3c7403ffa --- /dev/null +++ b/lwjgl2_methods_injector/build.gradle @@ -0,0 +1,27 @@ +plugins { + id 'java-library' + id("com.gradleup.shadow") version "9.2.2" +} + +java { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 +} + +jar { + archiveBaseName.set("lwjgl2_methods_injector") + manifest { + attributes("Manifest-Version": "1.0", + "PreMain-Class": "org.angelauramc.lwjgl2_methods_injector.startInjectors", + "Can-Redefine-Classes": "true") + } + if (gitUsed()){ + File versionFile = file("../app_pojavlauncher/src/main/assets/components/lwjgl2_methods_injector/version") + versionFile.write(getGitHash(project.projectDir)) + } + destinationDirectory.set(file("../app_pojavlauncher/src/main/assets/components/lwjgl2_methods_injector/")) +} + +dependencies { + implementation group: 'org.ow2.asm', name: 'asm', version: '9.9' +} \ No newline at end of file diff --git a/lwjgl2_methods_injector/src/main/java/org/angelauramc/lwjgl2_methods_injector/ALC10Injector.java b/lwjgl2_methods_injector/src/main/java/org/angelauramc/lwjgl2_methods_injector/ALC10Injector.java new file mode 100644 index 000000000..7d0f9e0c4 --- /dev/null +++ b/lwjgl2_methods_injector/src/main/java/org/angelauramc/lwjgl2_methods_injector/ALC10Injector.java @@ -0,0 +1,72 @@ +package org.angelauramc.lwjgl2_methods_injector; + +import static org.objectweb.asm.Opcodes.*; + +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.MethodVisitor; + +import java.lang.instrument.ClassFileTransformer; +import java.lang.instrument.Instrumentation; +import java.security.ProtectionDomain; + +public class ALC10Injector extends ClassVisitor implements ClassFileTransformer { + protected ALC10Injector(int api) { + super(api); + } + + public static void premain(String args, Instrumentation inst) { + inst.addTransformer(new ClassFileTransformer() { + public byte[] transform(ClassLoader l, String name, Class c, + ProtectionDomain d, byte[] b) { + if (!"org/lwjgl/openal/ALC10".equals(name)) { + return null; + } + System.out.println("Modifying ALC10 for LWJGL2 compatibility..."); + ClassReader cr = new ClassReader(b); + ClassWriter cw = new ClassWriter(cr, 0); + ClassVisitor cv = new AddMethodAdapter(cw); + cr.accept(cv, 0); + return cw.toByteArray(); + } + }); + + } + + public static class AddMethodAdapter extends ClassVisitor { + public AddMethodAdapter(ClassVisitor cv) { + super(ASM4, cv); + } + public void visitEnd() { + // Create the method: public static ALCcontext alcGetCurrentContext() + MethodVisitor mv = cv.visitMethod( + ACC_PUBLIC | ACC_STATIC, // method modifiers + "alcGetCurrentContext", // method name + "()Lorg/lwjgl/openal/ALCcontext;", // descriptor (return type) + null, // signature + null // exceptions + ); + + mv.visitCode(); + + // GETSTATIC org/lwjgl/openal/ALC10.alcContext : Lorg/lwjgl/openal/ALCcontext; + mv.visitFieldInsn( + GETSTATIC, + "org/lwjgl/openal/ALC10", // owner (this class) + "alcContext", // field name + "Lorg/lwjgl/openal/ALCcontext;" // field type descriptor + ); + + // Return it + mv.visitInsn(ARETURN); + + // Stack size = 1 (field value), locals = 0 (static method) + mv.visitMaxs(1, 0); + mv.visitEnd(); + + super.visitEnd(); + } + } +} + diff --git a/lwjgl2_methods_injector/src/main/java/org/angelauramc/lwjgl2_methods_injector/startInjectors.java b/lwjgl2_methods_injector/src/main/java/org/angelauramc/lwjgl2_methods_injector/startInjectors.java new file mode 100644 index 000000000..bacbf101f --- /dev/null +++ b/lwjgl2_methods_injector/src/main/java/org/angelauramc/lwjgl2_methods_injector/startInjectors.java @@ -0,0 +1,9 @@ +package org.angelauramc.lwjgl2_methods_injector; + +import java.lang.instrument.Instrumentation; + +public class startInjectors { + public static void premain(String args, Instrumentation inst) { + ALC10Injector.premain(args, inst); + } +} diff --git a/settings.gradle b/settings.gradle index 4980a2f2c..02ab33d35 100644 --- a/settings.gradle +++ b/settings.gradle @@ -19,5 +19,6 @@ include ':jre_lwjgl3glfw' include ':app_pojavlauncher' include ':arc_dns_injector' +include ':lwjgl2_methods_injector' include ':forge_installer' include ':MobileGlues'