From b40333d5187f3f1277492fd94771775a03c16972 Mon Sep 17 00:00:00 2001 From: yaalyy Date: Thu, 23 Apr 2026 02:49:16 +0100 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86macos=20arm64?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=AF=E8=83=BD=E5=AF=BC=E8=87=B4=E7=9A=84?= =?UTF-8?q?lwjgl=20natives=E5=8C=B9=E9=85=8D=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jackhuang/hmcl/util/NativePatcher.java | 40 +++++++++- HMCL/src/main/resources/assets/natives.json | 77 +++++++++++++++++++ 2 files changed, 115 insertions(+), 2 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java index c10c6a01b5..92b3c4c472 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java @@ -132,7 +132,8 @@ public static Version patchNative(DefaultGameRepository repository, if (arch == Architecture.ARM64 && (os == OperatingSystem.MACOS || os == OperatingSystem.WINDOWS) && gameVersionNumber != null - && gameVersionNumber.compareTo("1.19") >= 0) + && gameVersionNumber.compareTo("1.19") >= 0 + && !hasLegacyLwjglNatives(version)) return version; Map replacements = getNatives(javaVersion.getPlatform()); @@ -148,7 +149,21 @@ public static Version patchNative(DefaultGameRepository repository, continue; if (library.isNative()) { - Library replacement = replacements.getOrDefault(library.getName() + ":natives", NONEXISTENT_LIBRARY); + String nativeKey = library.getName() + ":natives"; + Library replacement = replacements.getOrDefault(nativeKey, NONEXISTENT_LIBRARY); + if (replacement == NONEXISTENT_LIBRARY){ + String classifier = library.getClassifier(); + if (classifier != null) { + String classifierKey = library.getName() + ":" + classifier; + replacement = replacements.getOrDefault(classifierKey, NONEXISTENT_LIBRARY); + if (replacement != NONEXISTENT_LIBRARY) { + LOG.info("Replace " + classifierKey + " with " + replacement.getName()); + } + } + } else if (replacement != null) { + LOG.info("Replace " + nativeKey + " with " + replacement.getName()); + } + if (replacement == NONEXISTENT_LIBRARY) { LOG.warning("No alternative native library " + library.getName() + ":natives provided for platform " + javaVersion.getPlatform()); newLibraries.add(library); @@ -280,6 +295,27 @@ public static SupportStatus checkSupportedStatus(GameVersionNumber gameVersion, return SupportStatus.UNTESTED; } + private static boolean hasLegacyLwjglNatives(Version version) { + for (Library lib : version.getLibraries()) { + if (!lib.appliesToCurrentEnvironment()) continue; + if (!"org.lwjgl".equals(lib.getGroupId())) continue; + if (!lib.isNative()) continue; + + String classifier = lib.getClassifier(); + if (classifier == null) { + return true; + } + + String c = classifier.toLowerCase(Locale.ROOT); + boolean arm64Like = c.contains("arm64") || c.contains("aarch64"); + if (!arm64Like) { + // e.g. natives-macos / natives-windows + return true; + } + } + return false; +} + public enum SupportStatus { OFFICIAL_SUPPORTED, LAUNCHER_SUPPORTED, diff --git a/HMCL/src/main/resources/assets/natives.json b/HMCL/src/main/resources/assets/natives.json index 86b2e7baa6..abf8ca0413 100644 --- a/HMCL/src/main/resources/assets/natives.json +++ b/HMCL/src/main/resources/assets/natives.json @@ -5199,6 +5199,83 @@ } } }, + "org.lwjgl:lwjgl:3.3.1:natives-macos": { + "name": "org.lwjgl:lwjgl:3.3.1:natives-macos-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-macos-arm64.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-macos-arm64.jar", + "sha1": "71d0d5e469c9c95351eb949064497e3391616ac9", + "size": 42693 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.3.1:natives-macos": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.1:natives-macos-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-macos-arm64.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-macos-arm64.jar", + "sha1": "e577b87d8ad2ade361aaea2fcf226c660b15dee8", + "size": 103475 + } + } + }, + "org.lwjgl:lwjgl-openal:3.3.1:natives-macos": { + "name": "org.lwjgl:lwjgl-openal:3.3.1:natives-macos-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-macos-arm64.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-macos-arm64.jar", + "sha1": "23d55e7490b57495320f6c9e1936d78fd72c4ef8", + "size": 346125 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.3.1:natives-macos": { + "name": "org.lwjgl:lwjgl-opengl:3.3.1:natives-macos-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-macos-arm64.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-macos-arm64.jar", + "sha1": "eafe34b871d966292e8db0f1f3d6b8b110d4e91d", + "size": 41665 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.3.1:natives-macos": { + "name": "org.lwjgl:lwjgl-glfw:3.3.1:natives-macos-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-macos-arm64.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-macos-arm64.jar", + "sha1": "cac0d3f712a3da7641fa174735a5f315de7ffe0a", + "size": 129077 + } + } + }, + "org.lwjgl:lwjgl-stb:3.3.1:natives-macos": { + "name": "org.lwjgl:lwjgl-stb:3.3.1:natives-macos-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-macos-arm64.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-macos-arm64.jar", + "sha1": "fcf073ed911752abdca5f0b00a53cfdf17ff8e8b", + "size": 178408 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.3.1:natives-macos": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.1:natives-macos-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-macos-arm64.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-macos-arm64.jar", + "sha1": "972ecc17bad3571e81162153077b4d47b7b9eaa9", + "size": 41380 + } + } + }, "ca.weblite:java-objc-bridge:1.0.0": { "name": "org.glavo.hmcl.mmachina:java-objc-bridge:1.1.0-mmachina.1", "downloads": { From 672abad0f5c825ba737999a14bcde3100df2fc73 Mon Sep 17 00:00:00 2001 From: yaalyy Date: Thu, 23 Apr 2026 03:26:44 +0100 Subject: [PATCH 2/3] corrected code style --- .../jackhuang/hmcl/util/NativePatcher.java | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java index 92b3c4c472..0a55c4aba0 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java @@ -151,13 +151,13 @@ public static Version patchNative(DefaultGameRepository repository, if (library.isNative()) { String nativeKey = library.getName() + ":natives"; Library replacement = replacements.getOrDefault(nativeKey, NONEXISTENT_LIBRARY); - if (replacement == NONEXISTENT_LIBRARY){ + if (replacement == NONEXISTENT_LIBRARY) { String classifier = library.getClassifier(); if (classifier != null) { String classifierKey = library.getName() + ":" + classifier; replacement = replacements.getOrDefault(classifierKey, NONEXISTENT_LIBRARY); if (replacement != NONEXISTENT_LIBRARY) { - LOG.info("Replace " + classifierKey + " with " + replacement.getName()); + LOG.info("Replace " + classifierKey + " with " + replacement.getName()); } } } else if (replacement != null) { @@ -296,25 +296,25 @@ public static SupportStatus checkSupportedStatus(GameVersionNumber gameVersion, } private static boolean hasLegacyLwjglNatives(Version version) { - for (Library lib : version.getLibraries()) { - if (!lib.appliesToCurrentEnvironment()) continue; - if (!"org.lwjgl".equals(lib.getGroupId())) continue; - if (!lib.isNative()) continue; - - String classifier = lib.getClassifier(); - if (classifier == null) { - return true; - } + for (Library lib : version.getLibraries()) { + if (!lib.appliesToCurrentEnvironment()) continue; + if (!"org.lwjgl".equals(lib.getGroupId())) continue; + if (!lib.isNative()) continue; + + String classifier = lib.getClassifier(); + if (classifier == null) { + return true; + } - String c = classifier.toLowerCase(Locale.ROOT); - boolean arm64Like = c.contains("arm64") || c.contains("aarch64"); - if (!arm64Like) { - // e.g. natives-macos / natives-windows - return true; + String c = classifier.toLowerCase(Locale.ROOT); + boolean arm64Like = c.contains("arm64") || c.contains("aarch64"); + if (!arm64Like) { + // e.g. natives-macos / natives-windows + return true; + } } + return false; } - return false; -} public enum SupportStatus { OFFICIAL_SUPPORTED, From 24de3e2261611a9925a358f3ba96e7e9abda9a29 Mon Sep 17 00:00:00 2001 From: yaalyy Date: Thu, 23 Apr 2026 17:24:49 +0100 Subject: [PATCH 3/3] cleaned repeated log when native patcher is triggered --- .../main/java/org/jackhuang/hmcl/util/NativePatcher.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java index 0a55c4aba0..67fbb8c74e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java @@ -150,25 +150,22 @@ public static Version patchNative(DefaultGameRepository repository, if (library.isNative()) { String nativeKey = library.getName() + ":natives"; + String matchedKey = nativeKey; Library replacement = replacements.getOrDefault(nativeKey, NONEXISTENT_LIBRARY); if (replacement == NONEXISTENT_LIBRARY) { String classifier = library.getClassifier(); if (classifier != null) { String classifierKey = library.getName() + ":" + classifier; replacement = replacements.getOrDefault(classifierKey, NONEXISTENT_LIBRARY); - if (replacement != NONEXISTENT_LIBRARY) { - LOG.info("Replace " + classifierKey + " with " + replacement.getName()); - } + matchedKey = classifierKey; } - } else if (replacement != null) { - LOG.info("Replace " + nativeKey + " with " + replacement.getName()); } if (replacement == NONEXISTENT_LIBRARY) { LOG.warning("No alternative native library " + library.getName() + ":natives provided for platform " + javaVersion.getPlatform()); newLibraries.add(library); } else if (replacement != null) { - LOG.info("Replace " + library.getName() + ":natives with " + replacement.getName()); + LOG.info("Replace " + matchedKey + " with " + replacement.getName()); newLibraries.add(replacement); } } else {