From f5651de725d320b8a1dec22a03b463e1672d30ea Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Fri, 27 Mar 2026 10:16:32 +0100 Subject: [PATCH] Add NDK 27 as minimum for Android to fix 16kb page alignment issue on `libc++_shared.so` --- .../Tools/Flax.Build/Platforms/Android/AndroidNdk.cs | 11 ++++++++++- .../Flax.Build/Platforms/Android/AndroidToolchain.cs | 7 +++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Source/Tools/Flax.Build/Platforms/Android/AndroidNdk.cs b/Source/Tools/Flax.Build/Platforms/Android/AndroidNdk.cs index a1018368b..00838a73d 100644 --- a/Source/Tools/Flax.Build/Platforms/Android/AndroidNdk.cs +++ b/Source/Tools/Flax.Build/Platforms/Android/AndroidNdk.cs @@ -67,7 +67,8 @@ namespace Flax.Build.Platforms if (subDirs.Length != 0) { Utilities.SortVersionDirectories(subDirs); - FindNDK(subDirs.Last()); + for (int i = subDirs.Length - 1; i >= 0 && !IsValid; i--) + FindNDK(subDirs[i]); } if (!IsValid) @@ -109,6 +110,14 @@ namespace Flax.Build.Platforms } if (IsValid) { + var minVersion = new Version(27, 0); // NDK 27 (and newer) contains the libc++_shared.so with 16kb alignment + if (Version < minVersion) + { + IsValid = false; + Log.Verbose(RootPath); + Log.Error(string.Format("Unsupported Android NDK version {0}. Minimum supported is {1}.", Version, minVersion)); + return; + } RootPath = sdkPath; Log.Info(string.Format("Found Android NDK {1} at {0}", RootPath, Version)); } diff --git a/Source/Tools/Flax.Build/Platforms/Android/AndroidToolchain.cs b/Source/Tools/Flax.Build/Platforms/Android/AndroidToolchain.cs index d88cdbd51..9448a7c4d 100644 --- a/Source/Tools/Flax.Build/Platforms/Android/AndroidToolchain.cs +++ b/Source/Tools/Flax.Build/Platforms/Android/AndroidToolchain.cs @@ -104,6 +104,9 @@ namespace Flax.Build.Platforms args.Add("-fno-function-sections"); } + // Support 16kb pages + args.Add("-D__BIONIC_NO_PAGE_SIZE_MACRO"); + switch (Architecture) { case TargetArchitecture.x86: @@ -195,10 +198,10 @@ namespace Flax.Build.Platforms { // https://android.googlesource.com/platform/ndk/+/master/docs/BuildSystemMaintainers.md#libc var ndkPath = AndroidNdk.Instance.RootPath; - var libCppSharedPath = Path.Combine(ndkPath, "sources/cxx-stl/llvm-libc++/libs/", GetAbiName(Architecture), "libc++_shared.so"); // NDK24 (and older) location + var libCppSharedPath = Path.Combine(ndkPath, "toolchains/llvm/prebuilt", AndroidSdk.GetHostName(), "sysroot/usr/lib/", GetToolchainName(TargetPlatform.Android, Architecture), "libc++_shared.so"); // NDK25+ location if (!File.Exists(libCppSharedPath)) { - libCppSharedPath = Path.Combine(ndkPath, "toolchains/llvm/prebuilt", AndroidSdk.GetHostName(), "sysroot/usr/lib/", GetToolchainName(TargetPlatform.Android, Architecture), "libc++_shared.so"); // NDK25+ location + libCppSharedPath = Path.Combine(ndkPath, "sources/cxx-stl/llvm-libc++/libs/", GetAbiName(Architecture), "libc++_shared.so"); // NDK24 (and older) location if (!File.Exists(libCppSharedPath)) throw new Exception($"Missing Android NDK `libc++_shared.so` for architecture {Architecture}."); }