Remove the dependency on a static variable for JRE switching

Also: fix crashing on CustomSeekBarPreferences
This commit is contained in:
artdeell 2023-04-30 22:41:41 +03:00
parent a7809df1a5
commit a6a5675b9c
6 changed files with 59 additions and 59 deletions

View file

@ -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<String> 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) {

View file

@ -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);

View file

@ -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<String> 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;
}
}

View file

@ -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) {

View file

@ -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) {

View file

@ -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<String, String> 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<String> JVMArgs, final String userArgsString) throws Throwable {
JREUtils.relocateLibPath();
public static int launchJavaVM(final Activity activity, final Runtime runtime, File gameDirectory, final List<String> 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<String> userArgs = getJavaArgs(activity, userArgsString);
List<String> 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<String> getJavaArgs(Context ctx, String userArgumentsString) {
public static List<String> getJavaArgs(Context ctx, String runtimeHome, String userArgumentsString) {
List<String> userArguments = parseJavaArguments(userArgumentsString);
String resolvFile;
resolvFile = new File(Tools.DIR_DATA,"resolv.conf").getAbsolutePath();
ArrayList<String> 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"),