mirror of
https://github.com/AngelAuraMC/Amethyst-Android.git
synced 2025-09-16 08:05:34 -04:00
- Move getJavaArgs to the appropriate class
- Deported loading a graphical library into its own function. - Clean up getJavaArgs implementation.
This commit is contained in:
parent
93bb166339
commit
8d2843889b
@ -156,64 +156,6 @@ public final class Tools {
|
|||||||
javaArgList.add(cacioClasspath.toString());
|
javaArgList.add(cacioClasspath.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void getJavaArgs(Context ctx, List<String> javaArgList, String renderLib) {
|
|
||||||
List<String> overrideableArgList = new ArrayList<String>();
|
|
||||||
|
|
||||||
overrideableArgList.add("-Djava.home=" + Tools.DIR_HOME_JRE);
|
|
||||||
overrideableArgList.add("-Djava.io.tmpdir=" + ctx.getCacheDir().getAbsolutePath());
|
|
||||||
|
|
||||||
overrideableArgList.add("-Duser.home=" + new File(Tools.DIR_GAME_NEW).getParent());
|
|
||||||
overrideableArgList.add("-Duser.language=" + System.getProperty("user.language"));
|
|
||||||
// overrideableArgList.add("-Duser.timezone=GMT");
|
|
||||||
|
|
||||||
overrideableArgList.add("-Dos.name=Linux");
|
|
||||||
overrideableArgList.add("-Dos.version=Android-" + Build.VERSION.RELEASE);
|
|
||||||
overrideableArgList.add("-Dpojav.path.minecraft=" + DIR_GAME_NEW);
|
|
||||||
overrideableArgList.add("-Dpojav.path.private.account=" + DIR_ACCOUNT_NEW);
|
|
||||||
|
|
||||||
// javaArgList.add("-Dorg.lwjgl.libname=liblwjgl3.so");
|
|
||||||
// javaArgList.add("-Dorg.lwjgl.system.jemalloc.libname=libjemalloc.so");
|
|
||||||
|
|
||||||
overrideableArgList.add("-Dorg.lwjgl.opengl.libname=" + renderLib);
|
|
||||||
// overrideableArgList.add("-Dorg.lwjgl.opengl.libname=libgl4es_115.so");
|
|
||||||
|
|
||||||
// javaArgList.add("-Dorg.lwjgl.opengl.libname=libRegal.so");
|
|
||||||
|
|
||||||
// Enable LWJGL3 debug
|
|
||||||
// overrideableArgList.add("-Dorg.lwjgl.util.Debug=true");
|
|
||||||
// overrideableArgList.add("-Dorg.lwjgl.util.DebugFunctions=true");
|
|
||||||
// overrideableArgList.add("-Dorg.lwjgl.util.DebugLoader=true");
|
|
||||||
|
|
||||||
// GLFW Stub width height
|
|
||||||
overrideableArgList.add("-Dglfwstub.windowWidth=" + CallbackBridge.windowWidth);
|
|
||||||
overrideableArgList.add("-Dglfwstub.windowHeight=" + CallbackBridge.windowHeight);
|
|
||||||
overrideableArgList.add("-Dglfwstub.initEgl=false");
|
|
||||||
|
|
||||||
overrideableArgList.add("-Dnet.minecraft.clientmodname=" + Tools.APP_NAME);
|
|
||||||
|
|
||||||
// Disable FML Early Loading Screen to get Forge 1.14+ to work
|
|
||||||
overrideableArgList.add("-Dfml.earlyprogresswindow=false");
|
|
||||||
|
|
||||||
// Override args
|
|
||||||
for (String argOverride : JREUtils.parseJavaArguments(LauncherPreferences.PREF_CUSTOM_JAVA_ARGS)) {
|
|
||||||
for (int i = overrideableArgList.size() - 1; i >= 0; i--) {
|
|
||||||
String arg = overrideableArgList.get(i);
|
|
||||||
// Currently, only java property is supported overridable argument, other such as "-X:" are handled by the JVM.
|
|
||||||
// Althought java properties are also handled by JVM, but duplicate bug from parser may occurs, so replace them.
|
|
||||||
if (arg.startsWith("-D") && argOverride.startsWith(arg.substring(0, arg.indexOf('=') + 1))) {
|
|
||||||
// Override the matched argument
|
|
||||||
overrideableArgList.set(i, argOverride);
|
|
||||||
break;
|
|
||||||
} else if (!argOverride.isEmpty() && i == 0) {
|
|
||||||
// Overridable argument has mismatched, so add the custom argument to overridable argument list
|
|
||||||
javaArgList.add(argOverride);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
javaArgList.addAll(overrideableArgList);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String[] getMinecraftArgs(MinecraftAccount profile, JMinecraftVersionList.Version versionInfo, String strGameDir) {
|
public static String[] getMinecraftArgs(MinecraftAccount profile, JMinecraftVersionList.Version versionInfo, String strGameDir) {
|
||||||
String username = profile.username;
|
String username = profile.username;
|
||||||
String versionName = versionInfo.id;
|
String versionName = versionInfo.id;
|
||||||
@ -226,7 +168,7 @@ public final class Tools {
|
|||||||
File gameDir = new File(strGameDir);
|
File gameDir = new File(strGameDir);
|
||||||
gameDir.mkdirs();
|
gameDir.mkdirs();
|
||||||
|
|
||||||
Map<String, String> varArgMap = new ArrayMap<String, String>();
|
Map<String, String> varArgMap = new ArrayMap<>();
|
||||||
varArgMap.put("auth_access_token", profile.accessToken);
|
varArgMap.put("auth_access_token", profile.accessToken);
|
||||||
varArgMap.put("auth_player_name", username);
|
varArgMap.put("auth_player_name", username);
|
||||||
varArgMap.put("auth_uuid", profile.profileId);
|
varArgMap.put("auth_uuid", profile.profileId);
|
||||||
|
@ -3,18 +3,15 @@ package net.kdt.pojavlaunch.utils;
|
|||||||
import static net.kdt.pojavlaunch.Architecture.ARCH_X86;
|
import static net.kdt.pojavlaunch.Architecture.ARCH_X86;
|
||||||
import static net.kdt.pojavlaunch.Architecture.archAsString;
|
import static net.kdt.pojavlaunch.Architecture.archAsString;
|
||||||
import static net.kdt.pojavlaunch.Architecture.is64BitsDevice;
|
import static net.kdt.pojavlaunch.Architecture.is64BitsDevice;
|
||||||
|
import static net.kdt.pojavlaunch.Tools.LOCAL_RENDERER;
|
||||||
|
|
||||||
import android.app.*;
|
import android.app.*;
|
||||||
import android.content.*;
|
import android.content.*;
|
||||||
import android.opengl.EGL14;
|
import android.os.Build;
|
||||||
import android.opengl.EGLExt;
|
|
||||||
import android.opengl.GLES10;
|
|
||||||
import android.system.*;
|
import android.system.*;
|
||||||
import android.util.*;
|
import android.util.*;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
|
|
||||||
import com.oracle.dalvik.*;
|
import com.oracle.dalvik.*;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
@ -30,8 +27,6 @@ import javax.microedition.khronos.egl.EGLDisplay;
|
|||||||
public class JREUtils {
|
public class JREUtils {
|
||||||
private JREUtils() {}
|
private JREUtils() {}
|
||||||
|
|
||||||
public static String JRE_ARCHITECTURE;
|
|
||||||
|
|
||||||
public static String LD_LIBRARY_PATH;
|
public static String LD_LIBRARY_PATH;
|
||||||
private static String nativeLibDir;
|
private static String nativeLibDir;
|
||||||
|
|
||||||
@ -163,12 +158,10 @@ public class JREUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void relocateLibPath(final Context ctx) throws IOException {
|
public static void relocateLibPath(final Context ctx) throws IOException {
|
||||||
if (JRE_ARCHITECTURE == null) {
|
String JRE_ARCHITECTURE = readJREReleaseProperties().get("OS_ARCH");
|
||||||
JRE_ARCHITECTURE = readJREReleaseProperties().get("OS_ARCH");
|
|
||||||
if (Architecture.archAsInt(JRE_ARCHITECTURE) == ARCH_X86){
|
if (Architecture.archAsInt(JRE_ARCHITECTURE) == ARCH_X86){
|
||||||
JRE_ARCHITECTURE = "i386/i486/i586";
|
JRE_ARCHITECTURE = "i386/i486/i586";
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
nativeLibDir = ctx.getApplicationInfo().nativeLibraryDir;
|
nativeLibDir = ctx.getApplicationInfo().nativeLibraryDir;
|
||||||
|
|
||||||
@ -218,8 +211,8 @@ public class JREUtils {
|
|||||||
envMap.put("REGAL_GL_VENDOR", "Android");
|
envMap.put("REGAL_GL_VENDOR", "Android");
|
||||||
envMap.put("REGAL_GL_RENDERER", "Regal");
|
envMap.put("REGAL_GL_RENDERER", "Regal");
|
||||||
envMap.put("REGAL_GL_VERSION", "4.5");
|
envMap.put("REGAL_GL_VERSION", "4.5");
|
||||||
if(Tools.LOCAL_RENDERER != null) {
|
if(LOCAL_RENDERER != null) {
|
||||||
envMap.put("POJAV_RENDERER", Tools.LOCAL_RENDERER);
|
envMap.put("POJAV_RENDERER", LOCAL_RENDERER);
|
||||||
}
|
}
|
||||||
envMap.put("AWTSTUB_WIDTH", Integer.toString(CallbackBridge.windowWidth > 0 ? CallbackBridge.windowWidth : CallbackBridge.physicalWidth));
|
envMap.put("AWTSTUB_WIDTH", Integer.toString(CallbackBridge.windowWidth > 0 ? CallbackBridge.windowWidth : CallbackBridge.physicalWidth));
|
||||||
envMap.put("AWTSTUB_HEIGHT", Integer.toString(CallbackBridge.windowHeight > 0 ? CallbackBridge.windowHeight : CallbackBridge.physicalHeight));
|
envMap.put("AWTSTUB_HEIGHT", Integer.toString(CallbackBridge.windowHeight > 0 ? CallbackBridge.windowHeight : CallbackBridge.physicalHeight));
|
||||||
@ -235,15 +228,15 @@ public class JREUtils {
|
|||||||
}
|
}
|
||||||
reader.close();
|
reader.close();
|
||||||
}
|
}
|
||||||
if(!envMap.containsKey("LIBGL_ES") && Tools.LOCAL_RENDERER != null) {
|
if(!envMap.containsKey("LIBGL_ES") && LOCAL_RENDERER != null) {
|
||||||
int glesMajor = getDetectedVersion();
|
int glesMajor = getDetectedVersion();
|
||||||
Log.i("glesDetect","GLES version detected: "+glesMajor);
|
Log.i("glesDetect","GLES version detected: "+glesMajor);
|
||||||
|
|
||||||
if (glesMajor < 3) {
|
if (glesMajor < 3) {
|
||||||
//fallback to 2 since it's the minimum for the entire app
|
//fallback to 2 since it's the minimum for the entire app
|
||||||
envMap.put("LIBGL_ES","2");
|
envMap.put("LIBGL_ES","2");
|
||||||
} else if (Tools.LOCAL_RENDERER.startsWith("opengles")) {
|
} else if (LOCAL_RENDERER.startsWith("opengles")) {
|
||||||
envMap.put("LIBGL_ES", Tools.LOCAL_RENDERER.replace("opengles", "").replace("_5", ""));
|
envMap.put("LIBGL_ES", LOCAL_RENDERER.replace("opengles", "").replace("_5", ""));
|
||||||
} else {
|
} else {
|
||||||
// TODO if can: other backends such as Vulkan.
|
// TODO if can: other backends such as Vulkan.
|
||||||
// Sure, they should provide GLES 3 support.
|
// Sure, they should provide GLES 3 support.
|
||||||
@ -264,56 +257,26 @@ public class JREUtils {
|
|||||||
// return ldLibraryPath;
|
// return ldLibraryPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int launchJavaVM(final LoggableActivity ctx, final List<String> args) throws Throwable {
|
public static int launchJavaVM(final LoggableActivity ctx, List<String> JVMArguments) throws Throwable {
|
||||||
JREUtils.relocateLibPath(ctx);
|
JREUtils.relocateLibPath(ctx);
|
||||||
// ctx.appendlnToLog("LD_LIBRARY_PATH = " + JREUtils.LD_LIBRARY_PATH);
|
final String graphicsLib = loadGraphicsLibrary();
|
||||||
final String graphicsLib;
|
|
||||||
if(Tools.LOCAL_RENDERER != null){
|
|
||||||
switch (Tools.LOCAL_RENDERER) {
|
|
||||||
case "opengles2":
|
|
||||||
graphicsLib = "libgl4es_114.so";
|
|
||||||
break;
|
|
||||||
case "opengles2_5":
|
|
||||||
graphicsLib = "libgl4es_115.so";
|
|
||||||
break;
|
|
||||||
case "vulkan_zink":
|
|
||||||
graphicsLib = "libOSMesa_8.so";
|
|
||||||
break;
|
|
||||||
case "opengles3_vgpu":
|
|
||||||
graphicsLib = "libvgpu.so";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new RuntimeException("Undefined renderer: " + Tools.LOCAL_RENDERER);
|
|
||||||
}
|
|
||||||
if (!dlopen(graphicsLib) && !dlopen(findInLdLibPath(graphicsLib))) {
|
|
||||||
System.err.println("Failed to load renderer " + graphicsLib + ". Falling back to GL4ES 1.1.4");
|
|
||||||
Tools.LOCAL_RENDERER = "opengles2";
|
|
||||||
dlopen(nativeLibDir + "/libgl4es_114.so");
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
graphicsLib = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<String> javaArgList = new ArrayList<String>();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//List<String> javaArgList = new ArrayList<>();
|
||||||
//Remove arguments that can interfere with the good working of the launcher
|
//Remove arguments that can interfere with the good working of the launcher
|
||||||
purgeArg(javaArgList,"-Xms");
|
purgeArg(JVMArguments,"-Xms");
|
||||||
purgeArg(javaArgList,"-Xmx");
|
purgeArg(JVMArguments,"-Xmx");
|
||||||
purgeArg(javaArgList,"-d32");
|
purgeArg(JVMArguments,"-d32");
|
||||||
purgeArg(javaArgList,"-d64");
|
purgeArg(JVMArguments,"-d64");
|
||||||
|
|
||||||
//Add automatically generated args
|
//Add automatically generated args
|
||||||
javaArgList.add(Tools.DIR_HOME_JRE + "/bin/java");
|
JVMArguments.add(Tools.DIR_HOME_JRE + "/bin/java");
|
||||||
Tools.getJavaArgs(ctx, javaArgList,graphicsLib);
|
getJavaArgs(ctx, JVMArguments,graphicsLib);
|
||||||
|
|
||||||
javaArgList.add("-Xms" + LauncherPreferences.PREF_RAM_ALLOCATION + "M");
|
JVMArguments.add("-Xms" + LauncherPreferences.PREF_RAM_ALLOCATION + "M");
|
||||||
javaArgList.add("-Xmx" + LauncherPreferences.PREF_RAM_ALLOCATION + "M");
|
JVMArguments.add("-Xmx" + LauncherPreferences.PREF_RAM_ALLOCATION + "M");
|
||||||
|
|
||||||
ctx.runOnUiThread(() -> Toast.makeText(ctx, ctx.getString(R.string.autoram_info_msg,LauncherPreferences.PREF_RAM_ALLOCATION), Toast.LENGTH_SHORT).show());
|
ctx.runOnUiThread(() -> Toast.makeText(ctx, ctx.getString(R.string.autoram_info_msg,LauncherPreferences.PREF_RAM_ALLOCATION), Toast.LENGTH_SHORT).show());
|
||||||
System.out.println(javaArgList);
|
System.out.println(JVMArguments);
|
||||||
javaArgList.addAll(args);
|
|
||||||
|
|
||||||
// For debugging only!
|
// For debugging only!
|
||||||
/*
|
/*
|
||||||
@ -329,7 +292,7 @@ public class JREUtils {
|
|||||||
setupExitTrap(ctx.getApplication());
|
setupExitTrap(ctx.getApplication());
|
||||||
chdir(Tools.DIR_GAME_NEW);
|
chdir(Tools.DIR_GAME_NEW);
|
||||||
|
|
||||||
final int exitCode = VMLauncher.launchJVM(javaArgList.toArray(new String[0]));
|
final int exitCode = VMLauncher.launchJVM(JVMArguments.toArray(new String[0]));
|
||||||
ctx.appendlnToLog("Java Exit code: " + exitCode);
|
ctx.appendlnToLog("Java Exit code: " + exitCode);
|
||||||
if (exitCode != 0) {
|
if (exitCode != 0) {
|
||||||
ctx.runOnUiThread(() -> {
|
ctx.runOnUiThread(() -> {
|
||||||
@ -343,6 +306,56 @@ public class JREUtils {
|
|||||||
return exitCode;
|
return exitCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fills up the <b>javaArgList</b> passed in parameter with the user arguments
|
||||||
|
* and the auto-generated ones (eg. the window resolution).
|
||||||
|
* @param ctx The application context
|
||||||
|
* @param javaArgList The current list of arguments
|
||||||
|
* @param renderLib The name of the renderer used.
|
||||||
|
*/
|
||||||
|
public static void getJavaArgs(Context ctx, List<String> javaArgList, String renderLib) {
|
||||||
|
List<String> userArguments = parseJavaArguments(LauncherPreferences.PREF_CUSTOM_JAVA_ARGS);
|
||||||
|
String[] overridableArguments = new String[]{
|
||||||
|
"-Djava.home=" + Tools.DIR_HOME_JRE,
|
||||||
|
"-Djava.io.tmpdir=" + ctx.getCacheDir().getAbsolutePath(),
|
||||||
|
"-Duser.home=" + new File(Tools.DIR_GAME_NEW).getParent(),
|
||||||
|
"-Duser.language=" + System.getProperty("user.language"),
|
||||||
|
"-Dos.name=Linux",
|
||||||
|
"-Dos.version=Android-" + Build.VERSION.RELEASE,
|
||||||
|
"-Dpojav.path.minecraft=" + Tools.DIR_GAME_NEW,
|
||||||
|
"-Dpojav.path.private.account=" + Tools.DIR_ACCOUNT_NEW,
|
||||||
|
"-Dorg.lwjgl.opengl.libname=" + renderLib,
|
||||||
|
|
||||||
|
//LWJGL 3 DEBUG FLAGS
|
||||||
|
//"-Dorg.lwjgl.util.Debug=true",
|
||||||
|
//"-Dorg.lwjgl.util.DebugFunctions=true",
|
||||||
|
//"-Dorg.lwjgl.util.DebugLoader=true",
|
||||||
|
// GLFW Stub width height
|
||||||
|
"-Dglfwstub.windowWidth=" + CallbackBridge.windowWidth,
|
||||||
|
"-Dglfwstub.windowHeight=" + CallbackBridge.windowHeight,
|
||||||
|
"-Dglfwstub.initEgl=false",
|
||||||
|
|
||||||
|
"-Dnet.minecraft.clientmodname=" + Tools.APP_NAME,
|
||||||
|
"-Dfml.earlyprogresswindow=false" //Forge 1.14+ workaround
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
for (String userArgument : userArguments) {
|
||||||
|
for(int i=0; i < overridableArguments.length; ++i){
|
||||||
|
String overridableArgument = overridableArguments[i];
|
||||||
|
//Only java properties are considered overridable for now
|
||||||
|
if(userArgument.startsWith("-D") && userArgument.startsWith(overridableArgument.substring(0, overridableArgument.indexOf("=")))){
|
||||||
|
overridableArguments[i] = ""; //Remove the argument since it is overridden
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Add all the arguments
|
||||||
|
javaArgList.addAll(userArguments);
|
||||||
|
javaArgList.addAll(Arrays.asList(overridableArguments));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse and separate java arguments in a user friendly fashion
|
* Parse and separate java arguments in a user friendly fashion
|
||||||
* It supports multi line and absence of spaces between arguments
|
* It supports multi line and absence of spaces between arguments
|
||||||
@ -375,6 +388,39 @@ public class JREUtils {
|
|||||||
return parsedArguments;
|
return parsedArguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open the render library in accordance to the settings.
|
||||||
|
* It will fallback if it fails to load the library.
|
||||||
|
* @return The name of the loaded library
|
||||||
|
*/
|
||||||
|
public static String loadGraphicsLibrary(){
|
||||||
|
String renderLibrary;
|
||||||
|
switch (LOCAL_RENDERER){
|
||||||
|
case "opengles2": renderLibrary = "libgl4es_114.so"; break;
|
||||||
|
case "opengles2_5": renderLibrary = "libgl4es_115.so"; break;
|
||||||
|
case "vulkan_zink": renderLibrary = "libOSMesa_8.so"; break;
|
||||||
|
case "opengles3_vgpu" : renderLibrary = "libvgpu.so"; break;
|
||||||
|
default:
|
||||||
|
Log.w("RENDER_LIBRARY", "No renderer selected, defaulting to opengles2");
|
||||||
|
renderLibrary = "libgl4es_114.so";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!dlopen(renderLibrary) && !dlopen(findInLdLibPath(renderLibrary))) {
|
||||||
|
Log.e("RENDER_LIBRARY","Failed to load renderer " + renderLibrary + ". Falling back to GL4ES 1.1.4");
|
||||||
|
LOCAL_RENDERER = "opengles2";
|
||||||
|
renderLibrary = "libgl4es_114.so";
|
||||||
|
dlopen(nativeLibDir + "/libgl4es_114.so");
|
||||||
|
}
|
||||||
|
return renderLibrary;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the argument from the list, if it exists
|
||||||
|
* If the argument exists multiple times, they will all be removed.
|
||||||
|
* @param argList The argument list to purge
|
||||||
|
* @param argStart The argument to purge from the list.
|
||||||
|
*/
|
||||||
private static void purgeArg(List<String> argList, String argStart) {
|
private static void purgeArg(List<String> argList, String argStart) {
|
||||||
for(int i = 0; i < argList.size(); i++) {
|
for(int i = 0; i < argList.size(); i++) {
|
||||||
final String arg = argList.get(i);
|
final String arg = argList.get(i);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user