Skip to content

Commit 4c9a50f

Browse files
authored
[native_toolchain_c] Add workaround for minSdkVersion 19 and 20 (#181)
Closes: #171 Uses the workaround that the Android Gradle plugin uses: #171 (comment).
1 parent 45b5e6c commit 4c9a50f

File tree

2 files changed

+52
-32
lines changed

2 files changed

+52
-32
lines changed

pkgs/native_toolchain_c/lib/src/cbuilder/run_cbuilder.dart

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'dart:math';
6+
57
import 'package:logging/logging.dart';
68
import 'package:native_assets_cli/native_assets_cli.dart';
79

@@ -126,13 +128,21 @@ class RunCBuilder {
126128
targetIosSdk = buildConfig.targetIOSSdk!;
127129
}
128130

131+
// The Android Gradle plugin does not honor API level 19 and 20 when
132+
// invoking clang. Mimic that behavior here.
133+
// See https://github.com/dart-lang/native/issues/171.
134+
late final int targetAndroidNdkApi;
135+
if (target.os == OS.android) {
136+
targetAndroidNdkApi = max(buildConfig.targetAndroidNdkApi!, 21);
137+
}
138+
129139
await runProcess(
130140
executable: compiler.uri,
131141
arguments: [
132142
if (target.os == OS.android) ...[
133143
'--target='
134144
'${androidNdkClangTargetFlags[target]!}'
135-
'${buildConfig.targetAndroidNdkApi!}',
145+
'$targetAndroidNdkApi',
136146
'--sysroot=${androidSysroot(compiler).toFilePath()}',
137147
],
138148
if (target.os == OS.macOS)

pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_android_test.dart

Lines changed: 41 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ void main() {
3333
Target.androidX64: 'elf64-x86-64',
3434
};
3535

36+
/// From https://docs.flutter.dev/reference/supported-platforms.
37+
const flutterAndroidNdkVersionLowestBestEffort = 19;
38+
3639
/// From https://docs.flutter.dev/reference/supported-platforms.
3740
const flutterAndroidNdkVersionLowestSupported = 21;
3841

@@ -41,38 +44,45 @@ void main() {
4144

4245
for (final linkMode in LinkMode.values) {
4346
for (final target in targets) {
44-
test('CBuilder $linkMode library $target', () async {
45-
final tempUri = await tempDirForTest();
46-
final libUri = await buildLib(
47-
tempUri,
48-
target,
49-
flutterAndroidNdkVersionLowestSupported,
50-
linkMode,
51-
);
52-
if (Platform.isLinux) {
53-
final result = await runProcess(
54-
executable: Uri.file('readelf'),
55-
arguments: ['-h', libUri.path],
56-
logger: logger,
57-
);
58-
expect(result.exitCode, 0);
59-
final machine = result.stdout
60-
.split('\n')
61-
.firstWhere((e) => e.contains('Machine:'));
62-
expect(machine, contains(readElfMachine[target]));
63-
} else if (Platform.isMacOS) {
64-
final result = await runProcess(
65-
executable: Uri.file('objdump'),
66-
arguments: ['-T', libUri.path],
67-
logger: logger,
47+
for (final apiLevel in [
48+
flutterAndroidNdkVersionLowestBestEffort,
49+
flutterAndroidNdkVersionLowestSupported,
50+
flutterAndroidNdkVersionHighestSupported,
51+
]) {
52+
test('CBuilder $linkMode library $target minSdkVersion $apiLevel',
53+
() async {
54+
final tempUri = await tempDirForTest();
55+
final libUri = await buildLib(
56+
tempUri,
57+
target,
58+
apiLevel,
59+
linkMode,
6860
);
69-
expect(result.exitCode, 0);
70-
final machine = result.stdout
71-
.split('\n')
72-
.firstWhere((e) => e.contains('file format'));
73-
expect(machine, contains(objdumpFileFormat[target]));
74-
}
75-
});
61+
if (Platform.isLinux) {
62+
final result = await runProcess(
63+
executable: Uri.file('readelf'),
64+
arguments: ['-h', libUri.path],
65+
logger: logger,
66+
);
67+
expect(result.exitCode, 0);
68+
final machine = result.stdout
69+
.split('\n')
70+
.firstWhere((e) => e.contains('Machine:'));
71+
expect(machine, contains(readElfMachine[target]));
72+
} else if (Platform.isMacOS) {
73+
final result = await runProcess(
74+
executable: Uri.file('objdump'),
75+
arguments: ['-T', libUri.path],
76+
logger: logger,
77+
);
78+
expect(result.exitCode, 0);
79+
final machine = result.stdout
80+
.split('\n')
81+
.firstWhere((e) => e.contains('file format'));
82+
expect(machine, contains(objdumpFileFormat[target]));
83+
}
84+
});
85+
}
7686
}
7787
}
7888

0 commit comments

Comments
 (0)