From 21e44bbc90c599de51cde2f70e15a2bc9d7e85f3 Mon Sep 17 00:00:00 2001 From: Glavo Date: Thu, 14 Oct 2021 03:12:23 +0800 Subject: [PATCH] Do not automatically select Java non for x86 and x86-64 --- .../hmcl/ui/versions/VersionSettingsPage.java | 6 ++--- .../hmcl/game/JavaVersionConstraint.java | 26 ++++++++++++++++--- .../hmcl/util/platform/Architecture.java | 4 +++ .../hmcl/util/platform/JavaVersion.java | 4 ++- 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java index 39be03cfc..4e032d288 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionSettingsPage.java @@ -546,10 +546,8 @@ public final class VersionSettingsPage extends StackPane implements DecoratorPag memoryStatus.set(OperatingSystem.getPhysicalMemoryStatus().orElse(OperatingSystem.PhysicalMemoryStatus.INVALID)); Task.supplyAsync(JavaVersion::getJavas).thenAcceptAsync(Schedulers.javafx(), list -> { - boolean isX86 = (Architecture.SYSTEM_ARCH == Architecture.X86 || Architecture.SYSTEM_ARCH == Architecture.X86_64) - && list.stream() - .map(java -> java.getPlatform().getArchitecture()) - .allMatch(arch -> arch == Architecture.X86 || arch == Architecture.X86_64); + boolean isX86 = (Architecture.SYSTEM_ARCH.isX86()) + && list.stream().allMatch(java -> java.getArchitecture().isX86()); // boolean showSystem = list.stream().anyMatch(java -> java.getPlatform().getOperatingSystem() != OperatingSystem.CURRENT_OS); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/JavaVersionConstraint.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/JavaVersionConstraint.java index 56bd4d814..52c393c17 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/JavaVersionConstraint.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/JavaVersionConstraint.java @@ -111,7 +111,7 @@ public enum JavaVersionConstraint { @Override public boolean checkJava(VersionNumber gameVersionNumber, Version version, JavaVersion javaVersion) { - return javaVersion.getArchitecture() == Architecture.X86 || javaVersion.getArchitecture() == Architecture.X86_64; + return javaVersion.getArchitecture().isX86(); } }; @@ -173,17 +173,20 @@ public enum JavaVersionConstraint { JavaVersion mandatory = null; JavaVersion suggested = null; for (JavaVersion javaVersion : JavaVersion.getJavas()) { - // select the latest java version that this version accepts. + // select the latest x86 java that this version accepts. + if(!javaVersion.getArchitecture().isX86()) + continue; + VersionNumber javaVersionNumber = javaVersion.getVersionNumber(); if (range.getMandatory().contains(javaVersionNumber)) { if (mandatory == null) mandatory = javaVersion; - else if (javaVersionNumber.compareTo(mandatory.getVersionNumber()) > 0) { + else if (compareJavaVersion(javaVersion, mandatory) > 0) { mandatory = javaVersion; } } if (range.getSuggested().contains(javaVersionNumber)) { if (suggested == null) suggested = javaVersion; - else if (javaVersionNumber.compareTo(suggested.getVersionNumber()) > 0) { + else if (compareJavaVersion(javaVersion, suggested) > 0) { suggested = javaVersion; } } @@ -193,6 +196,21 @@ public enum JavaVersionConstraint { else return mandatory; } + private static int compareJavaVersion(JavaVersion javaVersion1, JavaVersion javaVersion2) { + Architecture arch1 = javaVersion1.getArchitecture(); + Architecture arch2 = javaVersion2.getArchitecture(); + + if (arch1 != arch2) { + if (arch1 == Architecture.X86_64) { + return 1; + } + if (arch2 == Architecture.X86_64) { + return -1; + } + } + return javaVersion1.getVersionNumber().compareTo(javaVersion2.getVersionNumber()); + } + public static final int RULE_MANDATORY = 1; public static final int RULE_SUGGESTED = 2; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/Architecture.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/Architecture.java index 50ef0ffd8..2190c7cde 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/Architecture.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/Architecture.java @@ -82,6 +82,10 @@ public enum Architecture { return displayName; } + public boolean isX86() { + return this == X86 || this == X86_64; + } + public static final String CURRENT_ARCH_NAME; public static final Architecture CURRENT_ARCH; public static final Architecture SYSTEM_ARCH; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/JavaVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/JavaVersion.java index daefd20e6..a66ac30d4 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/JavaVersion.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/JavaVersion.java @@ -48,12 +48,14 @@ public final class JavaVersion { private final String longVersion; private final Platform platform; private final int version; + private final VersionNumber versionNumber; public JavaVersion(Path binary, String longVersion, Platform platform) { this.binary = binary; this.longVersion = longVersion; this.platform = platform; version = parseVersion(longVersion); + versionNumber = VersionNumber.asVersion(longVersion); } public Path getBinary() { @@ -77,7 +79,7 @@ public final class JavaVersion { } public VersionNumber getVersionNumber() { - return VersionNumber.asVersion(longVersion); + return versionNumber; } /**