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 eb33a10c3..b7cb2d600 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/JavaGUILauncherActivity.java @@ -20,6 +20,7 @@ import com.kdt.LoggerView; import net.kdt.pojavlaunch.customcontrols.keyboard.AwtCharSender; import net.kdt.pojavlaunch.customcontrols.keyboard.TouchCharInput; import net.kdt.pojavlaunch.multirt.MultiRTUtils; +import net.kdt.pojavlaunch.multirt.Runtime; import net.kdt.pojavlaunch.prefs.LauncherPreferences; import net.kdt.pojavlaunch.utils.JREUtils; import net.kdt.pojavlaunch.utils.MathUtils; @@ -141,18 +142,19 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc 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); + String jreName = LauncherPreferences.PREF_DEFAULT_RUNTIME; + if(modFile != null) { + int javaVersion = getJavaVersion(modFile); + if(javaVersion != -1) { + String autoselectRuntime = MultiRTUtils.getNearestJreName(javaVersion); + if (autoselectRuntime != null) jreName = autoselectRuntime; + } } + final Runtime runtime = MultiRTUtils.forceReread(jreName); mSkipDetectMod = getIntent().getExtras().getBoolean("skipDetectMod", false); if (mSkipDetectMod) { - new Thread(() -> launchJavaRuntime(modFile, javaArgs), "JREMainThread").start(); + new Thread(() -> launchJavaRuntime(runtime, modFile, javaArgs), "JREMainThread").start(); return; } @@ -160,7 +162,7 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc openLogOutput(null); new Thread(() -> { try { - final int exit = doCustomInstall(modFile, javaArgs); + final int exit = doCustomInstall(runtime, modFile, javaArgs); Logger.getInstance().appendToLog(getString(R.string.toast_optifine_success)); if (exit != 0) return; runOnUiThread(() -> { @@ -274,13 +276,13 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc Toast.LENGTH_SHORT).show(); } - public int launchJavaRuntime(File modFile, String javaArgs) { + public int launchJavaRuntime(Runtime runtime, File modFile, String javaArgs) { JREUtils.redirectAndPrintJRELog(); try { List javaArgList = new ArrayList<>(); // Enable Caciocavallo - Tools.getCacioJavaArgs(javaArgList,MultiRTUtils.getSelectedRuntime().javaVersion == 8); + Tools.getCacioJavaArgs(javaArgList,runtime.javaVersion == 8); if (javaArgs != null) { javaArgList.addAll(Arrays.asList(javaArgs.split(" "))); @@ -300,7 +302,7 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc Logger.getInstance().appendToLog("Info: Java arguments: " + Arrays.toString(javaArgList.toArray(new String[0]))); - return JREUtils.launchJavaVM(this, null,javaArgList, LauncherPreferences.PREF_CUSTOM_JAVA_ARGS); + return JREUtils.launchJavaVM(this, runtime,null,javaArgList, LauncherPreferences.PREF_CUSTOM_JAVA_ARGS); } catch (Throwable th) { Tools.showError(this, th, true); return -1; @@ -309,9 +311,9 @@ public class JavaGUILauncherActivity extends BaseActivity implements View.OnTouc - private int doCustomInstall(File modFile, String javaArgs) { + private int doCustomInstall(Runtime runtime, File modFile, String javaArgs) { mSkipDetectMod = true; - return launchJavaRuntime(modFile, javaArgs); + return launchJavaRuntime(runtime, modFile, javaArgs); } public void toggleKeyboard(View view) { diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java index fa0011b83..45459f8c2 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/MainActivity.java @@ -127,14 +127,6 @@ public class MainActivity extends BaseActivity implements ControlButtonMenuListe GLOBAL_CLIPBOARD = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); touchCharInput.setCharacterSender(new LwjglCharSender()); - - String runtime = LauncherPreferences.PREF_DEFAULT_RUNTIME; - if(minecraftProfile.javaDir != null && minecraftProfile.javaDir.startsWith(Tools.LAUNCHERPROFILES_RTPREFIX)) { - String runtimeName = minecraftProfile.javaDir.substring(Tools.LAUNCHERPROFILES_RTPREFIX.length()); - if(MultiRTUtils.forceReread(runtimeName).versionString != null) { - runtime = runtimeName; - } - } if(minecraftProfile.pojavRendererName != null) { Log.i("RdrDebug","__P_renderer="+minecraftProfile.pojavRendererName); Tools.LOCAL_RENDERER = minecraftProfile.pojavRendererName; @@ -142,7 +134,6 @@ public class MainActivity extends BaseActivity implements ControlButtonMenuListe setTitle("Minecraft " + minecraftProfile.lastVersionId); - MultiRTUtils.setRuntimeNamed(runtime); // Minecraft 1.13+ String version = getIntent().getStringExtra(INTENT_MINECRAFT_VERSION); 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 a5fa46ca7..b72efdd50 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/Tools.java @@ -44,6 +44,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import net.kdt.pojavlaunch.multirt.MultiRTUtils; +import net.kdt.pojavlaunch.multirt.Runtime; import net.kdt.pojavlaunch.plugins.FFmpegPlugin; import net.kdt.pojavlaunch.prefs.LauncherPreferences; import net.kdt.pojavlaunch.utils.DownloadUtils; @@ -96,7 +97,6 @@ public final class Tools { public static String DIR_GAME_NEW; // New since 3.0.0 - public static String DIR_HOME_JRE; public static String DIRNAME_HOME_JRE = "lib"; // New since 2.4.2 @@ -168,6 +168,7 @@ public final class Tools { memoryErrorLock.wait(); } } + Runtime runtime = MultiRTUtils.forceReread(Tools.pickRuntime(minecraftProfile)); JMinecraftVersionList.Version versionInfo = Tools.getVersionInfo(versionId); LauncherProfiles.update(); File gamedir = Tools.getGameDirPath(minecraftProfile); @@ -185,7 +186,7 @@ public final class Tools { List javaArgList = new ArrayList<>(); - getCacioJavaArgs(javaArgList, MultiRTUtils.getSelectedRuntime().javaVersion == 8); + getCacioJavaArgs(javaArgList, runtime.javaVersion == 8); if (versionInfo.logging != null) { String configFile = Tools.DIR_DATA + "/security/" + versionInfo.logging.client.file.id.replace("client", "log4j-rce-patch"); @@ -201,10 +202,10 @@ public final class Tools { javaArgList.add(versionInfo.mainClass); javaArgList.addAll(Arrays.asList(launchArgs)); // ctx.appendlnToLog("full args: "+javaArgList.toString()); - FFmpegPlugin.discover(activity); String args = LauncherPreferences.PREF_CUSTOM_JAVA_ARGS; if(Tools.isValidString(minecraftProfile.javaArgs)) args = minecraftProfile.javaArgs; - JREUtils.launchJavaVM(activity, gamedir, javaArgList, args); + FFmpegPlugin.discover(activity); + JREUtils.launchJavaVM(activity, runtime, gamedir, javaArgList, args); } public static File getGameDirPath(@NonNull MinecraftProfile minecraftProfile){ @@ -938,4 +939,14 @@ public final class Tools { public static boolean isValidString(String string) { return string != null && !string.isEmpty(); } + public static String pickRuntime(MinecraftProfile minecraftProfile) { + String runtime = LauncherPreferences.PREF_DEFAULT_RUNTIME; + if(minecraftProfile.javaDir != null && minecraftProfile.javaDir.startsWith(Tools.LAUNCHERPROFILES_RTPREFIX)) { + String runtimeName = minecraftProfile.javaDir.substring(Tools.LAUNCHERPROFILES_RTPREFIX.length()); + if(MultiRTUtils.forceReread(runtimeName).versionString != null) { + runtime = runtimeName; + } + } + return runtime; + } } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/multirt/MultiRTUtils.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/multirt/MultiRTUtils.java index 429e18fbb..4a72da4cf 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/multirt/MultiRTUtils.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/multirt/MultiRTUtils.java @@ -144,17 +144,10 @@ public class MultiRTUtils { } } - public static void setRuntimeNamed(String name) { + public static File getRuntimeHome(String name) { File dest = new File(RUNTIME_FOLDER,"/"+name); if((!dest.exists()) || MultiRTUtils.forceReread(name).versionString == null) throw new RuntimeException("Selected runtime is broken!"); - Tools.DIR_HOME_JRE = dest.getAbsolutePath(); - sSelectedRuntimeName = name; - JREUtils.relocateLibPath(); - } - - public static Runtime getSelectedRuntime() { - if(sSelectedRuntimeName == null) throw new RuntimeException("getSelectedRuntime() called before a runtime was selected"); - return read(sSelectedRuntimeName); + return dest; } public static Runtime forceReread(String name) { diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/CustomSeekBarPreference.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/CustomSeekBarPreference.java index b035a21bd..4b3435667 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/CustomSeekBarPreference.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/prefs/CustomSeekBarPreference.java @@ -27,10 +27,10 @@ public class CustomSeekBarPreference extends SeekBarPreference { @SuppressLint("PrivateResource") public CustomSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); - try(TypedArray a = context.obtainStyledAttributes( - attrs, R.styleable.SeekBarPreference, defStyleAttr, defStyleRes)) { - mMin = a.getInt(R.styleable.SeekBarPreference_min, 0); - } + TypedArray a = context.obtainStyledAttributes( + attrs, R.styleable.SeekBarPreference, defStyleAttr, defStyleRes); + mMin = a.getInt(R.styleable.SeekBarPreference_min, 0); + a.recycle(); } public CustomSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr) { 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 7fd556302..7509243d1 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 @@ -21,6 +21,7 @@ import net.kdt.pojavlaunch.*; import net.kdt.pojavlaunch.extra.ExtraConstants; import net.kdt.pojavlaunch.extra.ExtraCore; import net.kdt.pojavlaunch.multirt.MultiRTUtils; +import net.kdt.pojavlaunch.multirt.Runtime; import net.kdt.pojavlaunch.plugins.FFmpegPlugin; import net.kdt.pojavlaunch.prefs.*; import org.lwjgl.glfw.*; @@ -71,7 +72,7 @@ public class JREUtils { return returnValue; } - public static void initJavaRuntime() { + public static void initJavaRuntime(String jreHome) { dlopen(findInLdLibPath("libjli.so")); if(!dlopen("libjvm.so")){ Log.w("DynamicLoader","Failed to load with no path, trying with full path"); @@ -86,7 +87,7 @@ public class JREUtils { dlopen(findInLdLibPath("libawt_headless.so")); dlopen(findInLdLibPath("libfreetype.so")); dlopen(findInLdLibPath("libfontmanager.so")); - for(File f : locateLibs(new File(Tools.DIR_HOME_JRE + "/" + Tools.DIRNAME_HOME_JRE))) { + for(File f : locateLibs(new File(jreHome, Tools.DIRNAME_HOME_JRE))) { dlopen(f.getAbsolutePath()); } dlopen(NATIVE_LIB_DIR + "/libopenal.so"); @@ -138,14 +139,14 @@ public class JREUtils { } - public static void relocateLibPath() { - String JRE_ARCHITECTURE = MultiRTUtils.getSelectedRuntime().arch; + public static void relocateLibPath(Runtime runtime, String jreHome) { + String JRE_ARCHITECTURE = runtime.arch; if (Architecture.archAsInt(JRE_ARCHITECTURE) == ARCH_X86){ JRE_ARCHITECTURE = "i386/i486/i586"; } for (String arch : JRE_ARCHITECTURE.split("/")) { - File f = new File(Tools.DIR_HOME_JRE, "lib/" + arch); + File f = new File(jreHome, "lib/" + arch); if (f.exists() && f.isDirectory()) { Tools.DIRNAME_HOME_JRE = "lib/" + arch; } @@ -156,9 +157,9 @@ public class JREUtils { if(FFmpegPlugin.isAvailable) { ldLibraryPath.append(FFmpegPlugin.libraryPath).append(":"); } - ldLibraryPath.append(Tools.DIR_HOME_JRE) + ldLibraryPath.append(jreHome) .append("/").append(Tools.DIRNAME_HOME_JRE) - .append("/jli:").append(Tools.DIR_HOME_JRE).append("/").append(Tools.DIRNAME_HOME_JRE) + .append("/jli:").append(jreHome).append("/").append(Tools.DIRNAME_HOME_JRE) .append(":"); ldLibraryPath.append("/system/").append(libName).append(":") .append("/vendor/").append(libName).append(":") @@ -167,10 +168,10 @@ public class JREUtils { LD_LIBRARY_PATH = ldLibraryPath.toString(); } - public static void setJavaEnvironment(Activity activity) throws Throwable { + public static void setJavaEnvironment(Activity activity, String jreHome) throws Throwable { Map envMap = new ArrayMap<>(); envMap.put("POJAV_NATIVEDIR", NATIVE_LIB_DIR); - envMap.put("JAVA_HOME", Tools.DIR_HOME_JRE); + envMap.put("JAVA_HOME", jreHome); envMap.put("HOME", Tools.DIR_GAME_HOME); envMap.put("TMPDIR", activity.getCacheDir().getAbsolutePath()); envMap.put("LIBGL_MIPMAP", "3"); @@ -202,7 +203,7 @@ public class JREUtils { envMap.put("VTEST_SOCKET_NAME", activity.getCacheDir().getAbsolutePath() + "/.virgl_test"); envMap.put("LD_LIBRARY_PATH", LD_LIBRARY_PATH); - envMap.put("PATH", Tools.DIR_HOME_JRE + "/bin:" + Os.getenv("PATH")); + envMap.put("PATH", jreHome + "/bin:" + Os.getenv("PATH")); if(FFmpegPlugin.isAvailable) { envMap.put("PATH", FFmpegPlugin.libraryPath+":"+envMap.get("PATH")); } @@ -255,8 +256,8 @@ public class JREUtils { } } - File serverFile = new File(Tools.DIR_HOME_JRE + "/" + Tools.DIRNAME_HOME_JRE + "/server/libjvm.so"); - jvmLibraryPath = Tools.DIR_HOME_JRE + "/" + Tools.DIRNAME_HOME_JRE + "/" + (serverFile.exists() ? "server" : "client"); + File serverFile = new File(jreHome + "/" + Tools.DIRNAME_HOME_JRE + "/server/libjvm.so"); + jvmLibraryPath = jreHome + "/" + Tools.DIRNAME_HOME_JRE + "/" + (serverFile.exists() ? "server" : "client"); Log.d("DynamicLoader","Base LD_LIBRARY_PATH: "+LD_LIBRARY_PATH); Log.d("DynamicLoader","Internal LD_LIBRARY_PATH: "+jvmLibraryPath+":"+LD_LIBRARY_PATH); setLdLibraryPath(jvmLibraryPath+":"+LD_LIBRARY_PATH); @@ -264,13 +265,15 @@ public class JREUtils { // return ldLibraryPath; } - public static int launchJavaVM(final Activity activity, File gameDirectory, final List JVMArgs, final String userArgsString) throws Throwable { - JREUtils.relocateLibPath(); + public static int launchJavaVM(final Activity activity, final Runtime runtime, File gameDirectory, final List JVMArgs, final String userArgsString) throws Throwable { + String runtimeHome = MultiRTUtils.getRuntimeHome(runtime.name).getAbsolutePath(); - setJavaEnvironment(activity); + JREUtils.relocateLibPath(runtime, runtimeHome); + + setJavaEnvironment(activity, runtimeHome); final String graphicsLib = loadGraphicsLibrary(); - List userArgs = getJavaArgs(activity, userArgsString); + List userArgs = getJavaArgs(activity, runtimeHome, userArgsString); //Remove arguments that can interfere with the good working of the launcher purgeArg(userArgs,"-Xms"); @@ -289,7 +292,7 @@ public class JREUtils { activity.runOnUiThread(() -> Toast.makeText(activity, activity.getString(R.string.autoram_info_msg,LauncherPreferences.PREF_RAM_ALLOCATION), Toast.LENGTH_SHORT).show()); System.out.println(JVMArgs); - initJavaRuntime(); + initJavaRuntime(runtimeHome); setupExitTrap(activity.getApplication()); chdir(gameDirectory == null ? Tools.DIR_GAME_NEW : gameDirectory.getAbsolutePath()); userArgs.add(0,"java"); //argv[0] is the program name according to C standard. @@ -314,13 +317,13 @@ public class JREUtils { * @param ctx The application context * @return A list filled with args. */ - public static List getJavaArgs(Context ctx, String userArgumentsString) { + public static List getJavaArgs(Context ctx, String runtimeHome, String userArgumentsString) { List userArguments = parseJavaArguments(userArgumentsString); String resolvFile; resolvFile = new File(Tools.DIR_DATA,"resolv.conf").getAbsolutePath(); ArrayList overridableArguments = new ArrayList<>(Arrays.asList( - "-Djava.home=" + Tools.DIR_HOME_JRE, + "-Djava.home=" + runtimeHome, "-Djava.io.tmpdir=" + ctx.getCacheDir().getAbsolutePath(), "-Duser.home=" + Tools.DIR_GAME_HOME, "-Duser.language=" + System.getProperty("user.language"),