From 3d099792206d1703a001fdce7340679e6cf34258 Mon Sep 17 00:00:00 2001 From: artdeell Date: Sat, 29 Apr 2023 23:53:20 +0300 Subject: [PATCH] Automatically pick runtime version for Mod Installer based on the main class file verion --- app_pojavlauncher/build.gradle | 2 +- .../pojavlaunch/JavaGUILauncherActivity.java | 42 ++++++++++++++++++- .../main/java/net/kdt/pojavlaunch/Tools.java | 9 ++++ 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/app_pojavlauncher/build.gradle b/app_pojavlauncher/build.gradle index 99632e3a4..d3f1273d3 100644 --- a/app_pojavlauncher/build.gradle +++ b/app_pojavlauncher/build.gradle @@ -144,7 +144,7 @@ dependencies { // implementation 'com.intuit.ssp:ssp-android:1.0.5' implementation 'org.tukaani:xz:1.8' - implementation 'com.github.PojavLauncherTeam:exp4j:master-SNAPSHOT' + implementation 'com.github.PojavLauncherTeam:exp4j:60eaec6f78' // implementation 'net.sourceforge.streamsupport:streamsupport-cfuture:1.7.0' implementation fileTree(dir: 'libs', include: ['*.jar']) } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java index db1e63e98..3b7c1a487 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java @@ -11,7 +11,10 @@ import android.widget.*; import androidx.activity.OnBackPressedCallback; import java.io.*; +import java.nio.ByteBuffer; import java.util.*; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; import net.kdt.pojavlaunch.customcontrols.keyboard.AwtCharSender; import net.kdt.pojavlaunch.customcontrols.keyboard.TouchCharInput; @@ -123,13 +126,20 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc }); try { - MultiRTUtils.setRuntimeNamed(LauncherPreferences.PREF_DEFAULT_RUNTIME); placeMouseAt(CallbackBridge.physicalWidth / 2, CallbackBridge.physicalHeight / 2); final File modFile = (File) getIntent().getExtras().getSerializable("modFile"); final String javaArgs = getIntent().getExtras().getString("javaArgs"); + int javaVersion = getJavaVersion(modFile); + String jreName = javaVersion == -1 ? null : MultiRTUtils.getNearestJreName(javaVersion); + if(jreName != null) { + MultiRTUtils.setRuntimeNamed(jreName); + }else{ + MultiRTUtils.setRuntimeNamed(LauncherPreferences.PREF_DEFAULT_RUNTIME); + } + mSkipDetectMod = getIntent().getExtras().getBoolean("skipDetectMod", false); if (mSkipDetectMod) { new Thread(() -> launchJavaRuntime(modFile, javaArgs), "JREMainThread").start(); @@ -309,4 +319,34 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc public void toggleKeyboard(View view) { mTouchCharInput.switchKeyboardState(); } + public int getJavaVersion(File modFile) { + try (ZipFile zipFile = new ZipFile(modFile)){ + ZipEntry manifest = zipFile.getEntry("META-INF/MANIFEST.MF"); + if(manifest == null) return -1; + String manifestString = Tools.read(zipFile.getInputStream(manifest)); + String mainClass = Tools.extractUntilCharacter(manifestString, "Main-Class:", '\n'); + if(mainClass == null) return -1; + mainClass = mainClass.trim().replace('.', '/') + ".class"; + ZipEntry mainClassFile = zipFile.getEntry(mainClass); + if(mainClassFile == null) return -1; + InputStream classStream = zipFile.getInputStream(mainClassFile); + byte[] bytesWeNeed = new byte[8]; + int readCount = classStream.read(bytesWeNeed); + if(readCount < 8) return -1; + classStream.close(); + ByteBuffer byteBuffer = ByteBuffer.wrap(bytesWeNeed); + if(byteBuffer.getInt() != 0xCAFEBABE) return -1; + short minorVersion = byteBuffer.getShort(); + short majorVersion = byteBuffer.getShort(); + Log.i("JavaGUILauncher", majorVersion+","+minorVersion); + return classVersionToJavaVersion(majorVersion); + }catch (Exception e) { + e.printStackTrace(); + return -1; + } + } + public static int classVersionToJavaVersion(int majorVersion) { + if(majorVersion < 46) return 2; // there isn't even an arm64 port of jre 1.1 (or anything before 1.8 in fact) + return majorVersion - 44; + } } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java index bae59ab7a..2e2e01b46 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java @@ -967,4 +967,13 @@ public final class Tools { } }); } + + public static String extractUntilCharacter(String input, String whatFor, char terminator) { + int whatForStart = input.indexOf(whatFor); + if(whatForStart == -1) return null; + whatForStart += whatFor.length(); + int terminatorIndex = input.indexOf(terminator, whatForStart); + if(terminatorIndex == -1) return null; + return input.substring(whatForStart, terminatorIndex); + } }