Skip to content

Commit f361d99

Browse files
authored
[build] Add support for NDK r23. (#6073)
Context: https://github.com/android/ndk/wiki/Changelog-r23#changelog The most important changes for Xamarin.Android: NDK r23 removes GNU Binutils and so we need to switch to using our bundled copy of them. Upstream NDK r23changes: * Includes Android 12/API-31 APIs. * Updated LLVM to clang-r416183b, based on LLVM 12 development. * [Issue 1047]: Fixes crash when using ASan with the CFI unwinder. * [Issue 1096]: Includes support for [Polly]. Enable by adding `-mllvm -polly` to your cflags. * [Issue 1230]: LLVM's `libunwind` is now used instead of `libgcc` for all architectures rather than just 32-bit ARM. * [Issue 1231]: LLVM's `libclang_rt.builtins` is now used instead of `libgcc`. * [Issue 1406]: Fixes crash with Neon intrinsic. * Vulkan validation layer source and binaries are no longer shipped in the NDK. The latest are now posted directly to [KhronosGroup/Vulkan-ValidationLayers]. * Vulkan tools source is also removed, specifically `vulkan_wrapper`. It should be downloaded upstream from [KhronosGroup/Vulkan-Tools]. * Refactored the toolchain file `android.toolchain.cmake`, basing it on CMake's integrated Android support. This new toolchain file will be enabled by default for CMake 3.21 and newer. No user side change is expected. But if anything goes wrong, please file a bug and set `ANDROID_USE_LEGACY_TOOLCHAIN_FILE=ON` to restore the legacy behavior. * When using the new behavior (when using CMake 3.21+ and not explicitly selecting the legacy toolchain), **default build flags may change**. One of the primary goals was to reduce the behavior differences between our toolchain and CMake, and CMake's default flags do not always match the legacy toolchain file. Most notably, if using `CMAKE_BUILD_TYPE=Release`, your optimization type will likely be `-O3` instead of `-O2` or `-Oz`. See [Issue 1536] for more information. * [Issue 929]: `find_library` now prefers shared libraries from the sysroot over static libraries. * [Issue 1390]: `ndk-build` now warns when building a static executable with the wrong API level. * [Issue 1452]: `NDK_ANALYZE=1` now sets `APP_CLANG_TIDY=true` rather than using `scan-build`. `clang-tidy` performs all the same checks by default, and `scan-build` was no longer working. See [Issue 1452] for more details; no user-side changes should be needed. [Issue 929]: android/ndk#929 [Issue 1047]: android/ndk#1047 [Issue 1096]: android/ndk#1096 [Issue 1230]: android/ndk#1230 [Issue 1231]: android/ndk#1231 [Issue 1390]: android/ndk#1390 [Issue 1406]: android/ndk#1406 [Issue 1452]: android/ndk#1452 [Issue 1536]: android/ndk#1536 [Polly]: https://polly.llvm.org/ [KhronosGroup/Vulkan-ValidationLayers]: https://github.com/KhronosGroup/Vulkan-ValidationLayers/releases [KhronosGroup/Vulkan-Tools]: https://github.com/KhronosGroup/Vulkan-Tools
1 parent a5d2eed commit f361d99

23 files changed

+3640
-3583
lines changed

Documentation/guides/building-apps/build-properties.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,14 +129,14 @@ Added in Xamarin.Android 6.1.
129129

130130
A path to a directory containing
131131
the Android [binutils][binutils] such as `ld`, the native linker,
132-
and `as`, the native assembler. These tools are part of the Android
133-
NDK and are also included in the Xamarin.Android installation.
132+
and `as`, the native assembler. These tools are included in the
133+
Xamarin.Android installation.
134134

135-
The default value is `$(MonoAndroidBinDirectory)\ndk\`.
135+
The default value is `$(MonoAndroidBinDirectory)\binutils\`.
136136

137137
Added in Xamarin.Android 10.0.
138138

139-
[binutils]: https://android.googlesource.com/toolchain/binutils/
139+
[binutils]: https://github.com/xamarin/xamarin-android-binutils/
140140

141141
## AndroidBoundExceptionType
142142

build-tools/installers/create-installers.targets

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -310,18 +310,18 @@
310310
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\lib64\libZipSharpNative.pdb" />
311311
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\proguard\bin\proguard.bat" />
312312
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\aapt2.exe" />
313-
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\ndk\aarch64-linux-android-as.exe" />
314-
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\ndk\aarch64-linux-android-ld.exe" />
315-
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\ndk\aarch64-linux-android-strip.exe" />
316-
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\ndk\arm-linux-androideabi-as.exe" />
317-
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\ndk\arm-linux-androideabi-ld.exe" />
318-
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\ndk\arm-linux-androideabi-strip.exe" />
319-
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\ndk\i686-linux-android-as.exe" />
320-
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\ndk\i686-linux-android-ld.exe" />
321-
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\ndk\i686-linux-android-strip.exe" />
322-
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\ndk\x86_64-linux-android-as.exe" />
323-
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\ndk\x86_64-linux-android-ld.exe" />
324-
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\ndk\x86_64-linux-android-strip.exe" />
313+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\aarch64-linux-android-as.exe" />
314+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\aarch64-linux-android-ld.exe" />
315+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\aarch64-linux-android-strip.exe" />
316+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\arm-linux-androideabi-as.exe" />
317+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\arm-linux-androideabi-ld.exe" />
318+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\arm-linux-androideabi-strip.exe" />
319+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\i686-linux-android-as.exe" />
320+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\i686-linux-android-ld.exe" />
321+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\i686-linux-android-strip.exe" />
322+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\x86_64-linux-android-as.exe" />
323+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\x86_64-linux-android-ld.exe" />
324+
<_MSBuildFilesWin Include="$(MSBuildSrcDir)\binutils\x86_64-linux-android-strip.exe" />
325325
<_MSBuildLibHostFilesWin Include="$(MSBuildSrcDir)\lib\host-mxe-Win64\libmono-android.debug.dll" Condition=" '$(HostOS)' != 'Windows' " />
326326
<_MSBuildLibHostFilesWin Include="$(MSBuildSrcDir)\lib\host-mxe-Win64\libmono-android.release.dll" Condition=" '$(HostOS)' != 'Windows' " />
327327
<_MSBuildLibHostFilesWin Include="$(MSBuildSrcDir)\lib\host-mxe-Win64\libMonoPosixHelper.dll" />
@@ -341,18 +341,18 @@
341341
</_MSBuildFilesUnixSignAndHarden>
342342
</ItemDefinitionGroup>
343343
<ItemGroup>
344-
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\ndk\aarch64-linux-android-as" />
345-
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\ndk\aarch64-linux-android-ld" />
346-
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\ndk\aarch64-linux-android-strip" />
347-
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\ndk\arm-linux-androideabi-as" />
348-
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\ndk\arm-linux-androideabi-ld" />
349-
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\ndk\arm-linux-androideabi-strip" />
350-
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\ndk\i686-linux-android-as" />
351-
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\ndk\i686-linux-android-ld" />
352-
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\ndk\i686-linux-android-strip" />
353-
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\ndk\x86_64-linux-android-as" />
354-
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\ndk\x86_64-linux-android-ld" />
355-
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\ndk\x86_64-linux-android-strip" />
344+
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\binutils\aarch64-linux-android-as" />
345+
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\binutils\aarch64-linux-android-ld" />
346+
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\binutils\aarch64-linux-android-strip" />
347+
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\binutils\arm-linux-androideabi-as" />
348+
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\binutils\arm-linux-androideabi-ld" />
349+
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\binutils\arm-linux-androideabi-strip" />
350+
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\binutils\i686-linux-android-as" />
351+
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\binutils\i686-linux-android-ld" />
352+
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\binutils\i686-linux-android-strip" />
353+
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\binutils\x86_64-linux-android-as" />
354+
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\binutils\x86_64-linux-android-ld" />
355+
<_MSBuildFilesUnixSignAndHarden Include="$(MSBuildSrcDir)\$(HostOS)\binutils\x86_64-linux-android-strip" />
356356
<_MSBuildFilesUnix Include="$(MSBuildSrcDir)\$(HostOS)\illinkanalyzer" Permission="755" />
357357
<_MSBuildFilesUnix Include="$(MSBuildSrcDir)\$(HostOS)\jit-times" Permission="755" />
358358
<_MSBuildFilesUnix Include="$(MSBuildSrcDir)\$(HostOS)\aprofutil" ExcludeFromAndroidNETSdk="true" />

build-tools/xaprepare/xaprepare/Application/BuildInfo.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ partial class BuildInfo : AppObject
1818
public string NDKVersionMajor { get; private set; } = String.Empty;
1919
public string NDKVersionMinor { get; private set; } = String.Empty;
2020
public string NDKVersionMicro { get; private set; } = String.Empty;
21+
public string NDKVersionTag { get; private set; } = String.Empty;
2122
public string NDKMinimumApiAvailable { get; private set; } = String.Empty;
2223

2324
public string VersionHash { get; private set; } = String.Empty;
@@ -59,15 +60,15 @@ public bool GatherNDKInfo (Context context)
5960
string rev = parts [1].Trim ();
6061
NDKRevision = rev;
6162

62-
Version ver;
63-
if (!Version.TryParse (rev, out ver)) {
63+
if (!Utilities.ParseAndroidPkgRevision (rev, out Version? ver, out string tag)) {
6464
Log.ErrorLine ($"Unable to parse NDK revision '{rev}' as a valid version string");
6565
return false;
6666
}
6767

6868
NDKVersionMajor = ver.Major.ToString ();
6969
NDKVersionMinor = ver.Minor.ToString ();
7070
NDKVersionMicro = ver.Build.ToString ();
71+
NDKVersionTag = tag;
7172
break;
7273
}
7374

build-tools/xaprepare/xaprepare/Application/MonoJitRuntime.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public override void Init (Context context)
2424
OutputMonoBtlsFilename = Configurables.Defaults.MonoRuntimeOutputMonoBtlsFilename;
2525
OutputMonoPosixHelperFilename = Configurables.Defaults.MonoRuntimeOutputMonoPosixHelperFilename;
2626
OutputProfilerFilename = Configurables.Defaults.MonoRuntimeOutputProfilerFilename;
27-
Strip = Path.Combine (Configurables.Paths.AndroidToolchainBinDirectory, $"{Configurables.Defaults.AndroidToolchainPrefixes [Name]}-strip");
27+
Strip = Path.Combine (Configurables.Paths.AndroidToolchainBinDirectory, "llvm-strip");
2828
}
2929
}
3030
}

build-tools/xaprepare/xaprepare/Application/Utilities.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,29 @@ static partial class Utilities
2929

3030
public static readonly Encoding UTF8NoBOM = new UTF8Encoding (false);
3131

32+
public static bool ParseAndroidPkgRevision (string? v, out Version? version, out string? tag)
33+
{
34+
string? ver = v?.Trim ();
35+
version = null;
36+
tag = null;
37+
if (String.IsNullOrEmpty (ver))
38+
return false;
39+
40+
if (ver!.IndexOf ('.') < 0)
41+
ver = $"{ver}.0";
42+
43+
int tagIdx = ver.IndexOf ('-');
44+
if (tagIdx >= 0) {
45+
tag = ver.Substring (tagIdx + 1);
46+
ver = ver.Substring (0, tagIdx - 1);
47+
}
48+
49+
if (Version.TryParse (ver, out version))
50+
return true;
51+
52+
return false;
53+
}
54+
3255
public static bool AbiChoiceChanged (Context context)
3356
{
3457
string cacheFile = Configurables.Paths.MonoRuntimesEnabledAbisCachePath;

build-tools/xaprepare/xaprepare/ConfigAndData/BuildAndroidPlatforms.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ namespace Xamarin.Android.Prepare
55
{
66
class BuildAndroidPlatforms
77
{
8-
public const string AndroidNdkVersion = "22b";
9-
public const string AndroidNdkPkgRevision = "22.1.7171670";
8+
public const string AndroidNdkVersion = "23";
9+
public const string AndroidNdkPkgRevision = "23.0.7599858";
1010

1111
public static readonly List<AndroidPlatform> AllPlatforms = new List<AndroidPlatform> {
1212
new AndroidPlatform (apiName: "", apiLevel: 1, platformID: "1"),

build-tools/xaprepare/xaprepare/ConfigAndData/Configurables.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -398,8 +398,8 @@ public static partial class Paths
398398
public static string AndroidToolchainRootDirectory => GetCachedPath (ref androidToolchainRootDirectory, () => Path.Combine (AndroidNdkDirectory, "toolchains", "llvm", "prebuilt", NdkToolchainOSTag));
399399
public static string AndroidToolchainBinDirectory => GetCachedPath (ref androidToolchainBinDirectory, () => Path.Combine (AndroidToolchainRootDirectory, "bin"));
400400
public static string AndroidToolchainSysrootLibDirectory => GetCachedPath (ref androidToolchainSysrootLibDirectory, () => Path.Combine (AndroidToolchainRootDirectory, "sysroot", "usr", "lib"));
401-
public static string WindowsBinutilsInstallDir => GetCachedPath (ref windowsBinutilsInstallDir, () => Path.Combine (InstallMSBuildDir, "ndk"));
402-
public static string HostBinutilsInstallDir => GetCachedPath (ref hostBinutilsInstallDir, () => Path.Combine (InstallMSBuildDir, ctx.Properties.GetRequiredValue (KnownProperties.HostOS), "ndk"));
401+
public static string WindowsBinutilsInstallDir => GetCachedPath (ref windowsBinutilsInstallDir, () => Path.Combine (InstallMSBuildDir, "binutils"));
402+
public static string HostBinutilsInstallDir => GetCachedPath (ref hostBinutilsInstallDir, () => Path.Combine (InstallMSBuildDir, ctx.Properties.GetRequiredValue (KnownProperties.HostOS), "binutils"));
403403
public static string BinutilsCacheDir => ctx.Properties.GetRequiredValue (KnownProperties.AndroidToolchainCacheDirectory);
404404
public static string AndroidBuildToolsCacheDir => ctx.Properties.GetRequiredValue (KnownProperties.AndroidToolchainCacheDirectory);
405405

build-tools/xaprepare/xaprepare/ConfigAndData/Dependencies/AndroidToolchain.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public AndroidToolchain ()
6969
new AndroidToolchainComponent ("docs-24_r01", destDir: "docs", pkgRevision: "1", dependencyType: AndroidToolchainComponentType.BuildDependency),
7070
new AndroidToolchainComponent ("android_m2repository_r47", destDir: Path.Combine ("extras", "android", "m2repository"), pkgRevision: "47.0.0", dependencyType: AndroidToolchainComponentType.BuildDependency),
7171
new AndroidToolchainComponent ($"x86_64-29_r07-{osTag}", destDir: Path.Combine ("system-images", "android-29", "default", "x86_64"), relativeUrl: new Uri ("sys-img/android/", UriKind.Relative), pkgRevision: "7", dependencyType: AndroidToolchainComponentType.EmulatorDependency),
72-
new AndroidToolchainComponent ($"android-ndk-r{AndroidNdkVersion}-{osTag}-x86_64", destDir: AndroidNdkDirectory, pkgRevision: AndroidPkgRevision),
72+
new AndroidToolchainComponent ($"android-ndk-r{AndroidNdkVersion}-{osTag}", destDir: AndroidNdkDirectory, pkgRevision: AndroidPkgRevision),
7373
new AndroidToolchainComponent ($"{XABuildToolsPackagePrefix}build-tools_r{XABuildToolsVersion}-{altOsTag}", destDir: Path.Combine ("build-tools", XABuildToolsFolder), isMultiVersion: true),
7474
new AndroidToolchainComponent ($"commandlinetools-{cltOsTag}-{CommandLineToolsVersion}",
7575
destDir: Path.Combine ("cmdline-tools", CommandLineToolsFolder), isMultiVersion: true),

build-tools/xaprepare/xaprepare/Steps/Step_Android_SDK_NDK.cs

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -307,37 +307,21 @@ bool IsInstalled (AndroidToolchainComponent component, string path, out bool mis
307307
return false;
308308
}
309309

310-
if (!ParseVersion (pkgRevision, out Version? pkgVer) || pkgVer == null) {
310+
if (!Utilities.ParseAndroidPkgRevision (pkgRevision, out Version? pkgVer, out string pkgTag) || pkgVer == null) {
311311
Log.DebugLine ($"Failed to parse a valid version from Pkg.Revision ({pkgRevision}) for component '{component.Name}'. Component will be reinstalled.");
312312
return false;
313313
}
314314

315-
if (!ParseVersion (component.PkgRevision, out Version? expectedPkgVer) || expectedPkgVer == null)
315+
if (!Utilities.ParseAndroidPkgRevision (component.PkgRevision, out Version? expectedPkgVer, out string expectedTag) || expectedPkgVer == null)
316316
throw new InvalidOperationException ($"Invalid expected package version for component '{component.Name}': {component.PkgRevision}");
317317

318-
bool equal = pkgVer == expectedPkgVer;
318+
bool equal = (pkgVer == expectedPkgVer) && (pkgTag == expectedTag);
319319
if (!equal)
320-
Log.DebugLine ($"Installed version of '{component.Name}' ({pkgVer}) is different than the required one ({expectedPkgVer})");
320+
Log.DebugLine ($"Installed version of '{component.Name}' ({pkgRevision}) is different than the required one ({component.PkgRevision})");
321321

322322
return equal;
323323
}
324324

325-
bool ParseVersion (string? v, out Version? version)
326-
{
327-
string? ver = v?.Trim ();
328-
version = null;
329-
if (String.IsNullOrEmpty (ver))
330-
return false;
331-
332-
if (ver!.IndexOf ('.') < 0)
333-
ver = $"{ver}.0";
334-
335-
if (Version.TryParse (ver, out version))
336-
return true;
337-
338-
return false;
339-
}
340-
341325
bool IsNdk (AndroidToolchainComponent component)
342326
{
343327
return component.Name.StartsWith ("android-ndk", StringComparison.OrdinalIgnoreCase);

src/Xamarin.Android.Build.Tasks/Tasks/GetAotArguments.cs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -312,14 +312,20 @@ string GetLdFlags(NdkTools ndk, AndroidTargetArch arch, int level, string toolPr
312312
}
313313

314314
string toolchainLibDir;
315-
if (ndk.UsesClang)
316-
toolchainLibDir = GetNdkToolchainLibraryDir (ndk, toolchainPath, arch);
317-
else
315+
if (ndk.UsesClang) {
316+
if (ndk.NoBinutils) {
317+
toolchainLibDir = String.Empty;
318+
} else {
319+
toolchainLibDir = GetNdkToolchainLibraryDir (ndk, toolchainPath, arch);
320+
}
321+
} else
318322
toolchainLibDir = GetNdkToolchainLibraryDir (ndk, toolchainPath);
319323

320324
var libs = new List<string> ();
321325
if (ndk.UsesClang) {
322-
libs.Add ($"-L{toolchainLibDir.TrimEnd ('\\')}");
326+
if (!String.IsNullOrEmpty (toolchainLibDir)) {
327+
libs.Add ($"-L{toolchainLibDir.TrimEnd ('\\')}");
328+
}
323329
libs.Add ($"-L{androidLibPath.TrimEnd ('\\')}");
324330

325331
if (arch == AndroidTargetArch.Arm) {
@@ -329,7 +335,9 @@ string GetLdFlags(NdkTools ndk, AndroidTargetArch arch, int level, string toolPr
329335
}
330336
}
331337

332-
libs.Add (Path.Combine (toolchainLibDir, "libgcc.a"));
338+
if (!String.IsNullOrEmpty (toolchainLibDir)) {
339+
libs.Add (Path.Combine (toolchainLibDir, "libgcc.a"));
340+
}
333341
libs.Add (Path.Combine (androidLibPath, "libc.so"));
334342
libs.Add (Path.Combine (androidLibPath, "libm.so"));
335343

0 commit comments

Comments
 (0)