From 4ebe8bc5039f1ed6caae859b22cc667492c7cc36 Mon Sep 17 00:00:00 2001 From: Davis Rollman Date: Mon, 6 Apr 2026 22:42:58 -0400 Subject: [PATCH 1/4] Remove desktop 32-bit support --- .../com/jme3/system/JmeSystemDelegate.java | 113 ++++++++++++------ .../main/java/com/jme3/system/Platform.java | 92 +++++--------- .../jme3/system/ExtractNativeLibraries.java | 12 +- .../java/com/jme3/system/NativeLibraries.java | 15 --- .../com/jme3/system/NativeLibraryLoader.java | 15 +-- .../com/jme3/system/lwjgl/LwjglCanvas.java | 5 +- jme3-lwjgl3/build.gradle | 7 -- 7 files changed, 120 insertions(+), 139 deletions(-) diff --git a/jme3-core/src/main/java/com/jme3/system/JmeSystemDelegate.java b/jme3-core/src/main/java/com/jme3/system/JmeSystemDelegate.java index c9d8b79182..a0f039c9e3 100644 --- a/jme3-core/src/main/java/com/jme3/system/JmeSystemDelegate.java +++ b/jme3-core/src/main/java/com/jme3/system/JmeSystemDelegate.java @@ -215,9 +215,9 @@ public boolean showSettingsDialog(AppSettings settings, boolean loadFromRegistry } - private boolean is64Bit(String arch) { - if (arch.equals("x86")) { - return false; + private boolean is64Bit(String arch) { + if (arch.equals("x86")) { + return false; } else if (arch.equals("amd64")) { return true; } else if (arch.equals("x86_64")) { @@ -240,37 +240,82 @@ private boolean is64Bit(String arch) { return false; } else { throw new UnsupportedOperationException("Unsupported architecture: " + arch); - } - } - - public Platform getPlatform() { - String os = System.getProperty("os.name").toLowerCase(); - String arch = System.getProperty("os.arch").toLowerCase(); - boolean is64 = is64Bit(arch); - if (os.contains("windows")) { - if (arch.startsWith("arm") || arch.startsWith("aarch")) { - return is64 ? Platform.Windows_ARM64 : Platform.Windows_ARM32; - } else { - return is64 ? Platform.Windows64 : Platform.Windows32; - } - } else if (os.contains("linux") || os.contains("freebsd") - || os.contains("sunos") || os.contains("unix")) { - if (arch.startsWith("arm") || arch.startsWith("aarch")) { - return is64 ? Platform.Linux_ARM64 : Platform.Linux_ARM32; - } else { - return is64 ? Platform.Linux64 : Platform.Linux32; - } - } else if (os.contains("mac os x") || os.contains("darwin")) { - if (arch.startsWith("ppc")) { - return is64 ? Platform.MacOSX_PPC64 : Platform.MacOSX_PPC32; - } else if (arch.startsWith("aarch")) { - return Platform.MacOSX_ARM64; // no 32-bit version - } else { - return is64 ? Platform.MacOSX64 : Platform.MacOSX32; - } - } else { - throw new UnsupportedOperationException("The specified platform: " + os + " is not supported."); - } + } + } + + private boolean isArmArchitecture(String arch) { + return arch.startsWith("arm") || arch.startsWith("aarch"); + } + + private boolean isX86Architecture(String arch) { + return arch.equals("x86") + || arch.equals("amd64") + || arch.equals("x86_64") + || arch.equals("i386") + || arch.equals("i686") + || arch.equals("universal"); + } + + private UnsupportedOperationException unsupported32Bit(String osName) { + return new UnsupportedOperationException("32-bit " + osName + " is not supported."); + } + + private Platform getWindowsPlatform(String arch, boolean is64) { + if (isArmArchitecture(arch)) { + if (!is64) { + throw unsupported32Bit("Windows"); + } + return Platform.Windows_ARM64; + } + if (isX86Architecture(arch)) { + if (!is64) { + throw unsupported32Bit("Windows"); + } + return Platform.Windows64; + } + throw new UnsupportedOperationException("Unsupported architecture: " + arch); + } + + private Platform getLinuxPlatform(String arch, boolean is64) { + if (isArmArchitecture(arch)) { + return is64 ? Platform.Linux_ARM64 : Platform.Linux_ARM32; + } + if (isX86Architecture(arch)) { + if (!is64) { + throw unsupported32Bit("Linux"); + } + return Platform.Linux64; + } + throw new UnsupportedOperationException("Unsupported architecture: " + arch); + } + + private Platform getMacPlatform(String arch, boolean is64) { + if (arch.startsWith("aarch")) { + return Platform.MacOSX_ARM64; // no 32-bit version + } + if (isX86Architecture(arch)) { + if (!is64) { + throw unsupported32Bit("macOS"); + } + return Platform.MacOSX64; + } + throw new UnsupportedOperationException("Unsupported architecture: " + arch); + } + + public Platform getPlatform() { + String os = System.getProperty("os.name").toLowerCase(); + String arch = System.getProperty("os.arch").toLowerCase(); + boolean is64 = is64Bit(arch); + if (os.contains("windows")) { + return getWindowsPlatform(arch, is64); + } else if (os.contains("linux") || os.contains("freebsd") + || os.contains("sunos") || os.contains("unix")) { + return getLinuxPlatform(arch, is64); + } else if (os.contains("mac os x") || os.contains("darwin")) { + return getMacPlatform(arch, is64); + } else { + throw new UnsupportedOperationException("The specified platform: " + os + " is not supported."); + } } public String getBuildInfo() { diff --git a/jme3-core/src/main/java/com/jme3/system/Platform.java b/jme3-core/src/main/java/com/jme3/system/Platform.java index 64595a9106..18d2b77528 100644 --- a/jme3-core/src/main/java/com/jme3/system/Platform.java +++ b/jme3-core/src/main/java/com/jme3/system/Platform.java @@ -36,54 +36,34 @@ */ public enum Platform { - /** - * Microsoft Windows 32-bit AMD/Intel - */ - Windows32(Os.Windows), - - /** - * Microsoft Windows 64-bit AMD/Intel - */ - Windows64(Os.Windows, true), - - /** - * Microsoft Windows 32-bit ARM - */ - Windows_ARM32(Os.Windows), - - /** - * Microsoft Windows 64-bit ARM - */ - Windows_ARM64(Os.Windows, true), - - /** - * Linux 32-bit Intel - */ - Linux32(Os.Linux), - - /** - * Linux 64-bit Intel - */ - Linux64(Os.Linux, true), - - /** - * Linux 32-bit ARM - */ - Linux_ARM32(Os.Linux), - - /** - * Linux 64-bit ARM - */ - Linux_ARM64(Os.Linux, true), - - /** - * Apple Mac OS X 32-bit Intel - */ - MacOSX32(Os.MacOS), - - /** - * Apple Mac OS X 64-bit Intel - */ + /** + * Microsoft Windows 64-bit AMD/Intel + */ + Windows64(Os.Windows, true), + + /** + * Microsoft Windows 64-bit ARM + */ + Windows_ARM64(Os.Windows, true), + + /** + * Linux 64-bit Intel + */ + Linux64(Os.Linux, true), + + /** + * Linux 32-bit ARM + */ + Linux_ARM32(Os.Linux), + + /** + * Linux 64-bit ARM + */ + Linux_ARM64(Os.Linux, true), + + /** + * Apple Mac OS X 64-bit Intel + */ MacOSX64(Os.MacOS, true), /** @@ -91,19 +71,9 @@ public enum Platform { */ MacOSX_ARM64(Os.MacOS, true), - /** - * Apple Mac OS X 32 bit PowerPC - */ - MacOSX_PPC32(Os.MacOS), - - /** - * Apple Mac OS X 64 bit PowerPC - */ - MacOSX_PPC64(Os.MacOS, true), - - /** - * Android ARM5 - */ + /** + * Android ARM5 + */ Android_ARM5(Os.Android), /** diff --git a/jme3-desktop/src/main/java/com/jme3/system/ExtractNativeLibraries.java b/jme3-desktop/src/main/java/com/jme3/system/ExtractNativeLibraries.java index fa63dedb1e..90c9060338 100644 --- a/jme3-desktop/src/main/java/com/jme3/system/ExtractNativeLibraries.java +++ b/jme3-desktop/src/main/java/com/jme3/system/ExtractNativeLibraries.java @@ -60,7 +60,7 @@ public static void main(String[] args) { } if (args.length < 2) { System.err.println("Usage: ExtractNativeLibraries Platform ExtractionPath"); - System.err.println("Where 'Platform' is either Windows32, Windows64, Linux32, Linux64, MacOSX32 or MacOSX64"); + System.err.println("Where 'Platform' is either Windows64, Linux64, or MacOSX64"); System.err.println("'ExtractionPath' is a folder to extract the binaries to."); System.err.println("You can also use ExtractNativeLibraries getjarexcludes to get a list of excludes for the jar files that contain binaries."); System.exit(1); @@ -68,20 +68,14 @@ public static void main(String[] args) { String path = args[1].replace('/', File.separatorChar); File folder = new File(path); try { - if ("Windows32".equals(args[0])) { - NativeLibraryLoader.extractNativeLibraries(Platform.Windows32, folder); - } else if ("Windows64".equals(args[0])) { + if ("Windows64".equals(args[0])) { NativeLibraryLoader.extractNativeLibraries(Platform.Windows64, folder); - } else if ("Linux32".equals(args[0])) { - NativeLibraryLoader.extractNativeLibraries(Platform.Linux32, folder); } else if ("Linux64".equals(args[0])) { NativeLibraryLoader.extractNativeLibraries(Platform.Linux64, folder); - } else if ("MacOSX32".equals(args[0])) { - NativeLibraryLoader.extractNativeLibraries(Platform.MacOSX32, folder); } else if ("MacOSX64".equals(args[0])) { NativeLibraryLoader.extractNativeLibraries(Platform.MacOSX64, folder); } else { - System.err.println("Please specify a platform, Windows32, Windows64, Linux32, Linux64, MacOSX32 or MacOSX64"); + System.err.println("Please specify a platform, Windows64, Linux64, or MacOSX64"); System.exit(3); } } catch (IOException ex) { diff --git a/jme3-desktop/src/main/java/com/jme3/system/NativeLibraries.java b/jme3-desktop/src/main/java/com/jme3/system/NativeLibraries.java index b64a2fa84b..e21366c821 100644 --- a/jme3-desktop/src/main/java/com/jme3/system/NativeLibraries.java +++ b/jme3-desktop/src/main/java/com/jme3/system/NativeLibraries.java @@ -54,11 +54,8 @@ public enum NativeLibraries { // Delegate loading to lwjgl. System.setProperty("org.lwjgl.librarypath", Paths.get(libPath).getParent().toAbsolutePath().toString())) - .addNativeVariant(Platform.Windows32, "lwjgl.dll") .addNativeVariant(Platform.Windows64, "lwjgl64.dll") - .addNativeVariant(Platform.Linux32, "liblwjgl.so") .addNativeVariant(Platform.Linux64, "liblwjgl64.so") - .addNativeVariant(Platform.MacOSX32, "liblwjgl.dylib") .addNativeVariant(Platform.MacOSX64, "liblwjgl.dylib") ), @@ -68,11 +65,8 @@ public enum NativeLibraries { * Native OpenAL audio libraries for LWJGL 2 required by jme3-lwjgl backend. */ OpenAL(new LibraryInfo("openal") - .addNativeVariant(Platform.Windows32, "OpenAL32.dll") .addNativeVariant(Platform.Windows64, "OpenAL64.dll") - .addNativeVariant(Platform.Linux32, "libopenal.so") .addNativeVariant(Platform.Linux64, "libopenal64.so") - .addNativeVariant(Platform.MacOSX32, "openal.dylib", "libopenal.dylib") .addNativeVariant(Platform.MacOSX64, "openal.dylib", "libopenal.dylib") ), @@ -80,14 +74,11 @@ public enum NativeLibraries { * Native bullet physics libraries required by Minie library. */ BulletJme(new LibraryInfo("bulletjme") - .addNativeVariant(Platform.Windows32, "native/windows/x86/bulletjme.dll", "bulletjme-x86.dll") .addNativeVariant(Platform.Windows64, "native/windows/x86_64/bulletjme.dll", "bulletjme-x86_64.dll") .addNativeVariant(Platform.Windows_ARM64, "native/windows/arm64/bulletjme.dll", "bulletjme-arm64.dll") - .addNativeVariant(Platform.Linux32, "native/linux/x86/libbulletjme.so", "libbulletjme-x86.so") .addNativeVariant(Platform.Linux64, "native/linux/x86_64/libbulletjme.so", "libbulletjme-x86_64.so") .addNativeVariant(Platform.Linux_ARM32, "native/linux/arm32/libbulletjme.so", "libbulletjme-arm32.so") .addNativeVariant(Platform.Linux_ARM64, "native/linux/arm64/libbulletjme.so", "libbulletjme-arm64.so") - .addNativeVariant(Platform.MacOSX32, "native/osx/x86/libbulletjme.dylib", "libbulletjme-x86.dylib") .addNativeVariant(Platform.MacOSX64, "native/osx/x86_64/libbulletjme.dylib", "libbulletjme-x86_64.dylib") .addNativeVariant(Platform.MacOSX_ARM64, "native/osx/arm64/libbulletjme.dylib", "libbulletjme-arm64.dylib") ), @@ -100,11 +91,8 @@ public enum NativeLibraries { // Delegate loading to jinput. System.setProperty("net.java.games.input.librarypath", Paths.get(libPath).getParent().toAbsolutePath().toString())) - .addNativeVariant(Platform.Windows32, "jinput-raw.dll") .addNativeVariant(Platform.Windows64, "jinput-raw_64.dll") - .addNativeVariant(Platform.Linux32, "libjinput-linux.so") .addNativeVariant(Platform.Linux64, "libjinput-linux64.so") - .addNativeVariant(Platform.MacOSX32, "libjinput-osx.jnilib", "libjinput-osx.dylib") .addNativeVariant(Platform.MacOSX64, "libjinput-osx.jnilib", "libjinput-osx.dylib") ), @@ -113,11 +101,8 @@ public enum NativeLibraries { * (only required on Windows) */ JInputDX8(new LibraryInfo("jinput-dx8") - .addNativeVariant(Platform.Windows32, "jinput-dx8.dll", null) .addNativeVariant(Platform.Windows64, "jinput-dx8_64.dll", null) - .addNativeVariant(Platform.Linux32, null) .addNativeVariant(Platform.Linux64, null) - .addNativeVariant(Platform.MacOSX32, null) .addNativeVariant(Platform.MacOSX64, null) ); diff --git a/jme3-desktop/src/main/java/com/jme3/system/NativeLibraryLoader.java b/jme3-desktop/src/main/java/com/jme3/system/NativeLibraryLoader.java index 0ec507fb7a..e6be5861a6 100644 --- a/jme3-desktop/src/main/java/com/jme3/system/NativeLibraryLoader.java +++ b/jme3-desktop/src/main/java/com/jme3/system/NativeLibraryLoader.java @@ -54,15 +54,12 @@ * You can then extract this library (depending on platform), by * using {@link #loadNativeLibrary(java.lang.String, boolean) }. *
- * Example:
- *
- * NativeLibraryLoader.registerNativeLibrary("mystuff", Platform.Windows32, "native/windows/mystuff.dll");
- * NativeLibraryLoader.registerNativeLibrary("mystuff", Platform.Windows64, "native/windows/mystuff64.dll");
- * NativeLibraryLoader.registerNativeLibrary("mystuff", Platform.Linux32,   "native/linux/libmystuff.so");
- * NativeLibraryLoader.registerNativeLibrary("mystuff", Platform.Linux64,   "native/linux/libmystuff64.so");
- * NativeLibraryLoader.registerNativeLibrary("mystuff", Platform.MacOSX32,  "native/macosx/libmystuff.jnilib");
- * NativeLibraryLoader.registerNativeLibrary("mystuff", Platform.MacOSX64,  "native/macosx/libmystuff.jnilib");
- * 
+ * Example:
+ *
+ * NativeLibraryLoader.registerNativeLibrary("mystuff", Platform.Windows64, "native/windows/mystuff64.dll");
+ * NativeLibraryLoader.registerNativeLibrary("mystuff", Platform.Linux64,   "native/linux/libmystuff64.so");
+ * NativeLibraryLoader.registerNativeLibrary("mystuff", Platform.MacOSX64,  "native/macosx/libmystuff.jnilib");
+ * 
*
* This will register the library. Load it via:
*
diff --git a/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglCanvas.java b/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglCanvas.java
index 5fa76754b2..b7da29d7cd 100644
--- a/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglCanvas.java
+++ b/jme3-lwjgl/src/main/java/com/jme3/system/lwjgl/LwjglCanvas.java
@@ -406,10 +406,7 @@ protected void destroyContext() {
                 // freezes the application.
                 // On Mac it freezes the application.
                 // On Linux it fixes a crash with X Window System.
-                if (
-                    JmeSystem.getPlatform() == Platform.Windows32 ||
-                    JmeSystem.getPlatform() == Platform.Windows64
-                ) {
+                if (JmeSystem.getPlatform() == Platform.Windows64) {
                     // Display.setParent(null);
                 }
                 // } catch (LWJGLException ex) {
diff --git a/jme3-lwjgl3/build.gradle b/jme3-lwjgl3/build.gradle
index e360ab7054..d1e047779a 100644
--- a/jme3-lwjgl3/build.gradle
+++ b/jme3-lwjgl3/build.gradle
@@ -15,7 +15,6 @@ dependencies {
     api libs.lwjgl3.sdl
 
     runtimeOnly(variantOf(libs.lwjgl3.base){ classifier('natives-windows') })
-    runtimeOnly(variantOf(libs.lwjgl3.base){ classifier('natives-windows-x86') })
     runtimeOnly(variantOf(libs.lwjgl3.base){ classifier('natives-linux') })
     runtimeOnly(variantOf(libs.lwjgl3.base){ classifier('natives-linux-arm32') })
     runtimeOnly(variantOf(libs.lwjgl3.base){ classifier('natives-linux-arm64') })
@@ -23,7 +22,6 @@ dependencies {
     runtimeOnly(variantOf(libs.lwjgl3.base){ classifier('natives-macos-arm64') })
 
     runtimeOnly(variantOf(libs.lwjgl3.glfw){ classifier('natives-windows') })
-    runtimeOnly(variantOf(libs.lwjgl3.glfw){ classifier('natives-windows-x86') })
     runtimeOnly(variantOf(libs.lwjgl3.glfw){ classifier('natives-linux') })
     runtimeOnly(variantOf(libs.lwjgl3.glfw){ classifier('natives-linux-arm32') })
     runtimeOnly(variantOf(libs.lwjgl3.glfw){ classifier('natives-linux-arm64') })
@@ -31,7 +29,6 @@ dependencies {
     runtimeOnly(variantOf(libs.lwjgl3.glfw){ classifier('natives-macos-arm64') })
 
     runtimeOnly(variantOf(libs.lwjgl3.jemalloc){ classifier('natives-windows') })
-    runtimeOnly(variantOf(libs.lwjgl3.jemalloc){ classifier('natives-windows-x86') })
     runtimeOnly(variantOf(libs.lwjgl3.jemalloc){ classifier('natives-linux') })
     runtimeOnly(variantOf(libs.lwjgl3.jemalloc){ classifier('natives-linux-arm32') })
     runtimeOnly(variantOf(libs.lwjgl3.jemalloc){ classifier('natives-linux-arm64') })
@@ -39,7 +36,6 @@ dependencies {
     runtimeOnly(variantOf(libs.lwjgl3.jemalloc){ classifier('natives-macos-arm64') })
 
     runtimeOnly(variantOf(libs.lwjgl3.opengl){ classifier('natives-windows') })
-    runtimeOnly(variantOf(libs.lwjgl3.opengl){ classifier('natives-windows-x86') })
     runtimeOnly(variantOf(libs.lwjgl3.opengl){ classifier('natives-linux') })
     runtimeOnly(variantOf(libs.lwjgl3.opengl){ classifier('natives-linux-arm32') })
     runtimeOnly(variantOf(libs.lwjgl3.opengl){ classifier('natives-linux-arm64') })
@@ -47,7 +43,6 @@ dependencies {
     runtimeOnly(variantOf(libs.lwjgl3.opengl){ classifier('natives-macos-arm64') })
 
     runtimeOnly(variantOf(libs.lwjgl3.openal){ classifier('natives-windows') })
-    runtimeOnly(variantOf(libs.lwjgl3.openal){ classifier('natives-windows-x86') })
     runtimeOnly(variantOf(libs.lwjgl3.openal){ classifier('natives-linux') })
     runtimeOnly(variantOf(libs.lwjgl3.openal){ classifier('natives-linux-arm32') })
     runtimeOnly(variantOf(libs.lwjgl3.openal){ classifier('natives-linux-arm64') })
@@ -55,7 +50,6 @@ dependencies {
     runtimeOnly(variantOf(libs.lwjgl3.openal){ classifier('natives-macos-arm64') })
 
     runtimeOnly(variantOf(libs.lwjgl3.sdl){ classifier('natives-windows') })
-    runtimeOnly(variantOf(libs.lwjgl3.sdl){ classifier('natives-windows-x86') })
     runtimeOnly(variantOf(libs.lwjgl3.sdl){ classifier('natives-linux') })
     runtimeOnly(variantOf(libs.lwjgl3.sdl){ classifier('natives-linux-arm32') })
     runtimeOnly(variantOf(libs.lwjgl3.sdl){ classifier('natives-linux-arm64') })
@@ -69,4 +63,3 @@ javadoc {
         options.addStringOption('Xdoclint:none', '-quiet')
     }
 }
-

From 4375f804f8fb8e7045b9c913b2bde1738273179b Mon Sep 17 00:00:00 2001
From: Riccardo Balbo 
Date: Fri, 1 May 2026 11:26:08 +0200
Subject: [PATCH 2/4] more 32 bit deprecation and cleanup

---
 gradle.properties                             |   1 -
 jme3-android-native/openalsoft.gradle         |  12 +-
 .../native/jme_bufferallocator/Application.mk |   3 +-
 .../src/native/jme_decode/Application.mk      |   3 +-
 .../src/native/jme_openalsoft/Application.mk  |   3 +-
 .../jme3/system/android/JmeAndroidSystem.java |  39 +++--
 .../com/jme3/system/JmeSystemDelegate.java    | 163 ++++++++----------
 .../main/java/com/jme3/system/Platform.java   |  73 +++-----
 .../java/com/jme3/system/NativeLibraries.java |   1 -
 .../com/jme3/system/ios/JmeIosSystem.java     |   8 +-
 10 files changed, 126 insertions(+), 180 deletions(-)

diff --git a/gradle.properties b/gradle.properties
index d924be823d..01cfcd81a7 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -19,7 +19,6 @@ buildJavaDoc = true
 buildNativeProjects = false
 buildAndroidExamples = false
 
-buildForPlatforms = Linux64,Linux32,Windows64,Windows32,Mac64
 # Forcefully ignore prebuilt libraries
 skipPrebuildLibraries=false
 
diff --git a/jme3-android-native/openalsoft.gradle b/jme3-android-native/openalsoft.gradle
index 0a14d4b429..2b91a3a038 100644
--- a/jme3-android-native/openalsoft.gradle
+++ b/jme3-android-native/openalsoft.gradle
@@ -86,12 +86,10 @@ def ndkPath = new File(rootProject.ndkCommandPath).getParent()
 def cmakeToolchain = "${ndkPath}/build/cmake/android.toolchain.cmake"
 
 // 1) list your ABIs here
-def openalAbis = [
-    "armeabi-v7a",
-    "arm64-v8a",
-    "x86",
-    "x86_64"
-]
+def openalAbis = [
+    "arm64-v8a",
+    "x86_64"
+]
 
 // 2) for each ABI, register a configure/build pair
 openalAbis.each { abi ->
@@ -170,7 +168,7 @@ task buildOpenAlSoftNativeLib(type: Exec) {
     // the cmake-build- folders.
     args(
         // let ndk-build know which ABIs to build for
-        "APP_ABI=armeabi-v7a,arm64-v8a,x86,x86_64",
+        "APP_ABI=arm64-v8a,x86_64",
 
         // pass in the path to the CMake output root
         "OPENALSOFT_BUILD_ROOT=${openalsoftBuildDir}/${openALSoftFolder}",
diff --git a/jme3-android-native/src/native/jme_bufferallocator/Application.mk b/jme3-android-native/src/native/jme_bufferallocator/Application.mk
index de0aea4497..114e6d4494 100644
--- a/jme3-android-native/src/native/jme_bufferallocator/Application.mk
+++ b/jme3-android-native/src/native/jme_bufferallocator/Application.mk
@@ -36,6 +36,5 @@
 APP_PLATFORM := android-19
 # change this to 'debug' to see android logs
 APP_OPTIM := release
-APP_ABI := armeabi-v7a,arm64-v8a,x86,x86_64
+APP_ABI := arm64-v8a,x86_64
 APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true
-
diff --git a/jme3-android-native/src/native/jme_decode/Application.mk b/jme3-android-native/src/native/jme_decode/Application.mk
index 9651f8ee88..30f944a73d 100644
--- a/jme3-android-native/src/native/jme_decode/Application.mk
+++ b/jme3-android-native/src/native/jme_decode/Application.mk
@@ -1,5 +1,4 @@
 APP_PLATFORM := android-9
 APP_OPTIM := release
-APP_ABI := armeabi-v7a,arm64-v8a,x86,x86_64
+APP_ABI := arm64-v8a,x86_64
 APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true
-
diff --git a/jme3-android-native/src/native/jme_openalsoft/Application.mk b/jme3-android-native/src/native/jme_openalsoft/Application.mk
index 58561d1d14..7037469246 100644
--- a/jme3-android-native/src/native/jme_openalsoft/Application.mk
+++ b/jme3-android-native/src/native/jme_openalsoft/Application.mk
@@ -1,6 +1,5 @@
 APP_PLATFORM := android-19
 APP_OPTIM := release
-APP_ABI := armeabi-v7a,arm64-v8a,x86,x86_64
+APP_ABI := arm64-v8a,x86_64
 APP_STL := c++_static
 APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true
-
diff --git a/jme3-android/src/main/java/com/jme3/system/android/JmeAndroidSystem.java b/jme3-android/src/main/java/com/jme3/system/android/JmeAndroidSystem.java
index 226f7ff6dd..47a8f70e07 100644
--- a/jme3-android/src/main/java/com/jme3/system/android/JmeAndroidSystem.java
+++ b/jme3-android/src/main/java/com/jme3/system/android/JmeAndroidSystem.java
@@ -3,6 +3,7 @@
 import android.app.AlertDialog;
 import android.content.Context;
 import android.graphics.Bitmap;
+import android.os.Build;
 import android.os.Environment;
 import android.view.View;
 import android.view.inputmethod.InputMethodManager;
@@ -24,6 +25,8 @@
 import java.io.OutputStream;
 import java.net.URL;
 import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.Locale;
 import java.util.logging.Level;
 
 public class JmeAndroidSystem extends JmeSystemDelegate {
@@ -115,24 +118,28 @@ public void initialize(AppSettings settings) {
 
     @Override
     public Platform getPlatform() {
-        String arch = System.getProperty("os.arch").toLowerCase();
-        if (arch.contains("arm")) {
-            if (arch.contains("v5")) {
-                return Platform.Android_ARM5;
-            } else if (arch.contains("v6")) {
-                return Platform.Android_ARM6;
-            } else if (arch.contains("v7")) {
-                return Platform.Android_ARM7;
-            } else if (arch.contains("v8")) {
+        String arch = System.getProperty("os.arch", "").toLowerCase(Locale.ROOT);
+        switch (arch) {
+            case "aarch64":
+            case "arm64":
                 return Platform.Android_ARM8;
-            } else {
-                return Platform.Android_ARM5; // unknown ARM
-            }
-        } else if (arch.contains("aarch")) {
-            return Platform.Android_ARM8;
-        } else {
-            return Platform.Android_Other;
+            case "x86_64":
+            case "amd64":
+                return Platform.Android_X86_64;
+            case "arm":
+            case "armv7l":
+            case "x86":
+            case "i386":
+            case "i686":
+                throw new UnsupportedOperationException("Unsupported 32-bit Android architecture: " + arch);
+            default:
+                if (arch.startsWith("arm") || arch.contains("armeabi")) {
+                    throw new UnsupportedOperationException("Unsupported 32-bit Android architecture: " + arch);
+                }
+                throw new UnsupportedOperationException("Unsupported Android architecture: " + arch
+                        + ", supported ABIs: " + Arrays.toString(Build.SUPPORTED_ABIS));
         }
+
     }
 
     @Override
diff --git a/jme3-core/src/main/java/com/jme3/system/JmeSystemDelegate.java b/jme3-core/src/main/java/com/jme3/system/JmeSystemDelegate.java
index a0f039c9e3..b36ecc4bbf 100644
--- a/jme3-core/src/main/java/com/jme3/system/JmeSystemDelegate.java
+++ b/jme3-core/src/main/java/com/jme3/system/JmeSystemDelegate.java
@@ -215,107 +215,86 @@ public boolean showSettingsDialog(AppSettings settings, boolean loadFromRegistry
     }
 
 
-    private boolean is64Bit(String arch) {
-        if (arch.equals("x86")) {
-            return false;
+    private boolean is64Bit(String arch) {
+        if (arch.equals("x86")) {
+            return false;
         } else if (arch.equals("amd64")) {
             return true;
         } else if (arch.equals("x86_64")) {
             return true;
-        } else if (arch.equals("ppc") || arch.equals("PowerPC")) {
-            return false;
         } else if (arch.equals("ppc64")) {
             return true;
-        } else if (arch.equals("i386") || arch.equals("i686")) {
-            return false;
-        } else if (arch.equals("universal")) {
-            return false;
-        } else if (arch.equals("aarch32")) {
-            return false;
         } else if (arch.equals("aarch64")) {
             return true;
-        } else if (arch.equals("armv7") || arch.equals("armv7l")) {
-            return false;
-        } else if (arch.equals("arm")) {
-            return false;
+        } else if (arch.equals("arm64")) {
+            return true;
+        } else if (arch.equals("universal")) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean isArmArchitecture(String arch) {
+        return arch.startsWith("arm") || arch.startsWith("aarch");
+    }
+
+    private boolean isX86Architecture(String arch) {
+        return arch.equals("x86")
+                || arch.equals("amd64")
+                || arch.equals("x86_64")
+                || arch.equals("i386")
+                || arch.equals("i686")
+                || arch.equals("universal");
+    }
+
+    private UnsupportedOperationException unsupported32Bit(String osName) {
+        return new UnsupportedOperationException("32-bit " + osName + " is not supported.");
+    }
+
+    private Platform getWindowsPlatform(String arch, boolean is64) {
+        if (!is64) {
+            // no 32-bit version
+            throw unsupported32Bit("Windows");
+        }
+        if (isArmArchitecture(arch)) return Platform.Windows_ARM64;
+        if (isX86Architecture(arch)) return Platform.Windows64;
+        throw new UnsupportedOperationException("Unsupported architecture: " + arch);
+    }
+
+    private Platform getLinuxPlatform(String arch, boolean is64) {
+        if (!is64) {
+            // no 32-bit version
+            throw unsupported32Bit("Linux");
+        }
+        if (isArmArchitecture(arch)) return Platform.Linux_ARM64;
+        if (isX86Architecture(arch)) return Platform.Linux64;
+        throw new UnsupportedOperationException("Unsupported architecture: " + arch);
+    }
+
+    private Platform getMacPlatform(String arch, boolean is64) {
+        if (!is64) {
+            // no 32-bit version
+            throw unsupported32Bit("macOS");
+        }
+        if (isArmArchitecture(arch)) return Platform.MacOSX_ARM64;
+        if (isX86Architecture(arch)) return Platform.MacOSX64;
+        throw new UnsupportedOperationException("Unsupported architecture: " + arch);
+    }
+
+    public Platform getPlatform() {
+        String os = System.getProperty("os.name").toLowerCase();
+        String arch = System.getProperty("os.arch").toLowerCase();
+        boolean is64 = is64Bit(arch);
+        if (os.contains("windows")) {
+            return getWindowsPlatform(arch, is64);
+        } else if (os.contains("linux") || os.contains("freebsd") 
+                || os.contains("sunos") || os.contains("unix")) {
+            return getLinuxPlatform(arch, is64);
+        } else if (os.contains("mac os x") || os.contains("darwin")) {
+            return getMacPlatform(arch, is64);
         } else {
-            throw new UnsupportedOperationException("Unsupported architecture: " + arch);
-        }
-    }
-
-    private boolean isArmArchitecture(String arch) {
-        return arch.startsWith("arm") || arch.startsWith("aarch");
-    }
-
-    private boolean isX86Architecture(String arch) {
-        return arch.equals("x86")
-                || arch.equals("amd64")
-                || arch.equals("x86_64")
-                || arch.equals("i386")
-                || arch.equals("i686")
-                || arch.equals("universal");
-    }
-
-    private UnsupportedOperationException unsupported32Bit(String osName) {
-        return new UnsupportedOperationException("32-bit " + osName + " is not supported.");
-    }
-
-    private Platform getWindowsPlatform(String arch, boolean is64) {
-        if (isArmArchitecture(arch)) {
-            if (!is64) {
-                throw unsupported32Bit("Windows");
-            }
-            return Platform.Windows_ARM64;
-        }
-        if (isX86Architecture(arch)) {
-            if (!is64) {
-                throw unsupported32Bit("Windows");
-            }
-            return Platform.Windows64;
-        }
-        throw new UnsupportedOperationException("Unsupported architecture: " + arch);
-    }
-
-    private Platform getLinuxPlatform(String arch, boolean is64) {
-        if (isArmArchitecture(arch)) {
-            return is64 ? Platform.Linux_ARM64 : Platform.Linux_ARM32;
-        }
-        if (isX86Architecture(arch)) {
-            if (!is64) {
-                throw unsupported32Bit("Linux");
-            }
-            return Platform.Linux64;
-        }
-        throw new UnsupportedOperationException("Unsupported architecture: " + arch);
-    }
-
-    private Platform getMacPlatform(String arch, boolean is64) {
-        if (arch.startsWith("aarch")) {
-            return Platform.MacOSX_ARM64; // no 32-bit version
-        }
-        if (isX86Architecture(arch)) {
-            if (!is64) {
-                throw unsupported32Bit("macOS");
-            }
-            return Platform.MacOSX64;
-        }
-        throw new UnsupportedOperationException("Unsupported architecture: " + arch);
-    }
-
-    public Platform getPlatform() {
-        String os = System.getProperty("os.name").toLowerCase();
-        String arch = System.getProperty("os.arch").toLowerCase();
-        boolean is64 = is64Bit(arch);
-        if (os.contains("windows")) {
-            return getWindowsPlatform(arch, is64);
-        } else if (os.contains("linux") || os.contains("freebsd") 
-                || os.contains("sunos") || os.contains("unix")) {
-            return getLinuxPlatform(arch, is64);
-        } else if (os.contains("mac os x") || os.contains("darwin")) {
-            return getMacPlatform(arch, is64);
-        } else {
-            throw new UnsupportedOperationException("The specified platform: " + os + " is not supported.");
-        }
+            throw new UnsupportedOperationException("The specified platform: " + os + " is not supported.");
+        }
     }
 
     public String getBuildInfo() {
diff --git a/jme3-core/src/main/java/com/jme3/system/Platform.java b/jme3-core/src/main/java/com/jme3/system/Platform.java
index 18d2b77528..33f7a9fdbd 100644
--- a/jme3-core/src/main/java/com/jme3/system/Platform.java
+++ b/jme3-core/src/main/java/com/jme3/system/Platform.java
@@ -36,81 +36,50 @@
  */
 public enum Platform {
 
-    /**
-     * Microsoft Windows 64-bit AMD/Intel
-     */
-    Windows64(Os.Windows, true),
-
-    /**
-     * Microsoft Windows 64-bit ARM
-     */
-    Windows_ARM64(Os.Windows, true),
-
-    /**
-     * Linux 64-bit Intel
-     */
-    Linux64(Os.Linux, true),
-
-    /**
-     * Linux 32-bit ARM
-     */
-    Linux_ARM32(Os.Linux),
-
-    /**
-     * Linux 64-bit ARM
-     */
-    Linux_ARM64(Os.Linux, true),
-
-    /**
-     * Apple Mac OS X 64-bit Intel
-     */
-    MacOSX64(Os.MacOS, true),
-
     /**
-     * Apple Mac OS X 64-bit ARM
+     * Microsoft Windows 64-bit AMD/Intel
      */
-    MacOSX_ARM64(Os.MacOS, true),
-
-    /**
-     * Android ARM5
-     */
-    Android_ARM5(Os.Android),
+    Windows64(Os.Windows, true),
 
     /**
-     * Android ARM6
+     * Microsoft Windows 64-bit ARM
      */
-    Android_ARM6(Os.Android),
+    Windows_ARM64(Os.Windows, true),
 
     /**
-     * Android ARM7
+     * Linux 64-bit Intel
      */
-    Android_ARM7(Os.Android),
+    Linux64(Os.Linux, true),
 
     /**
-     * Android ARM8
+     * Linux 64-bit ARM
      */
-    Android_ARM8(Os.Android),
+    Linux_ARM64(Os.Linux, true),
 
     /**
-     * Android x86
+     * Apple Mac OS X 64-bit Intel
      */
-    Android_X86(Os.Android),
+    MacOSX64(Os.MacOS, true),
 
     /**
-     * iOS on x86
+     * Apple Mac OS X 64-bit ARM
+     */
+    MacOSX_ARM64(Os.MacOS, true),
+ 
+    /**
+     * Android ARM8
      */
-    iOS_X86(Os.iOS),
+    Android_ARM8(Os.Android, true),
 
     /**
-     * iOS on ARM
+     * Android x86_64
      */
-    iOS_ARM(Os.iOS),
+    Android_X86_64(Os.Android, true),
 
     /**
-     * Android running on unknown platform (could be x86 or mips for example).
+     * iOS on ARM
      */
-    Android_Other(Os.Android),
-    
+    iOS_ARM(Os.iOS, true),
     /**
     * Generic web platform on unknown architecture
     */
diff --git a/jme3-desktop/src/main/java/com/jme3/system/NativeLibraries.java b/jme3-desktop/src/main/java/com/jme3/system/NativeLibraries.java
index e21366c821..477e0b57da 100644
--- a/jme3-desktop/src/main/java/com/jme3/system/NativeLibraries.java
+++ b/jme3-desktop/src/main/java/com/jme3/system/NativeLibraries.java
@@ -77,7 +77,6 @@ public enum NativeLibraries {
             .addNativeVariant(Platform.Windows64, "native/windows/x86_64/bulletjme.dll", "bulletjme-x86_64.dll")
             .addNativeVariant(Platform.Windows_ARM64, "native/windows/arm64/bulletjme.dll", "bulletjme-arm64.dll")
             .addNativeVariant(Platform.Linux64, "native/linux/x86_64/libbulletjme.so", "libbulletjme-x86_64.so")
-            .addNativeVariant(Platform.Linux_ARM32, "native/linux/arm32/libbulletjme.so", "libbulletjme-arm32.so")
             .addNativeVariant(Platform.Linux_ARM64, "native/linux/arm64/libbulletjme.so", "libbulletjme-arm64.so")
             .addNativeVariant(Platform.MacOSX64, "native/osx/x86_64/libbulletjme.dylib", "libbulletjme-x86_64.dylib")
             .addNativeVariant(Platform.MacOSX_ARM64, "native/osx/arm64/libbulletjme.dylib", "libbulletjme-arm64.dylib")
diff --git a/jme3-ios/src/main/java/com/jme3/system/ios/JmeIosSystem.java b/jme3-ios/src/main/java/com/jme3/system/ios/JmeIosSystem.java
index 4f99bbe476..7846d6e39f 100644
--- a/jme3-ios/src/main/java/com/jme3/system/ios/JmeIosSystem.java
+++ b/jme3-ios/src/main/java/com/jme3/system/ios/JmeIosSystem.java
@@ -112,12 +112,10 @@ public void initialize(AppSettings settings) {
     @Override
     public Platform getPlatform() {
         String arch = System.getProperty("os.arch").toLowerCase();
-        if (arch.contains("arm")) {
-            return Platform.iOS_ARM;
-        } else if (arch.contains("aarch")) {
+        if (arch.contains("arm") || arch.contains("aarch")) {
             return Platform.iOS_ARM;
         } else {
-            return Platform.iOS_X86;
+            throw new UnsupportedOperationException("Unsupported iOS architecture: " + arch);
         }
     }
 
@@ -125,4 +123,4 @@ public Platform getPlatform() {
     public void showSoftKeyboard(boolean show) {
         throw new UnsupportedOperationException("Not supported yet.");
     }
-}
\ No newline at end of file
+}

From a52340719aaef23d6f9201c929fef3055aa5df3c Mon Sep 17 00:00:00 2001
From: Riccardo Balbo 
Date: Fri, 1 May 2026 11:39:38 +0200
Subject: [PATCH 3/4] fixup

---
 .../native/jme_bufferallocator/Application.mk |  2 +-
 .../src/native/jme_decode/Application.mk      |  2 +-
 .../src/native/jme_openalsoft/Application.mk  |  2 +-
 .../com/jme3/system/JmeSystemDelegate.java    | 39 ++++++++++---------
 .../main/java/com/jme3/system/Platform.java   | 13 +++++--
 .../jme3/system/ExtractNativeLibraries.java   | 19 ++++-----
 .../com/jme3/system/ios/JmeIosSystem.java     |  2 +
 jme3-lwjgl3/build.gradle                      |  6 ---
 8 files changed, 43 insertions(+), 42 deletions(-)

diff --git a/jme3-android-native/src/native/jme_bufferallocator/Application.mk b/jme3-android-native/src/native/jme_bufferallocator/Application.mk
index 114e6d4494..6b07cf2873 100644
--- a/jme3-android-native/src/native/jme_bufferallocator/Application.mk
+++ b/jme3-android-native/src/native/jme_bufferallocator/Application.mk
@@ -33,7 +33,7 @@
 # Created by pavl_g on 5/17/22.
 # For more : https://developer.android.com/ndk/guides/application_mk.
 ##
-APP_PLATFORM := android-19
+APP_PLATFORM := android-21
 # change this to 'debug' to see android logs
 APP_OPTIM := release
 APP_ABI := arm64-v8a,x86_64
diff --git a/jme3-android-native/src/native/jme_decode/Application.mk b/jme3-android-native/src/native/jme_decode/Application.mk
index 30f944a73d..7ba509726f 100644
--- a/jme3-android-native/src/native/jme_decode/Application.mk
+++ b/jme3-android-native/src/native/jme_decode/Application.mk
@@ -1,4 +1,4 @@
-APP_PLATFORM := android-9
+APP_PLATFORM := android-21
 APP_OPTIM := release
 APP_ABI := arm64-v8a,x86_64
 APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true
diff --git a/jme3-android-native/src/native/jme_openalsoft/Application.mk b/jme3-android-native/src/native/jme_openalsoft/Application.mk
index 7037469246..32f4c893fd 100644
--- a/jme3-android-native/src/native/jme_openalsoft/Application.mk
+++ b/jme3-android-native/src/native/jme_openalsoft/Application.mk
@@ -1,4 +1,4 @@
-APP_PLATFORM := android-19
+APP_PLATFORM := android-21
 APP_OPTIM := release
 APP_ABI := arm64-v8a,x86_64
 APP_STL := c++_static
diff --git a/jme3-core/src/main/java/com/jme3/system/JmeSystemDelegate.java b/jme3-core/src/main/java/com/jme3/system/JmeSystemDelegate.java
index b36ecc4bbf..f95745011a 100644
--- a/jme3-core/src/main/java/com/jme3/system/JmeSystemDelegate.java
+++ b/jme3-core/src/main/java/com/jme3/system/JmeSystemDelegate.java
@@ -215,24 +215,27 @@ public boolean showSettingsDialog(AppSettings settings, boolean loadFromRegistry
     }
 
 
-    private boolean is64Bit(String arch) {
-        if (arch.equals("x86")) {
-            return false;
-        } else if (arch.equals("amd64")) {
-            return true;
-        } else if (arch.equals("x86_64")) {
-            return true;
-        } else if (arch.equals("ppc64")) {
-            return true;
-        } else if (arch.equals("aarch64")) {
-            return true;
-        } else if (arch.equals("arm64")) {
-            return true;
-        } else if (arch.equals("universal")) {
-            return true;
-        }
-        return false;
-    }
+    private boolean is64Bit(String arch) {
+        switch (arch) {
+            case "amd64":
+            case "x86_64":
+            case "aarch64":
+            case "arm64":
+            case "ppc64":
+            case "universal":
+                return true;
+            case "x86":
+            case "i386":
+            case "i686":
+            case "aarch32":
+            case "arm":
+            case "armv7":
+            case "armv7l":
+                return false;
+            default:
+                throw new UnsupportedOperationException("Unsupported architecture: " + arch);
+        }
+    }
 
     private boolean isArmArchitecture(String arch) {
         return arch.startsWith("arm") || arch.startsWith("aarch");
diff --git a/jme3-core/src/main/java/com/jme3/system/Platform.java b/jme3-core/src/main/java/com/jme3/system/Platform.java
index 33f7a9fdbd..2ccd763c8f 100644
--- a/jme3-core/src/main/java/com/jme3/system/Platform.java
+++ b/jme3-core/src/main/java/com/jme3/system/Platform.java
@@ -76,10 +76,15 @@ public enum Platform {
      */
     Android_X86_64(Os.Android, true),
 
-    /**
-     * iOS on ARM
-     */
-    iOS_ARM(Os.iOS, true),
+    /**
+     * iOS on ARM
+     */
+    iOS_ARM(Os.iOS, true),
+
+    /**
+     * iOS on x86_64 (simulator)
+     */
+    iOS_X86(Os.iOS, true),
     /**
     * Generic web platform on unknown architecture
     */
diff --git a/jme3-desktop/src/main/java/com/jme3/system/ExtractNativeLibraries.java b/jme3-desktop/src/main/java/com/jme3/system/ExtractNativeLibraries.java
index 90c9060338..ccd64a07f6 100644
--- a/jme3-desktop/src/main/java/com/jme3/system/ExtractNativeLibraries.java
+++ b/jme3-desktop/src/main/java/com/jme3/system/ExtractNativeLibraries.java
@@ -33,6 +33,7 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -60,7 +61,7 @@ public static void main(String[] args) {
         }
         if (args.length < 2) {
             System.err.println("Usage: ExtractNativeLibraries Platform ExtractionPath");
-            System.err.println("Where 'Platform' is either Windows64, Linux64, or MacOSX64");
+            System.err.println("Where 'Platform' is one of: " + Arrays.toString(Platform.values()));
             System.err.println("'ExtractionPath' is a folder to extract the binaries to.");
             System.err.println("You can also use ExtractNativeLibraries getjarexcludes to get a list of excludes for the jar files that contain binaries.");
             System.exit(1);
@@ -68,16 +69,12 @@ public static void main(String[] args) {
         String path = args[1].replace('/', File.separatorChar);
         File folder = new File(path);
         try {
-            if ("Windows64".equals(args[0])) {
-                NativeLibraryLoader.extractNativeLibraries(Platform.Windows64, folder);
-            } else if ("Linux64".equals(args[0])) {
-                NativeLibraryLoader.extractNativeLibraries(Platform.Linux64, folder);
-            } else if ("MacOSX64".equals(args[0])) {
-                NativeLibraryLoader.extractNativeLibraries(Platform.MacOSX64, folder);
-            } else {
-                System.err.println("Please specify a platform, Windows64, Linux64, or MacOSX64");
-                System.exit(3);
-            }
+            Platform platform = Platform.valueOf(args[0]);
+            NativeLibraryLoader.extractNativeLibraries(platform, folder);
+        } catch (IllegalArgumentException ex) {
+            System.err.println("Unknown platform: " + args[0]);
+            System.err.println("Supported platforms: " + Arrays.toString(Platform.values()));
+            System.exit(3);
         } catch (IOException ex) {
             Logger.getLogger(ExtractNativeLibraries.class.getName()).log(Level.SEVERE, null, ex);
         }
diff --git a/jme3-ios/src/main/java/com/jme3/system/ios/JmeIosSystem.java b/jme3-ios/src/main/java/com/jme3/system/ios/JmeIosSystem.java
index 7846d6e39f..0ccbc56c59 100644
--- a/jme3-ios/src/main/java/com/jme3/system/ios/JmeIosSystem.java
+++ b/jme3-ios/src/main/java/com/jme3/system/ios/JmeIosSystem.java
@@ -114,6 +114,8 @@ public Platform getPlatform() {
         String arch = System.getProperty("os.arch").toLowerCase();
         if (arch.contains("arm") || arch.contains("aarch")) {
             return Platform.iOS_ARM;
+        } else if (arch.contains("x86_64") || arch.contains("amd64")) {
+            return Platform.iOS_X86;
         } else {
             throw new UnsupportedOperationException("Unsupported iOS architecture: " + arch);
         }
diff --git a/jme3-lwjgl3/build.gradle b/jme3-lwjgl3/build.gradle
index d1e047779a..98199a5117 100644
--- a/jme3-lwjgl3/build.gradle
+++ b/jme3-lwjgl3/build.gradle
@@ -16,42 +16,36 @@ dependencies {
 
     runtimeOnly(variantOf(libs.lwjgl3.base){ classifier('natives-windows') })
     runtimeOnly(variantOf(libs.lwjgl3.base){ classifier('natives-linux') })
-    runtimeOnly(variantOf(libs.lwjgl3.base){ classifier('natives-linux-arm32') })
     runtimeOnly(variantOf(libs.lwjgl3.base){ classifier('natives-linux-arm64') })
     runtimeOnly(variantOf(libs.lwjgl3.base){ classifier('natives-macos') })
     runtimeOnly(variantOf(libs.lwjgl3.base){ classifier('natives-macos-arm64') })
 
     runtimeOnly(variantOf(libs.lwjgl3.glfw){ classifier('natives-windows') })
     runtimeOnly(variantOf(libs.lwjgl3.glfw){ classifier('natives-linux') })
-    runtimeOnly(variantOf(libs.lwjgl3.glfw){ classifier('natives-linux-arm32') })
     runtimeOnly(variantOf(libs.lwjgl3.glfw){ classifier('natives-linux-arm64') })
     runtimeOnly(variantOf(libs.lwjgl3.glfw){ classifier('natives-macos') })
     runtimeOnly(variantOf(libs.lwjgl3.glfw){ classifier('natives-macos-arm64') })
 
     runtimeOnly(variantOf(libs.lwjgl3.jemalloc){ classifier('natives-windows') })
     runtimeOnly(variantOf(libs.lwjgl3.jemalloc){ classifier('natives-linux') })
-    runtimeOnly(variantOf(libs.lwjgl3.jemalloc){ classifier('natives-linux-arm32') })
     runtimeOnly(variantOf(libs.lwjgl3.jemalloc){ classifier('natives-linux-arm64') })
     runtimeOnly(variantOf(libs.lwjgl3.jemalloc){ classifier('natives-macos') })
     runtimeOnly(variantOf(libs.lwjgl3.jemalloc){ classifier('natives-macos-arm64') })
 
     runtimeOnly(variantOf(libs.lwjgl3.opengl){ classifier('natives-windows') })
     runtimeOnly(variantOf(libs.lwjgl3.opengl){ classifier('natives-linux') })
-    runtimeOnly(variantOf(libs.lwjgl3.opengl){ classifier('natives-linux-arm32') })
     runtimeOnly(variantOf(libs.lwjgl3.opengl){ classifier('natives-linux-arm64') })
     runtimeOnly(variantOf(libs.lwjgl3.opengl){ classifier('natives-macos') })
     runtimeOnly(variantOf(libs.lwjgl3.opengl){ classifier('natives-macos-arm64') })
 
     runtimeOnly(variantOf(libs.lwjgl3.openal){ classifier('natives-windows') })
     runtimeOnly(variantOf(libs.lwjgl3.openal){ classifier('natives-linux') })
-    runtimeOnly(variantOf(libs.lwjgl3.openal){ classifier('natives-linux-arm32') })
     runtimeOnly(variantOf(libs.lwjgl3.openal){ classifier('natives-linux-arm64') })
     runtimeOnly(variantOf(libs.lwjgl3.openal){ classifier('natives-macos') })
     runtimeOnly(variantOf(libs.lwjgl3.openal){ classifier('natives-macos-arm64') })
 
     runtimeOnly(variantOf(libs.lwjgl3.sdl){ classifier('natives-windows') })
     runtimeOnly(variantOf(libs.lwjgl3.sdl){ classifier('natives-linux') })
-    runtimeOnly(variantOf(libs.lwjgl3.sdl){ classifier('natives-linux-arm32') })
     runtimeOnly(variantOf(libs.lwjgl3.sdl){ classifier('natives-linux-arm64') })
     runtimeOnly(variantOf(libs.lwjgl3.sdl){ classifier('natives-macos') })
     runtimeOnly(variantOf(libs.lwjgl3.sdl){ classifier('natives-macos-arm64') })

From 95f3b7a74e3b2c926a22d01bf071e9a079864533 Mon Sep 17 00:00:00 2001
From: Riccardo Balbo 
Date: Fri, 1 May 2026 11:46:51 +0200
Subject: [PATCH 4/4] Update
 jme3-android/src/main/java/com/jme3/system/android/JmeAndroidSystem.java

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
---
 .../src/main/java/com/jme3/system/android/JmeAndroidSystem.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/jme3-android/src/main/java/com/jme3/system/android/JmeAndroidSystem.java b/jme3-android/src/main/java/com/jme3/system/android/JmeAndroidSystem.java
index 47a8f70e07..0ba2d85e0c 100644
--- a/jme3-android/src/main/java/com/jme3/system/android/JmeAndroidSystem.java
+++ b/jme3-android/src/main/java/com/jme3/system/android/JmeAndroidSystem.java
@@ -137,7 +137,7 @@ public Platform getPlatform() {
                     throw new UnsupportedOperationException("Unsupported 32-bit Android architecture: " + arch);
                 }
                 throw new UnsupportedOperationException("Unsupported Android architecture: " + arch
-                        + ", supported ABIs: " + Arrays.toString(Build.SUPPORTED_ABIS));
+                        + ", supported ABIs: " + (Build.VERSION.SDK_INT >= 21 ? Arrays.toString(Build.SUPPORTED_ABIS) : "unknown"));
         }
 
     }