jre 11 support

This commit is contained in:
Tungstend 2024-01-28 21:14:51 +08:00
parent b86a762717
commit 1c26d0b340
22 changed files with 156 additions and 56 deletions

View File

@ -51,7 +51,7 @@ android {
variant.mergeAssetsProvider.get().doLast { variant.mergeAssetsProvider.get().doLast {
def arch = System.getProperty("arch", "all") def arch = System.getProperty("arch", "all")
def assetsDir = mergeAssetsProvider.get().outputDir.get() def assetsDir = mergeAssetsProvider.get().outputDir.get()
def java = ['jre8', 'jre17', 'jre21'] def java = ['jre8', 'jre11', 'jre17', 'jre21']
println(arch) println(arch)
java.forEach { String str -> java.forEach { String str ->
def runtimeDir = new File([assetsDir, "app_runtime/java/" + str].join(File.separator)) def runtimeDir = new File([assetsDir, "app_runtime/java/" + str].join(File.separator))

View File

@ -0,0 +1 @@
1

View File

@ -32,6 +32,7 @@ public class RuntimeFragment extends FCLFragment implements View.OnClickListener
boolean cacio = false; boolean cacio = false;
boolean cacio17 = false; boolean cacio17 = false;
boolean java8 = false; boolean java8 = false;
boolean java11 = false;
boolean java17 = false; boolean java17 = false;
boolean java21 = false; boolean java21 = false;
@ -39,6 +40,7 @@ public class RuntimeFragment extends FCLFragment implements View.OnClickListener
private FCLProgressBar cacioProgress; private FCLProgressBar cacioProgress;
private FCLProgressBar cacio17Progress; private FCLProgressBar cacio17Progress;
private FCLProgressBar java8Progress; private FCLProgressBar java8Progress;
private FCLProgressBar java11Progress;
private FCLProgressBar java17Progress; private FCLProgressBar java17Progress;
private FCLProgressBar java21Progress; private FCLProgressBar java21Progress;
@ -46,6 +48,7 @@ public class RuntimeFragment extends FCLFragment implements View.OnClickListener
private FCLImageView cacioState; private FCLImageView cacioState;
private FCLImageView cacio17State; private FCLImageView cacio17State;
private FCLImageView java8State; private FCLImageView java8State;
private FCLImageView java11State;
private FCLImageView java17State; private FCLImageView java17State;
private FCLImageView java21State; private FCLImageView java21State;
@ -60,6 +63,7 @@ public class RuntimeFragment extends FCLFragment implements View.OnClickListener
cacioProgress = findViewById(view, R.id.cacio_progress); cacioProgress = findViewById(view, R.id.cacio_progress);
cacio17Progress = findViewById(view, R.id.cacio17_progress); cacio17Progress = findViewById(view, R.id.cacio17_progress);
java8Progress = findViewById(view, R.id.java8_progress); java8Progress = findViewById(view, R.id.java8_progress);
java11Progress = findViewById(view, R.id.java11_progress);
java17Progress = findViewById(view, R.id.java17_progress); java17Progress = findViewById(view, R.id.java17_progress);
java21Progress = findViewById(view, R.id.java21_progress); java21Progress = findViewById(view, R.id.java21_progress);
@ -67,6 +71,7 @@ public class RuntimeFragment extends FCLFragment implements View.OnClickListener
cacioState = findViewById(view, R.id.cacio_state); cacioState = findViewById(view, R.id.cacio_state);
cacio17State = findViewById(view, R.id.cacio17_state); cacio17State = findViewById(view, R.id.cacio17_state);
java8State = findViewById(view, R.id.java8_state); java8State = findViewById(view, R.id.java8_state);
java11State = findViewById(view, R.id.java11_state);
java17State = findViewById(view, R.id.java17_state); java17State = findViewById(view, R.id.java17_state);
java21State = findViewById(view, R.id.java21_state); java21State = findViewById(view, R.id.java21_state);
@ -88,6 +93,7 @@ public class RuntimeFragment extends FCLFragment implements View.OnClickListener
cacio = RuntimeUtils.isLatest(FCLPath.CACIOCAVALLO_8_DIR, "/assets/app_runtime/caciocavallo"); cacio = RuntimeUtils.isLatest(FCLPath.CACIOCAVALLO_8_DIR, "/assets/app_runtime/caciocavallo");
cacio17 = RuntimeUtils.isLatest(FCLPath.CACIOCAVALLO_17_DIR, "/assets/app_runtime/caciocavallo17"); cacio17 = RuntimeUtils.isLatest(FCLPath.CACIOCAVALLO_17_DIR, "/assets/app_runtime/caciocavallo17");
java8 = RuntimeUtils.isLatest(FCLPath.JAVA_8_PATH, "/assets/app_runtime/java/jre8"); java8 = RuntimeUtils.isLatest(FCLPath.JAVA_8_PATH, "/assets/app_runtime/java/jre8");
java11 = RuntimeUtils.isLatest(FCLPath.JAVA_11_PATH, "/assets/app_runtime/java/jre11");
java17 = RuntimeUtils.isLatest(FCLPath.JAVA_17_PATH, "/assets/app_runtime/java/jre17"); java17 = RuntimeUtils.isLatest(FCLPath.JAVA_17_PATH, "/assets/app_runtime/java/jre17");
java21 = RuntimeUtils.isLatest(FCLPath.JAVA_21_PATH, "/assets/app_runtime/java/jre21"); java21 = RuntimeUtils.isLatest(FCLPath.JAVA_21_PATH, "/assets/app_runtime/java/jre21");
} catch (IOException e) { } catch (IOException e) {
@ -107,13 +113,14 @@ public class RuntimeFragment extends FCLFragment implements View.OnClickListener
cacioState.setBackgroundDrawable(cacio ? stateDone : stateUpdate); cacioState.setBackgroundDrawable(cacio ? stateDone : stateUpdate);
cacio17State.setBackgroundDrawable(cacio17 ? stateDone : stateUpdate); cacio17State.setBackgroundDrawable(cacio17 ? stateDone : stateUpdate);
java8State.setBackgroundDrawable(java8 ? stateDone : stateUpdate); java8State.setBackgroundDrawable(java8 ? stateDone : stateUpdate);
java11State.setBackgroundDrawable(java11 ? stateDone : stateUpdate);
java17State.setBackgroundDrawable(java17 ? stateDone : stateUpdate); java17State.setBackgroundDrawable(java17 ? stateDone : stateUpdate);
java21State.setBackgroundDrawable(java21 ? stateDone : stateUpdate); java21State.setBackgroundDrawable(java21 ? stateDone : stateUpdate);
} }
} }
private boolean isLatest() { private boolean isLatest() {
return lwjgl && cacio && cacio17 && java8 && java17 && java21; return lwjgl && cacio && cacio17 && java8 && java11 && java17 && java21;
} }
private void check() { private void check() {
@ -211,6 +218,31 @@ public class RuntimeFragment extends FCLFragment implements View.OnClickListener
} }
}).start(); }).start();
} }
if (!java11) {
java11State.setVisibility(View.GONE);
java11Progress.setVisibility(View.VISIBLE);
new Thread(() -> {
try {
RuntimeUtils.installJava(getContext(), FCLPath.JAVA_11_PATH, "app_runtime/java/jre11");
if (!LocaleUtils.getSystemLocale().getDisplayName().equals(Locale.CHINA.getDisplayName())) {
FileUtils.writeText(new File(FCLPath.JAVA_11_PATH + "/resolv.conf"), "nameserver 1.1.1.1\n" + "nameserver 1.0.0.1");
} else {
FileUtils.writeText(new File(FCLPath.JAVA_11_PATH + "/resolv.conf"), "nameserver 8.8.8.8\n" + "nameserver 8.8.4.4");
}
java11 = true;
} catch (IOException e) {
e.printStackTrace();
}
if (getActivity() != null) {
getActivity().runOnUiThread(() -> {
java11State.setVisibility(View.VISIBLE);
java11Progress.setVisibility(View.GONE);
refreshDrawables();
check();
});
}
}).start();
}
if (!java17) { if (!java17) {
java17State.setVisibility(View.GONE); java17State.setVisibility(View.GONE);
java17Progress.setVisibility(View.VISIBLE); java17Progress.setVisibility(View.VISIBLE);

View File

@ -13,6 +13,7 @@ import com.tungsten.fcl.control.MenuType;
import com.tungsten.fcl.util.RequestCodes; import com.tungsten.fcl.util.RequestCodes;
import com.tungsten.fclauncher.FCLConfig; import com.tungsten.fclauncher.FCLConfig;
import com.tungsten.fclauncher.bridge.FCLBridge; import com.tungsten.fclauncher.bridge.FCLBridge;
import com.tungsten.fclcore.game.JavaVersion;
import com.tungsten.fclcore.util.io.IOUtils; import com.tungsten.fclcore.util.io.IOUtils;
import com.tungsten.fcllibrary.browser.FileBrowser; import com.tungsten.fcllibrary.browser.FileBrowser;
import com.tungsten.fcllibrary.browser.options.LibMode; import com.tungsten.fcllibrary.browser.options.LibMode;
@ -74,12 +75,13 @@ public class JarExecutorHelper {
} }
private static int getNearestJavaVersion(int majorVersion) { private static int getNearestJavaVersion(int majorVersion) {
if (majorVersion == -1) if (majorVersion >= JavaVersion.JAVA_VERSION_17)
return 8; return JavaVersion.JAVA_VERSION_21;
int diffFactorFirst = Math.abs(8 - majorVersion); if (majorVersion >= JavaVersion.JAVA_VERSION_11)
int diffFactorSecond = Math.abs(17 - majorVersion); return JavaVersion.JAVA_VERSION_17;
int diffFactorThird = Math.abs(21 - majorVersion); if (majorVersion >= JavaVersion.JAVA_VERSION_8)
return diffFactorFirst < diffFactorSecond ? 8 : diffFactorSecond < diffFactorThird ? 17 : 21; return JavaVersion.JAVA_VERSION_11;
return JavaVersion.JAVA_VERSION_8;
} }
private static int getJavaVersion(File file) { private static int getJavaVersion(File file) {

View File

@ -35,7 +35,7 @@ public class JarExecutorLauncher extends Launcher {
private CommandBuilder generateCommandLine(String args) { private CommandBuilder generateCommandLine(String args) {
CommandBuilder res = new CommandBuilder(); CommandBuilder res = new CommandBuilder();
getCacioJavaArgs(res, javaVersion == 8); getCacioJavaArgs(res, javaVersion == 8, javaVersion == 11);
res.addDefault("-Xms", MemoryUtils.findBestRAMAllocation(context) + "m"); res.addDefault("-Xms", MemoryUtils.findBestRAMAllocation(context) + "m");
res.addDefault("-Xmx", MemoryUtils.findBestRAMAllocation(context) + "m"); res.addDefault("-Xmx", MemoryUtils.findBestRAMAllocation(context) + "m");
@ -55,7 +55,7 @@ public class JarExecutorLauncher extends Launcher {
return res; return res;
} }
public static void getCacioJavaArgs(CommandBuilder res, boolean isJava8) { public static void getCacioJavaArgs(CommandBuilder res, boolean isJava8, boolean isJava11) {
res.addDefault("-Djava.awt.headless=", "false"); res.addDefault("-Djava.awt.headless=", "false");
res.addDefault("-Dcacio.managed.screensize=", FCLBridge.DEFAULT_WIDTH + "x" + FCLBridge.DEFAULT_HEIGHT); res.addDefault("-Dcacio.managed.screensize=", FCLBridge.DEFAULT_WIDTH + "x" + FCLBridge.DEFAULT_HEIGHT);
res.addDefault("-Dcacio.font.fontmanager=", "sun.awt.X11FontManager"); res.addDefault("-Dcacio.font.fontmanager=", "sun.awt.X11FontManager");
@ -64,7 +64,7 @@ public class JarExecutorLauncher extends Launcher {
if (isJava8) { if (isJava8) {
res.addDefault("-Dawt.toolkit=", "net.java.openjdk.cacio.ctc.CTCToolkit"); res.addDefault("-Dawt.toolkit=", "net.java.openjdk.cacio.ctc.CTCToolkit");
res.addDefault("-Djava.awt.graphicsenv=", "net.java.openjdk.cacio.ctc.CTCGraphicsEnvironment"); res.addDefault("-Djava.awt.graphicsenv=", "net.java.openjdk.cacio.ctc.CTCGraphicsEnvironment");
} else { } else if (!isJava11) {
res.addDefault("-Dawt.toolkit=", "com.github.caciocavallosilano.cacio.ctc.CTCToolkit"); res.addDefault("-Dawt.toolkit=", "com.github.caciocavallosilano.cacio.ctc.CTCToolkit");
res.addDefault("-Djava.awt.graphicsenv=", "com.github.caciocavallosilano.cacio.ctc.CTCGraphicsEnvironment"); res.addDefault("-Djava.awt.graphicsenv=", "com.github.caciocavallosilano.cacio.ctc.CTCGraphicsEnvironment");
res.addDefault("-Djava.system.class.loader=", "com.github.caciocavallosilano.cacio.ctc.CTCPreloadClassLoader"); res.addDefault("-Djava.system.class.loader=", "com.github.caciocavallosilano.cacio.ctc.CTCPreloadClassLoader");
@ -119,7 +119,7 @@ public class JarExecutorLauncher extends Launcher {
FCLConfig config = new FCLConfig( FCLConfig config = new FCLConfig(
context, context,
FCLPath.LOG_DIR, FCLPath.LOG_DIR,
javaVersion == 8 ? FCLPath.JAVA_8_PATH : javaVersion == 17 ? FCLPath.JAVA_17_PATH : FCLPath.JAVA_21_PATH, javaVersion == 8 ? FCLPath.JAVA_8_PATH : javaVersion == 11 ? FCLPath.JAVA_11_PATH : javaVersion == 17 ? FCLPath.JAVA_17_PATH : FCLPath.JAVA_21_PATH,
Profiles.getSelectedProfile().getGameDir().getAbsolutePath(), Profiles.getSelectedProfile().getGameDir().getAbsolutePath(),
FCLConfig.Renderer.RENDERER_GL4ES, FCLConfig.Renderer.RENDERER_GL4ES,
finalArgs finalArgs

View File

@ -277,7 +277,7 @@ public final class LauncherHelper {
.thenComposeAsync(Schedulers.androidUIThread(), javaVersions -> { .thenComposeAsync(Schedulers.androidUIThread(), javaVersions -> {
JavaVersion javaVersion = (JavaVersion) javaVersions.get(0); JavaVersion javaVersion = (JavaVersion) javaVersions.get(0);
JavaVersion suggestedJavaVersion = (JavaVersion) javaVersions.get(1); JavaVersion suggestedJavaVersion = (JavaVersion) javaVersions.get(1);
if (setting.getJava() == 0 || javaVersion.getVersion() == suggestedJavaVersion.getVersion()) { if (setting.getJava().equals(JavaVersion.JAVA_AUTO.getVersionName()) || javaVersion.getVersion() == suggestedJavaVersion.getVersion()) {
return Task.completed(suggestedJavaVersion); return Task.completed(suggestedJavaVersion);
} }
@ -287,10 +287,10 @@ public final class LauncherHelper {
builder.setCancelable(false); builder.setCancelable(false);
builder.setMessage(context.getString(R.string.launch_error_java)); builder.setMessage(context.getString(R.string.launch_error_java));
builder.setPositiveButton(context.getString(R.string.launch_error_java_auto), () -> { builder.setPositiveButton(context.getString(R.string.launch_error_java_auto), () -> {
setting.setJava(0); setting.setJava(JavaVersion.JAVA_AUTO.getVersionName());
future.complete(suggestedJavaVersion); future.complete(suggestedJavaVersion);
}); });
builder.setPositiveButton(context.getString(R.string.launch_error_java_continue), continueAction::run); builder.setNegativeButton(context.getString(R.string.launch_error_java_continue), continueAction::run);
builder.create().show(); builder.create().show();
return Task.fromCompletableFuture(future); return Task.fromCompletableFuture(future);
}).withStage("launch.state.java"); }).withStage("launch.state.java");

View File

@ -79,20 +79,17 @@ public final class VersionSetting implements Cloneable {
// java // java
private final ObjectProperty<Integer> javaProperty = new SimpleObjectProperty<>(this, "java", 0); private final StringProperty javaProperty = new SimpleStringProperty(this, "java", JavaVersion.JAVA_AUTO.getVersionName());
public ObjectProperty<Integer> javaProperty() { public StringProperty javaProperty() {
return javaProperty; return javaProperty;
} }
/** public String getJava() {
* Java version or "Custom" if user customizes java directory, "Default" if the jvm that this app relies on.
*/
public int getJava() {
return javaProperty.get(); return javaProperty.get();
} }
public void setJava(int java) { public void setJava(String java) {
javaProperty.set(java); javaProperty.set(java);
} }
@ -331,14 +328,18 @@ public final class VersionSetting implements Cloneable {
public Task<JavaVersion> getJavaVersion(Version version) { public Task<JavaVersion> getJavaVersion(Version version) {
return Task.runAsync(Schedulers.androidUIThread(), () -> { return Task.runAsync(Schedulers.androidUIThread(), () -> {
if (getJava() != 0 && getJava() != 1 && getJava() != 2) { if (!getJava().equals(JavaVersion.JAVA_AUTO.getVersionName()) &&
setJava(0); !getJava().equals(JavaVersion.JAVA_8.getVersionName()) &&
!getJava().equals(JavaVersion.JAVA_11.getVersionName()) &&
!getJava().equals(JavaVersion.JAVA_17.getVersionName()) &&
!getJava().equals(JavaVersion.JAVA_21.getVersionName())) {
setJava(JavaVersion.JAVA_AUTO.getVersionName());
} }
}).thenSupplyAsync(() -> { }).thenSupplyAsync(() -> {
if (getJava() == 0) { if (getJava().equals(JavaVersion.JAVA_AUTO.getVersionName())) {
return JavaVersion.getSuitableJavaVersion(version); return JavaVersion.getSuitableJavaVersion(version);
} else { } else {
return JavaVersion.getJavaFromId(getJava()); return JavaVersion.getJavaFromVersionName(getJava());
} }
}); });
} }
@ -440,7 +441,7 @@ public final class VersionSetting implements Cloneable {
vs.setAutoMemory(Optional.ofNullable(obj.get("autoMemory")).map(JsonElement::getAsBoolean).orElse(true)); vs.setAutoMemory(Optional.ofNullable(obj.get("autoMemory")).map(JsonElement::getAsBoolean).orElse(true));
vs.setPermSize(Optional.ofNullable(obj.get("permSize")).map(JsonElement::getAsString).orElse("")); vs.setPermSize(Optional.ofNullable(obj.get("permSize")).map(JsonElement::getAsString).orElse(""));
vs.setServerIp(Optional.ofNullable(obj.get("serverIp")).map(JsonElement::getAsString).orElse("")); vs.setServerIp(Optional.ofNullable(obj.get("serverIp")).map(JsonElement::getAsString).orElse(""));
vs.setJava(Optional.ofNullable(obj.get("java")).map(JsonElement::getAsInt).orElse(0)); vs.setJava(Optional.ofNullable(obj.get("java")).map(JsonElement::getAsString).orElse(JavaVersion.JAVA_AUTO.getVersionName()));
vs.setScaleFactor(Optional.ofNullable(obj.get("scaleFactor")).map(JsonElement::getAsDouble).orElse(1d)); vs.setScaleFactor(Optional.ofNullable(obj.get("scaleFactor")).map(JsonElement::getAsDouble).orElse(1d));
vs.setNotCheckGame(Optional.ofNullable(obj.get("notCheckGame")).map(JsonElement::getAsBoolean).orElse(false)); vs.setNotCheckGame(Optional.ofNullable(obj.get("notCheckGame")).map(JsonElement::getAsBoolean).orElse(false));
vs.setNotCheckJVM(Optional.ofNullable(obj.get("notCheckJVM")).map(JsonElement::getAsBoolean).orElse(false)); vs.setNotCheckJVM(Optional.ofNullable(obj.get("notCheckJVM")).map(JsonElement::getAsBoolean).orElse(false));

View File

@ -78,7 +78,7 @@ public class VersionSettingPage extends FCLCommonPage implements ManageUI.Versio
private FCLSwitch noGameCheckSwitch; private FCLSwitch noGameCheckSwitch;
private FCLSwitch noJVMCheckSwitch; private FCLSwitch noJVMCheckSwitch;
private FCLSpinner<Integer> javaSpinner; private FCLSpinner<String> javaSpinner;
private FCLSpinner<FCLConfig.Renderer> rendererSpinner; private FCLSpinner<FCLConfig.Renderer> rendererSpinner;
private FCLImageButton editIconButton; private FCLImageButton editIconButton;
@ -133,11 +133,12 @@ public class VersionSettingPage extends FCLCommonPage implements ManageUI.Versio
scaleFactorText.stringProperty().bind(Bindings.createStringBinding(() -> (int) (lastVersionSetting.getScaleFactor() * 100) + " %", scaleFactorSeekbar.percentProgressProperty())); scaleFactorText.stringProperty().bind(Bindings.createStringBinding(() -> (int) (lastVersionSetting.getScaleFactor() * 100) + " %", scaleFactorSeekbar.percentProgressProperty()));
// add spinner data // add spinner data
ArrayList<Integer> javaVersionDataList = new ArrayList<>(); ArrayList<String> javaVersionDataList = new ArrayList<>();
javaVersionDataList.add(JavaVersion.JAVA_AUTO.getId()); javaVersionDataList.add(JavaVersion.JAVA_AUTO.getVersionName());
javaVersionDataList.add(JavaVersion.JAVA_8.getId()); javaVersionDataList.add(JavaVersion.JAVA_8.getVersionName());
javaVersionDataList.add(JavaVersion.JAVA_17.getId()); javaVersionDataList.add(JavaVersion.JAVA_11.getVersionName());
javaVersionDataList.add(JavaVersion.JAVA_21.getId()); javaVersionDataList.add(JavaVersion.JAVA_17.getVersionName());
javaVersionDataList.add(JavaVersion.JAVA_21.getVersionName());
javaSpinner.setDataList(javaVersionDataList); javaSpinner.setDataList(javaVersionDataList);
ArrayList<FCLConfig.Renderer> rendererDataList = new ArrayList<>(); ArrayList<FCLConfig.Renderer> rendererDataList = new ArrayList<>();
@ -152,6 +153,7 @@ public class VersionSettingPage extends FCLCommonPage implements ManageUI.Versio
ArrayList<String> javaVersionList = new ArrayList<>(); ArrayList<String> javaVersionList = new ArrayList<>();
javaVersionList.add(getContext().getString(R.string.settings_game_java_version_auto)); javaVersionList.add(getContext().getString(R.string.settings_game_java_version_auto));
javaVersionList.add("JRE 8"); javaVersionList.add("JRE 8");
javaVersionList.add("JRE 11");
javaVersionList.add("JRE 17"); javaVersionList.add("JRE 17");
javaVersionList.add("JRE 21"); javaVersionList.add("JRE 21");
ArrayAdapter<String> javaAdapter = new ArrayAdapter<>(getContext(), R.layout.item_spinner_auto_tint, javaVersionList); ArrayAdapter<String> javaAdapter = new ArrayAdapter<>(getContext(), R.layout.item_spinner_auto_tint, javaVersionList);

View File

@ -179,6 +179,47 @@
</androidx.appcompat.widget.LinearLayoutCompat> </androidx.appcompat.widget.LinearLayoutCompat>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@android:color/darker_gray"/>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:orientation="horizontal">
<com.tungsten.fcllibrary.component.view.FCLTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/splash_runtime_java11"
android:layout_gravity="center"/>
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1"/>
<com.tungsten.fcllibrary.component.view.FCLProgressBar
android:visibility="gone"
android:layout_width="24dp"
android:layout_height="24dp"
android:id="@+id/java11_progress"
android:layout_gravity="center"
android:layout_marginStart="10dp"/>
<com.tungsten.fcllibrary.component.view.FCLImageView
app:auto_src_tint="false"
android:tint="@android:color/darker_gray"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/java11_state"
android:layout_gravity="center"
android:layout_marginStart="10dp"/>
</androidx.appcompat.widget.LinearLayoutCompat>
<View <View
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="1dp" android:layout_height="1dp"

View File

@ -411,7 +411,7 @@
<string name="jar_executor_crash_reason">尚不支持 Jar Executor 崩溃原因分析。</string> <string name="jar_executor_crash_reason">尚不支持 Jar Executor 崩溃原因分析。</string>
<string name="launch">启动游戏</string> <string name="launch">启动游戏</string>
<string name="launch_error_java">错误的 Java 版本</string> <string name="launch_error_java">你正在使用不推荐的 Java 版本,确定要继续吗?</string>
<string name="launch_error_java_auto">自动选择</string> <string name="launch_error_java_auto">自动选择</string>
<string name="launch_error_java_continue">继续</string> <string name="launch_error_java_continue">继续</string>
<string name="launch_failed">无法启动</string> <string name="launch_failed">无法启动</string>

View File

@ -12,6 +12,7 @@
<string name="splash_runtime_cacio" translatable="false">Caciocavallo</string> <string name="splash_runtime_cacio" translatable="false">Caciocavallo</string>
<string name="splash_runtime_cacio17" translatable="false">Caciocavallo 17</string> <string name="splash_runtime_cacio17" translatable="false">Caciocavallo 17</string>
<string name="splash_runtime_java8" translatable="false">JRE 8</string> <string name="splash_runtime_java8" translatable="false">JRE 8</string>
<string name="splash_runtime_java11" translatable="false">JRE 11</string>
<string name="splash_runtime_java17" translatable="false">JRE 17</string> <string name="splash_runtime_java17" translatable="false">JRE 17</string>
<string name="splash_runtime_java21" translatable="false">JRE 21</string> <string name="splash_runtime_java21" translatable="false">JRE 21</string>
<string name="splash_runtime_install">Install / Update</string> <string name="splash_runtime_install">Install / Update</string>
@ -438,7 +439,7 @@
<string name="jar_executor_crash_reason">Jar Executor crash reason analyse is not supported now.</string> <string name="jar_executor_crash_reason">Jar Executor crash reason analyse is not supported now.</string>
<string name="launch">Launch</string> <string name="launch">Launch</string>
<string name="launch_error_java">Wrong Java Version</string> <string name="launch_error_java">You are using a deprecated Java version, are you sure you want to continue?</string>
<string name="launch_error_java_auto">Auto select</string> <string name="launch_error_java_auto">Auto select</string>
<string name="launch_error_java_continue">Continue</string> <string name="launch_error_java_continue">Continue</string>
<string name="launch_failed">Unable to launch</string> <string name="launch_failed">Unable to launch</string>

View File

@ -205,6 +205,8 @@ public class ForgeNewInstallTask extends Task<Version> {
if (java == 8) { if (java == 8) {
runJVMProcess(processor, command, 17); runJVMProcess(processor, command, 17);
} else if (java == 17) { } else if (java == 17) {
runJVMProcess(processor, command, 11);
} else if (java == 11) {
runJVMProcess(processor, command, 21); runJVMProcess(processor, command, 21);
} else { } else {
throw new IOException("Game processor exited abnormally with code " + exitCode); throw new IOException("Game processor exited abnormally with code " + exitCode);

View File

@ -206,6 +206,8 @@ public class NeoForgeOldInstallTask extends Task<Version> {
if (java == 8) { if (java == 8) {
runJVMProcess(processor, command, 17); runJVMProcess(processor, command, 17);
} else if (java == 17) { } else if (java == 17) {
runJVMProcess(processor, command, 11);
} else if (java == 11) {
runJVMProcess(processor, command, 21); runJVMProcess(processor, command, 21);
} else { } else {
throw new IOException("Game processor exited abnormally with code " + exitCode); throw new IOException("Game processor exited abnormally with code " + exitCode);

View File

@ -249,6 +249,8 @@ public final class OptiFineInstallTask extends Task<Version> {
if (java == 8) { if (java == 8) {
runJVMProcess(command, 17); runJVMProcess(command, 17);
} else if (java == 17) { } else if (java == 17) {
runJVMProcess(command, 11);
} else if (java == 11) {
runJVMProcess(command, 21); runJVMProcess(command, 21);
} else { } else {
throw new IOException("OptiFine patcher failed, command: " + new CommandBuilder().addAll(Arrays.asList(command))); throw new IOException("OptiFine patcher failed, command: " + new CommandBuilder().addAll(Arrays.asList(command)));

View File

@ -5,28 +5,34 @@ import com.tungsten.fclauncher.utils.FCLPath;
public class JavaVersion { public class JavaVersion {
public static final int JAVA_VERSION_8 = 8; public static final int JAVA_VERSION_8 = 8;
public static final int JAVA_VERSION_11 = 11;
public static final int JAVA_VERSION_17 = 17; public static final int JAVA_VERSION_17 = 17;
public static final int JAVA_VERSION_21 = 21; public static final int JAVA_VERSION_21 = 21;
private final int id;
private final boolean auto; private final boolean auto;
private final int version; private final int version;
private final String versionName; private final String versionName;
public static final JavaVersion JAVA_AUTO = new JavaVersion(0, true, JAVA_VERSION_8, "Auto"); public static final JavaVersion JAVA_AUTO = new JavaVersion(true, JAVA_VERSION_8, "Auto");
public static final JavaVersion JAVA_8 = new JavaVersion(1, false, JAVA_VERSION_8, "1.8"); public static final JavaVersion JAVA_8 = new JavaVersion(false, JAVA_VERSION_8, "1.8");
public static final JavaVersion JAVA_17 = new JavaVersion(2, false, JAVA_VERSION_17, "17"); public static final JavaVersion JAVA_11 = new JavaVersion(false, JAVA_VERSION_11, "11");
public static final JavaVersion JAVA_21 = new JavaVersion(3, false, JAVA_VERSION_21, "21"); public static final JavaVersion JAVA_17 = new JavaVersion(false, JAVA_VERSION_17, "17");
public static final JavaVersion JAVA_21 = new JavaVersion(false, JAVA_VERSION_21, "21");
public JavaVersion(int id, boolean auto, int version, String versionName) { public JavaVersion(boolean auto, int version, String versionName) {
this.id = id;
this.auto = auto; this.auto = auto;
this.version = version; this.version = version;
this.versionName = versionName; this.versionName = versionName;
} }
public int getId() { public static JavaVersion[] getAllJavaVersion() {
return id; return new JavaVersion[] {
JAVA_AUTO,
JAVA_8,
JAVA_11,
JAVA_17,
JAVA_21
};
} }
public boolean isAuto() { public boolean isAuto() {
@ -45,26 +51,28 @@ public class JavaVersion {
JavaVersion javaVersion = auto ? getSuitableJavaVersion(version) : this; JavaVersion javaVersion = auto ? getSuitableJavaVersion(version) : this;
if (javaVersion.getVersion() == JAVA_VERSION_8) { if (javaVersion.getVersion() == JAVA_VERSION_8) {
return FCLPath.JAVA_8_PATH; return FCLPath.JAVA_8_PATH;
} else if (javaVersion.getVersion() == JAVA_VERSION_11) {
return FCLPath.JAVA_11_PATH;
} else if (javaVersion.getVersion() == JAVA_VERSION_17) { } else if (javaVersion.getVersion() == JAVA_VERSION_17) {
return FCLPath.JAVA_17_PATH; return FCLPath.JAVA_17_PATH;
} }
return FCLPath.JAVA_21_PATH; return FCLPath.JAVA_21_PATH;
} }
public static JavaVersion getJavaFromId(int id) { public static JavaVersion getJavaFromVersionName(String versionName) {
if (id == 0) { for (JavaVersion javaVersion : getAllJavaVersion()) {
return JAVA_AUTO; if (javaVersion.getVersionName().equals(versionName)) {
} else if (id == 1) { return javaVersion;
return JAVA_8; }
} else if (id == 2) {
return JAVA_17;
} }
return JAVA_21; return JAVA_AUTO;
} }
public static JavaVersion getSuitableJavaVersion(Version version) { public static JavaVersion getSuitableJavaVersion(Version version) {
if (version.getJavaVersion() == null || version.getJavaVersion().getMajorVersion() == 8) { if (version.getJavaVersion() == null || version.getJavaVersion().getMajorVersion() == 8) {
return JAVA_8; return JAVA_8;
} else if (version.getJavaVersion().getMajorVersion() == 11) {
return JAVA_11;
} else if (version.getJavaVersion().getMajorVersion() == 21) { } else if (version.getJavaVersion().getMajorVersion() == 21) {
return JAVA_21; return JAVA_21;
} }
@ -74,6 +82,8 @@ public class JavaVersion {
public static boolean checkJavaVersion(Version version, JavaVersion javaVersion) { public static boolean checkJavaVersion(Version version, JavaVersion javaVersion) {
if (version.getJavaVersion() == null || version.getJavaVersion().getMajorVersion() == 8) { if (version.getJavaVersion() == null || version.getJavaVersion().getMajorVersion() == 8) {
return javaVersion.getVersion() == JAVA_VERSION_8; return javaVersion.getVersion() == JAVA_VERSION_8;
} else if (version.getJavaVersion().getMajorVersion() == 11) {
return javaVersion.getVersion() == JAVA_VERSION_11;
} else if (version.getJavaVersion().getMajorVersion() == 21) { } else if (version.getJavaVersion().getMajorVersion() == 21) {
return javaVersion.getVersion() == JAVA_VERSION_21; return javaVersion.getVersion() == JAVA_VERSION_21;
} }

View File

@ -135,8 +135,8 @@ public class DefaultLauncher extends Launcher {
// res.addDefault("-Dorg.lwjgl.util.DebugFunctions=", "true"); // res.addDefault("-Dorg.lwjgl.util.DebugFunctions=", "true");
// FCL specific args // FCL specific args
JavaVersion javaVersion = options.getJava().getId() == 0 ? JavaVersion.getSuitableJavaVersion(version) : options.getJava(); JavaVersion javaVersion = options.getJava().isAuto() ? JavaVersion.getSuitableJavaVersion(version) : options.getJava();
if (javaVersion.getVersion() == JavaVersion.JAVA_VERSION_17 || javaVersion.getVersion() == JavaVersion.JAVA_VERSION_21) { if (javaVersion.getVersion() == JavaVersion.JAVA_VERSION_11 || javaVersion.getVersion() == JavaVersion.JAVA_VERSION_17 || javaVersion.getVersion() == JavaVersion.JAVA_VERSION_21) {
res.addDefault("-Dext.net.resolvPath=", javaVersion.getJavaPath(version) + "/resolv.conf"); res.addDefault("-Dext.net.resolvPath=", javaVersion.getJavaPath(version) + "/resolv.conf");
} }
@ -221,12 +221,13 @@ public class DefaultLauncher extends Launcher {
public static void getCacioJavaArgs(CommandBuilder res, Version version, LaunchOptions options) { public static void getCacioJavaArgs(CommandBuilder res, Version version, LaunchOptions options) {
JavaVersion javaVersion; JavaVersion javaVersion;
if (options.getJava().getId() == 0) { if (options.getJava().isAuto()) {
javaVersion = JavaVersion.getSuitableJavaVersion(version); javaVersion = JavaVersion.getSuitableJavaVersion(version);
} else { } else {
javaVersion = options.getJava(); javaVersion = options.getJava();
} }
boolean isJava8 = javaVersion.getVersion() == JavaVersion.JAVA_VERSION_8; boolean isJava8 = javaVersion.getVersion() == JavaVersion.JAVA_VERSION_8;
boolean isJava11 = javaVersion.getVersion() == JavaVersion.JAVA_VERSION_11;
res.addDefault("-Djava.awt.headless=", "false"); res.addDefault("-Djava.awt.headless=", "false");
res.addDefault("-Dcacio.managed.screensize=", options.getWidth() + "x" + options.getHeight()); res.addDefault("-Dcacio.managed.screensize=", options.getWidth() + "x" + options.getHeight());
@ -236,7 +237,7 @@ public class DefaultLauncher extends Launcher {
if (isJava8) { if (isJava8) {
res.addDefault("-Dawt.toolkit=", "net.java.openjdk.cacio.ctc.CTCToolkit"); res.addDefault("-Dawt.toolkit=", "net.java.openjdk.cacio.ctc.CTCToolkit");
res.addDefault("-Djava.awt.graphicsenv=", "net.java.openjdk.cacio.ctc.CTCGraphicsEnvironment"); res.addDefault("-Djava.awt.graphicsenv=", "net.java.openjdk.cacio.ctc.CTCGraphicsEnvironment");
} else { } else if (!isJava11) {
res.addDefault("-Dawt.toolkit=", "com.github.caciocavallosilano.cacio.ctc.CTCToolkit"); res.addDefault("-Dawt.toolkit=", "com.github.caciocavallosilano.cacio.ctc.CTCToolkit");
res.addDefault("-Djava.awt.graphicsenv=", "com.github.caciocavallosilano.cacio.ctc.CTCGraphicsEnvironment"); res.addDefault("-Djava.awt.graphicsenv=", "com.github.caciocavallosilano.cacio.ctc.CTCGraphicsEnvironment");
res.addDefault("-Djava.system.class.loader=", "com.github.caciocavallosilano.cacio.ctc.CTCPreloadClassLoader"); res.addDefault("-Djava.system.class.loader=", "com.github.caciocavallosilano.cacio.ctc.CTCPreloadClassLoader");

View File

@ -16,6 +16,7 @@ public class FCLPath {
public static String RUNTIME_DIR; public static String RUNTIME_DIR;
public static String JAVA_8_PATH; public static String JAVA_8_PATH;
public static String JAVA_11_PATH;
public static String JAVA_17_PATH; public static String JAVA_17_PATH;
public static String JAVA_21_PATH; public static String JAVA_21_PATH;
public static String LWJGL_DIR; public static String LWJGL_DIR;
@ -45,6 +46,7 @@ public class FCLPath {
RUNTIME_DIR = context.getDir("runtime", 0).getAbsolutePath(); RUNTIME_DIR = context.getDir("runtime", 0).getAbsolutePath();
JAVA_8_PATH = RUNTIME_DIR + "/java/jre8"; JAVA_8_PATH = RUNTIME_DIR + "/java/jre8";
JAVA_11_PATH = RUNTIME_DIR + "/java/jre11";
JAVA_17_PATH = RUNTIME_DIR + "/java/jre17"; JAVA_17_PATH = RUNTIME_DIR + "/java/jre17";
JAVA_21_PATH = RUNTIME_DIR + "/java/jre21"; JAVA_21_PATH = RUNTIME_DIR + "/java/jre21";
LWJGL_DIR = RUNTIME_DIR + "/lwjgl"; LWJGL_DIR = RUNTIME_DIR + "/lwjgl";
@ -67,6 +69,7 @@ public class FCLPath {
init(CACHE_DIR); init(CACHE_DIR);
init(RUNTIME_DIR); init(RUNTIME_DIR);
init(JAVA_8_PATH); init(JAVA_8_PATH);
init(JAVA_11_PATH);
init(JAVA_17_PATH); init(JAVA_17_PATH);
init(JAVA_21_PATH); init(JAVA_21_PATH);
init(LWJGL_DIR); init(LWJGL_DIR);