mirror of
https://github.com/AngelAuraMC/Amethyst-Android.git
synced 2025-09-15 15:48:26 -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());
|
||||
}
|
||||
|
||||
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) {
|
||||
String username = profile.username;
|
||||
String versionName = versionInfo.id;
|
||||
@ -226,7 +168,7 @@ public final class Tools {
|
||||
File gameDir = new File(strGameDir);
|
||||
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_player_name", username);
|
||||
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.archAsString;
|
||||
import static net.kdt.pojavlaunch.Architecture.is64BitsDevice;
|
||||
import static net.kdt.pojavlaunch.Tools.LOCAL_RENDERER;
|
||||
|
||||
import android.app.*;
|
||||
import android.content.*;
|
||||
import android.opengl.EGL14;
|
||||
import android.opengl.EGLExt;
|
||||
import android.opengl.GLES10;
|
||||
import android.os.Build;
|
||||
import android.system.*;
|
||||
import android.util.*;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.oracle.dalvik.*;
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
@ -29,9 +26,7 @@ import javax.microedition.khronos.egl.EGLDisplay;
|
||||
|
||||
public class JREUtils {
|
||||
private JREUtils() {}
|
||||
|
||||
public static String JRE_ARCHITECTURE;
|
||||
|
||||
|
||||
public static String LD_LIBRARY_PATH;
|
||||
private static String nativeLibDir;
|
||||
|
||||
@ -163,11 +158,9 @@ public class JREUtils {
|
||||
}
|
||||
|
||||
public static void relocateLibPath(final Context ctx) throws IOException {
|
||||
if (JRE_ARCHITECTURE == null) {
|
||||
JRE_ARCHITECTURE = readJREReleaseProperties().get("OS_ARCH");
|
||||
if (Architecture.archAsInt(JRE_ARCHITECTURE) == ARCH_X86){
|
||||
JRE_ARCHITECTURE = "i386/i486/i586";
|
||||
}
|
||||
String JRE_ARCHITECTURE = readJREReleaseProperties().get("OS_ARCH");
|
||||
if (Architecture.archAsInt(JRE_ARCHITECTURE) == ARCH_X86){
|
||||
JRE_ARCHITECTURE = "i386/i486/i586";
|
||||
}
|
||||
|
||||
nativeLibDir = ctx.getApplicationInfo().nativeLibraryDir;
|
||||
@ -218,8 +211,8 @@ public class JREUtils {
|
||||
envMap.put("REGAL_GL_VENDOR", "Android");
|
||||
envMap.put("REGAL_GL_RENDERER", "Regal");
|
||||
envMap.put("REGAL_GL_VERSION", "4.5");
|
||||
if(Tools.LOCAL_RENDERER != null) {
|
||||
envMap.put("POJAV_RENDERER", Tools.LOCAL_RENDERER);
|
||||
if(LOCAL_RENDERER != null) {
|
||||
envMap.put("POJAV_RENDERER", LOCAL_RENDERER);
|
||||
}
|
||||
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));
|
||||
@ -235,15 +228,15 @@ public class JREUtils {
|
||||
}
|
||||
reader.close();
|
||||
}
|
||||
if(!envMap.containsKey("LIBGL_ES") && Tools.LOCAL_RENDERER != null) {
|
||||
if(!envMap.containsKey("LIBGL_ES") && LOCAL_RENDERER != null) {
|
||||
int glesMajor = getDetectedVersion();
|
||||
Log.i("glesDetect","GLES version detected: "+glesMajor);
|
||||
|
||||
if (glesMajor < 3) {
|
||||
//fallback to 2 since it's the minimum for the entire app
|
||||
envMap.put("LIBGL_ES","2");
|
||||
} else if (Tools.LOCAL_RENDERER.startsWith("opengles")) {
|
||||
envMap.put("LIBGL_ES", Tools.LOCAL_RENDERER.replace("opengles", "").replace("_5", ""));
|
||||
} else if (LOCAL_RENDERER.startsWith("opengles")) {
|
||||
envMap.put("LIBGL_ES", LOCAL_RENDERER.replace("opengles", "").replace("_5", ""));
|
||||
} else {
|
||||
// TODO if can: other backends such as Vulkan.
|
||||
// Sure, they should provide GLES 3 support.
|
||||
@ -264,56 +257,26 @@ public class JREUtils {
|
||||
// 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);
|
||||
// ctx.appendlnToLog("LD_LIBRARY_PATH = " + JREUtils.LD_LIBRARY_PATH);
|
||||
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>();
|
||||
|
||||
|
||||
final String graphicsLib = loadGraphicsLibrary();
|
||||
|
||||
//List<String> javaArgList = new ArrayList<>();
|
||||
//Remove arguments that can interfere with the good working of the launcher
|
||||
purgeArg(javaArgList,"-Xms");
|
||||
purgeArg(javaArgList,"-Xmx");
|
||||
purgeArg(javaArgList,"-d32");
|
||||
purgeArg(javaArgList,"-d64");
|
||||
purgeArg(JVMArguments,"-Xms");
|
||||
purgeArg(JVMArguments,"-Xmx");
|
||||
purgeArg(JVMArguments,"-d32");
|
||||
purgeArg(JVMArguments,"-d64");
|
||||
|
||||
//Add automatically generated args
|
||||
javaArgList.add(Tools.DIR_HOME_JRE + "/bin/java");
|
||||
Tools.getJavaArgs(ctx, javaArgList,graphicsLib);
|
||||
JVMArguments.add(Tools.DIR_HOME_JRE + "/bin/java");
|
||||
getJavaArgs(ctx, JVMArguments,graphicsLib);
|
||||
|
||||
javaArgList.add("-Xms" + LauncherPreferences.PREF_RAM_ALLOCATION + "M");
|
||||
javaArgList.add("-Xmx" + LauncherPreferences.PREF_RAM_ALLOCATION + "M");
|
||||
JVMArguments.add("-Xms" + 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());
|
||||
System.out.println(javaArgList);
|
||||
javaArgList.addAll(args);
|
||||
System.out.println(JVMArguments);
|
||||
|
||||
// For debugging only!
|
||||
/*
|
||||
@ -329,7 +292,7 @@ public class JREUtils {
|
||||
setupExitTrap(ctx.getApplication());
|
||||
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);
|
||||
if (exitCode != 0) {
|
||||
ctx.runOnUiThread(() -> {
|
||||
@ -343,6 +306,56 @@ public class JREUtils {
|
||||
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
|
||||
* It supports multi line and absence of spaces between arguments
|
||||
@ -375,6 +388,39 @@ public class JREUtils {
|
||||
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) {
|
||||
for(int i = 0; i < argList.size(); i++) {
|
||||
final String arg = argList.get(i);
|
||||
|
Loading…
x
Reference in New Issue
Block a user