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

Lines changed: 3640 additions & 3583 deletions

‎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
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\lib64\libZipSharpNative.pdb" />
311311
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\proguard\bin\proguard.bat" />
312312
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\aapt2.exe" />
313-
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\ndk\aarch64-linux-android-as.exe" />
314-
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\ndk\aarch64-linux-android-ld.exe" />
315-
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\ndk\aarch64-linux-android-strip.exe" />
316-
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\ndk\arm-linux-androideabi-as.exe" />
317-
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\ndk\arm-linux-androideabi-ld.exe" />
318-
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\ndk\arm-linux-androideabi-strip.exe" />
319-
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\ndk\i686-linux-android-as.exe" />
320-
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\ndk\i686-linux-android-ld.exe" />
321-
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\ndk\i686-linux-android-strip.exe" />
322-
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\ndk\x86_64-linux-android-as.exe" />
323-
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\ndk\x86_64-linux-android-ld.exe" />
324-
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\ndk\x86_64-linux-android-strip.exe" />
313+
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\binutils\aarch64-linux-android-as.exe" />
314+
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\binutils\aarch64-linux-android-ld.exe" />
315+
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\binutils\aarch64-linux-android-strip.exe" />
316+
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\binutils\arm-linux-androideabi-as.exe" />
317+
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\binutils\arm-linux-androideabi-ld.exe" />
318+
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\binutils\arm-linux-androideabi-strip.exe" />
319+
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\binutils\i686-linux-android-as.exe" />
320+
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\binutils\i686-linux-android-ld.exe" />
321+
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\binutils\i686-linux-android-strip.exe" />
322+
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\binutils\x86_64-linux-android-as.exe" />
323+
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\binutils\x86_64-linux-android-ld.exe" />
324+
<_MSBuildFilesWinInclude="$(MSBuildSrcDir)\binutils\x86_64-linux-android-strip.exe" />
325325
<_MSBuildLibHostFilesWinInclude="$(MSBuildSrcDir)\lib\host-mxe-Win64\libmono-android.debug.dll"Condition=" '$(HostOS)' != 'Windows' " />
326326
<_MSBuildLibHostFilesWinInclude="$(MSBuildSrcDir)\lib\host-mxe-Win64\libmono-android.release.dll"Condition=" '$(HostOS)' != 'Windows' " />
327327
<_MSBuildLibHostFilesWinInclude="$(MSBuildSrcDir)\lib\host-mxe-Win64\libMonoPosixHelper.dll" />
@@ -341,18 +341,18 @@
341341
</_MSBuildFilesUnixSignAndHarden>
342342
</ItemDefinitionGroup>
343343
<ItemGroup>
344-
<_MSBuildFilesUnixSignAndHardenInclude="$(MSBuildSrcDir)\$(HostOS)\ndk\aarch64-linux-android-as" />
345-
<_MSBuildFilesUnixSignAndHardenInclude="$(MSBuildSrcDir)\$(HostOS)\ndk\aarch64-linux-android-ld" />
346-
<_MSBuildFilesUnixSignAndHardenInclude="$(MSBuildSrcDir)\$(HostOS)\ndk\aarch64-linux-android-strip" />
347-
<_MSBuildFilesUnixSignAndHardenInclude="$(MSBuildSrcDir)\$(HostOS)\ndk\arm-linux-androideabi-as" />
348-
<_MSBuildFilesUnixSignAndHardenInclude="$(MSBuildSrcDir)\$(HostOS)\ndk\arm-linux-androideabi-ld" />
349-
<_MSBuildFilesUnixSignAndHardenInclude="$(MSBuildSrcDir)\$(HostOS)\ndk\arm-linux-androideabi-strip" />
350-
<_MSBuildFilesUnixSignAndHardenInclude="$(MSBuildSrcDir)\$(HostOS)\ndk\i686-linux-android-as" />
351-
<_MSBuildFilesUnixSignAndHardenInclude="$(MSBuildSrcDir)\$(HostOS)\ndk\i686-linux-android-ld" />
352-
<_MSBuildFilesUnixSignAndHardenInclude="$(MSBuildSrcDir)\$(HostOS)\ndk\i686-linux-android-strip" />
353-
<_MSBuildFilesUnixSignAndHardenInclude="$(MSBuildSrcDir)\$(HostOS)\ndk\x86_64-linux-android-as" />
354-
<_MSBuildFilesUnixSignAndHardenInclude="$(MSBuildSrcDir)\$(HostOS)\ndk\x86_64-linux-android-ld" />
355-
<_MSBuildFilesUnixSignAndHardenInclude="$(MSBuildSrcDir)\$(HostOS)\ndk\x86_64-linux-android-strip" />
344+
<_MSBuildFilesUnixSignAndHardenInclude="$(MSBuildSrcDir)\$(HostOS)\binutils\aarch64-linux-android-as" />
345+
<_MSBuildFilesUnixSignAndHardenInclude="$(MSBuildSrcDir)\$(HostOS)\binutils\aarch64-linux-android-ld" />
346+
<_MSBuildFilesUnixSignAndHardenInclude="$(MSBuildSrcDir)\$(HostOS)\binutils\aarch64-linux-android-strip" />
347+
<_MSBuildFilesUnixSignAndHardenInclude="$(MSBuildSrcDir)\$(HostOS)\binutils\arm-linux-androideabi-as" />
348+
<_MSBuildFilesUnixSignAndHardenInclude="$(MSBuildSrcDir)\$(HostOS)\binutils\arm-linux-androideabi-ld" />
349+
<_MSBuildFilesUnixSignAndHardenInclude="$(MSBuildSrcDir)\$(HostOS)\binutils\arm-linux-androideabi-strip" />
350+
<_MSBuildFilesUnixSignAndHardenInclude="$(MSBuildSrcDir)\$(HostOS)\binutils\i686-linux-android-as" />
351+
<_MSBuildFilesUnixSignAndHardenInclude="$(MSBuildSrcDir)\$(HostOS)\binutils\i686-linux-android-ld" />
352+
<_MSBuildFilesUnixSignAndHardenInclude="$(MSBuildSrcDir)\$(HostOS)\binutils\i686-linux-android-strip" />
353+
<_MSBuildFilesUnixSignAndHardenInclude="$(MSBuildSrcDir)\$(HostOS)\binutils\x86_64-linux-android-as" />
354+
<_MSBuildFilesUnixSignAndHardenInclude="$(MSBuildSrcDir)\$(HostOS)\binutils\x86_64-linux-android-ld" />
355+
<_MSBuildFilesUnixSignAndHardenInclude="$(MSBuildSrcDir)\$(HostOS)\binutils\x86_64-linux-android-strip" />
356356
<_MSBuildFilesUnixInclude="$(MSBuildSrcDir)\$(HostOS)\illinkanalyzer"Permission="755" />
357357
<_MSBuildFilesUnixInclude="$(MSBuildSrcDir)\$(HostOS)\jit-times"Permission="755" />
358358
<_MSBuildFilesUnixInclude="$(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
publicstringNDKVersionMajor{get;privateset;}=String.Empty;
1919
publicstringNDKVersionMinor{get;privateset;}=String.Empty;
2020
publicstringNDKVersionMicro{get;privateset;}=String.Empty;
21+
publicstringNDKVersionTag{get;privateset;}=String.Empty;
2122
publicstringNDKMinimumApiAvailable{get;privateset;}=String.Empty;
2223

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

62-
Versionver;
63-
if(!Version.TryParse(rev,outver)){
63+
if(!Utilities.ParseAndroidPkgRevision(rev,outVersion?ver,outstringtag)){
6464
Log.ErrorLine($"Unable to parse NDK revision '{rev}' as a valid version string");
6565
returnfalse;
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
publicstaticreadonlyEncodingUTF8NoBOM=newUTF8Encoding(false);
3131

32+
publicstaticboolParseAndroidPkgRevision(string?v,outVersion?version,outstring?tag)
33+
{
34+
string?ver=v?.Trim();
35+
version=null;
36+
tag=null;
37+
if(String.IsNullOrEmpty(ver))
38+
returnfalse;
39+
40+
if(ver!.IndexOf('.')<0)
41+
ver=$"{ver}.0";
42+
43+
inttagIdx=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,outversion))
50+
returntrue;
51+
52+
returnfalse;
53+
}
54+
3255
publicstaticboolAbiChoiceChanged(Contextcontext)
3356
{
3457
stringcacheFile=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
classBuildAndroidPlatforms
77
{
8-
publicconststringAndroidNdkVersion="22b";
9-
publicconststringAndroidNdkPkgRevision="22.1.7171670";
8+
publicconststringAndroidNdkVersion="23";
9+
publicconststringAndroidNdkPkgRevision="23.0.7599858";
1010

1111
publicstaticreadonlyList<AndroidPlatform>AllPlatforms=newList<AndroidPlatform>{
1212
newAndroidPlatform(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
publicstaticstringAndroidToolchainRootDirectory=>GetCachedPath(refandroidToolchainRootDirectory,()=>Path.Combine(AndroidNdkDirectory,"toolchains","llvm","prebuilt",NdkToolchainOSTag));
399399
publicstaticstringAndroidToolchainBinDirectory=>GetCachedPath(refandroidToolchainBinDirectory,()=>Path.Combine(AndroidToolchainRootDirectory,"bin"));
400400
publicstaticstringAndroidToolchainSysrootLibDirectory=>GetCachedPath(refandroidToolchainSysrootLibDirectory,()=>Path.Combine(AndroidToolchainRootDirectory,"sysroot","usr","lib"));
401-
publicstaticstringWindowsBinutilsInstallDir=>GetCachedPath(refwindowsBinutilsInstallDir,()=>Path.Combine(InstallMSBuildDir,"ndk"));
402-
publicstaticstringHostBinutilsInstallDir=>GetCachedPath(refhostBinutilsInstallDir,()=>Path.Combine(InstallMSBuildDir,ctx.Properties.GetRequiredValue(KnownProperties.HostOS),"ndk"));
401+
publicstaticstringWindowsBinutilsInstallDir=>GetCachedPath(refwindowsBinutilsInstallDir,()=>Path.Combine(InstallMSBuildDir,"binutils"));
402+
publicstaticstringHostBinutilsInstallDir=>GetCachedPath(refhostBinutilsInstallDir,()=>Path.Combine(InstallMSBuildDir,ctx.Properties.GetRequiredValue(KnownProperties.HostOS),"binutils"));
403403
publicstaticstringBinutilsCacheDir=>ctx.Properties.GetRequiredValue(KnownProperties.AndroidToolchainCacheDirectory);
404404
publicstaticstringAndroidBuildToolsCacheDir=>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
newAndroidToolchainComponent("docs-24_r01",destDir:"docs",pkgRevision:"1",dependencyType:AndroidToolchainComponentType.BuildDependency),
7070
newAndroidToolchainComponent("android_m2repository_r47",destDir:Path.Combine("extras","android","m2repository"),pkgRevision:"47.0.0",dependencyType:AndroidToolchainComponentType.BuildDependency),
7171
newAndroidToolchainComponent($"x86_64-29_r07-{osTag}",destDir:Path.Combine("system-images","android-29","default","x86_64"),relativeUrl:newUri("sys-img/android/",UriKind.Relative),pkgRevision:"7",dependencyType:AndroidToolchainComponentType.EmulatorDependency),
72-
newAndroidToolchainComponent($"android-ndk-r{AndroidNdkVersion}-{osTag}-x86_64",destDir:AndroidNdkDirectory,pkgRevision:AndroidPkgRevision),
72+
newAndroidToolchainComponent($"android-ndk-r{AndroidNdkVersion}-{osTag}",destDir:AndroidNdkDirectory,pkgRevision:AndroidPkgRevision),
7373
newAndroidToolchainComponent($"{XABuildToolsPackagePrefix}build-tools_r{XABuildToolsVersion}-{altOsTag}",destDir:Path.Combine("build-tools",XABuildToolsFolder),isMultiVersion:true),
7474
newAndroidToolchainComponent($"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
returnfalse;
308308
}
309309

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

315-
if(!ParseVersion(component.PkgRevision,outVersion?expectedPkgVer)||expectedPkgVer==null)
315+
if(!Utilities.ParseAndroidPkgRevision(component.PkgRevision,outVersion?expectedPkgVer,outstringexpectedTag)||expectedPkgVer==null)
316316
thrownewInvalidOperationException($"Invalid expected package version for component '{component.Name}': {component.PkgRevision}");
317317

318-
boolequal=pkgVer==expectedPkgVer;
318+
boolequal=(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
returnequal;
323323
}
324324

325-
boolParseVersion(string?v,outVersion?version)
326-
{
327-
string?ver=v?.Trim();
328-
version=null;
329-
if(String.IsNullOrEmpty(ver))
330-
returnfalse;
331-
332-
if(ver!.IndexOf('.')<0)
333-
ver=$"{ver}.0";
334-
335-
if(Version.TryParse(ver,outversion))
336-
returntrue;
337-
338-
returnfalse;
339-
}
340-
341325
boolIsNdk(AndroidToolchainComponentcomponent)
342326
{
343327
returncomponent.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
stringtoolchainLibDir;
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
varlibs=newList<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)