Skip to content

Commit e5205d6

Browse files
[jnigen] Fix generated vararg types (#1214)
1 parent 6d71f2d commit e5205d6

File tree

13 files changed

+205
-204
lines changed

13 files changed

+205
-204
lines changed

pkgs/jni/lib/internal_helpers_for_jnigen.dart

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,42 @@
66
/// not to be used directly.
77
library internal_helpers_for_jnigen;
88

9+
import 'dart:ffi' as ffi;
10+
911
export 'src/accessors.dart';
1012
export 'src/jni.dart' show ProtectedJniExtensions;
1113
export 'src/types.dart' show referenceType;
1214
export 'src/jreference.dart';
1315
export 'src/method_invocation.dart';
16+
17+
/// Temporary fix for the macOS arm64 varargs problem.
18+
///
19+
/// This integer type is Int32 on all architectures, other than macOS arm64.
20+
/// Where it is Int64.
21+
@ffi.AbiSpecificIntegerMapping({
22+
ffi.Abi.androidArm: ffi.Int32(),
23+
ffi.Abi.androidArm64: ffi.Int32(),
24+
ffi.Abi.androidIA32: ffi.Int32(),
25+
ffi.Abi.androidX64: ffi.Int32(),
26+
ffi.Abi.androidRiscv64: ffi.Int32(),
27+
ffi.Abi.fuchsiaArm64: ffi.Int32(),
28+
ffi.Abi.fuchsiaX64: ffi.Int32(),
29+
ffi.Abi.fuchsiaRiscv64: ffi.Int32(),
30+
ffi.Abi.iosArm: ffi.Int32(),
31+
ffi.Abi.iosArm64: ffi.Int32(),
32+
ffi.Abi.iosX64: ffi.Int32(),
33+
ffi.Abi.linuxArm: ffi.Int32(),
34+
ffi.Abi.linuxArm64: ffi.Int32(),
35+
ffi.Abi.linuxIA32: ffi.Int32(),
36+
ffi.Abi.linuxX64: ffi.Int32(),
37+
ffi.Abi.linuxRiscv32: ffi.Int32(),
38+
ffi.Abi.linuxRiscv64: ffi.Int32(),
39+
ffi.Abi.macosArm64: ffi.Int64(), // <-- Only this is different.
40+
ffi.Abi.macosX64: ffi.Int32(),
41+
ffi.Abi.windowsArm64: ffi.Int32(),
42+
ffi.Abi.windowsIA32: ffi.Int32(),
43+
ffi.Abi.windowsX64: ffi.Int32(),
44+
})
45+
final class $Int32 extends ffi.AbiSpecificInteger {
46+
const $Int32();
47+
}

pkgs/jni/tool/wrapper_generators/generate_dart_extensions.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import 'dart:io';
66

7-
import 'package:collection/collection.dart';
87
import 'package:ffigen/src/code_generator.dart';
98

109
import 'ffigen_util.dart';
@@ -177,7 +176,7 @@ String getGlobalEnvExtension(
177176
}
178177
final extensionFunctions = env.members
179178
.map((m) => getGlobalEnvExtensionFunction(m, checkedReturnTypes[m.name]))
180-
.whereNotNull()
179+
.nonNulls
181180
.join('\n');
182181
return '''
183182
/// Wraps over Pointer<GlobalJniEnvStruct> and exposes function pointer fields
@@ -235,7 +234,7 @@ String getFunctionPointerExtension(
235234
final extensionFunctions = compound.members
236235
.map((f) => getFunctionPointerExtensionFunction(f,
237236
indirect: indirect, implicitThis: implicitThis))
238-
.whereNotNull()
237+
.nonNulls
239238
.join('\n');
240239
return '''
241240
/// Wraps over the function pointers in $type and exposes them as methods.

pkgs/jnigen/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## 0.9.3-wip
2+
3+
- Fixed a bug where wrong argument types were generated for varargs.
4+
- Fixed the macOS arm64 varargs issue caused by the previous release.
5+
6+
17
## 0.9.2
28

39
- Fixed a bug where wrong argument types were generated for 32-bit

pkgs/jnigen/example/in_app_java/lib/android_utils.dart

Lines changed: 36 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ class EmojiCompat_Config extends jni.JObject {
188188
static final _setReplaceAll = ProtectedJniExtensions.lookup<
189189
ffi.NativeFunction<
190190
jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
191-
ffi.VarArgs<(ffi.Uint8,)>)>>("globalEnv_CallObjectMethod")
191+
ffi.VarArgs<($Int32,)>)>>("globalEnv_CallObjectMethod")
192192
.asFunction<
193193
jni.JniResult Function(
194194
ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
@@ -217,7 +217,7 @@ class EmojiCompat_Config extends jni.JObject {
217217
static final _setUseEmojiAsDefaultStyle = ProtectedJniExtensions.lookup<
218218
ffi.NativeFunction<
219219
jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
220-
ffi.VarArgs<(ffi.Uint8,)>)>>("globalEnv_CallObjectMethod")
220+
ffi.VarArgs<($Int32,)>)>>("globalEnv_CallObjectMethod")
221221
.asFunction<
222222
jni.JniResult Function(
223223
ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
@@ -257,7 +257,7 @@ class EmojiCompat_Config extends jni.JObject {
257257
jni.JniResult Function(
258258
ffi.Pointer<ffi.Void>,
259259
jni.JMethodIDPtr,
260-
ffi.VarArgs<(ffi.Uint8, ffi.Pointer<ffi.Void>)>)>>(
260+
ffi.VarArgs<($Int32, ffi.Pointer<ffi.Void>)>)>>(
261261
"globalEnv_CallObjectMethod")
262262
.asFunction<
263263
jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int,
@@ -298,7 +298,7 @@ class EmojiCompat_Config extends jni.JObject {
298298
static final _setEmojiSpanIndicatorEnabled = ProtectedJniExtensions.lookup<
299299
ffi.NativeFunction<
300300
jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
301-
ffi.VarArgs<(ffi.Uint8,)>)>>("globalEnv_CallObjectMethod")
301+
ffi.VarArgs<($Int32,)>)>>("globalEnv_CallObjectMethod")
302302
.asFunction<
303303
jni.JniResult Function(
304304
ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
@@ -329,7 +329,7 @@ class EmojiCompat_Config extends jni.JObject {
329329
static final _setEmojiSpanIndicatorColor = ProtectedJniExtensions.lookup<
330330
ffi.NativeFunction<
331331
jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
332-
ffi.VarArgs<(ffi.Int32,)>)>>("globalEnv_CallObjectMethod")
332+
ffi.VarArgs<($Int32,)>)>>("globalEnv_CallObjectMethod")
333333
.asFunction<
334334
jni.JniResult Function(
335335
ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
@@ -356,7 +356,7 @@ class EmojiCompat_Config extends jni.JObject {
356356
static final _setMetadataLoadStrategy = ProtectedJniExtensions.lookup<
357357
ffi.NativeFunction<
358358
jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
359-
ffi.VarArgs<(ffi.Int32,)>)>>("globalEnv_CallObjectMethod")
359+
ffi.VarArgs<($Int32,)>)>>("globalEnv_CallObjectMethod")
360360
.asFunction<
361361
jni.JniResult Function(
362362
ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
@@ -649,9 +649,9 @@ class EmojiCompat_GlyphChecker extends jni.JObject {
649649
ffi.VarArgs<
650650
(
651651
ffi.Pointer<ffi.Void>,
652-
ffi.Int32,
653-
ffi.Int32,
654-
ffi.Int32
652+
$Int32,
653+
$Int32,
654+
$Int32
655655
)>)>>("globalEnv_CallBooleanMethod")
656656
.asFunction<
657657
jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
@@ -1688,7 +1688,7 @@ class EmojiCompat extends jni.JObject {
16881688
jni.JThrowablePtr Function(
16891689
ffi.Pointer<ffi.Void>,
16901690
jni.JMethodIDPtr,
1691-
ffi.VarArgs<(ffi.Uint8,)>)>>("globalEnv_CallStaticVoidMethod")
1691+
ffi.VarArgs<($Int32,)>)>>("globalEnv_CallStaticVoidMethod")
16921692
.asFunction<
16931693
jni.JThrowablePtr Function(
16941694
ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
@@ -1932,7 +1932,7 @@ class EmojiCompat extends jni.JObject {
19321932
jni.JniResult Function(
19331933
ffi.Pointer<ffi.Void>,
19341934
jni.JMethodIDPtr,
1935-
ffi.VarArgs<(ffi.Pointer<ffi.Void>, ffi.Int32)>)>>(
1935+
ffi.VarArgs<(ffi.Pointer<ffi.Void>, $Int32)>)>>(
19361936
"globalEnv_CallIntMethod")
19371937
.asFunction<
19381938
jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
@@ -1971,7 +1971,7 @@ class EmojiCompat extends jni.JObject {
19711971
jni.JniResult Function(
19721972
ffi.Pointer<ffi.Void>,
19731973
jni.JMethodIDPtr,
1974-
ffi.VarArgs<(ffi.Pointer<ffi.Void>, ffi.Int32)>)>>(
1974+
ffi.VarArgs<(ffi.Pointer<ffi.Void>, $Int32)>)>>(
19751975
"globalEnv_CallIntMethod")
19761976
.asFunction<
19771977
jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
@@ -2002,7 +2002,7 @@ class EmojiCompat extends jni.JObject {
20022002
ffi.VarArgs<
20032003
(
20042004
ffi.Pointer<ffi.Void>,
2005-
ffi.Int32,
2005+
$Int32,
20062006
ffi.Pointer<ffi.Void>
20072007
)>)>>("globalEnv_CallStaticBooleanMethod")
20082008
.asFunction<
@@ -2055,9 +2055,9 @@ class EmojiCompat extends jni.JObject {
20552055
(
20562056
ffi.Pointer<ffi.Void>,
20572057
ffi.Pointer<ffi.Void>,
2058-
ffi.Int32,
2059-
ffi.Int32,
2060-
ffi.Uint8
2058+
$Int32,
2059+
$Int32,
2060+
$Int32
20612061
)>)>>("globalEnv_CallStaticBooleanMethod")
20622062
.asFunction<
20632063
jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
@@ -2139,7 +2139,7 @@ class EmojiCompat extends jni.JObject {
21392139
jni.JniResult Function(
21402140
ffi.Pointer<ffi.Void>,
21412141
jni.JMethodIDPtr,
2142-
ffi.VarArgs<(ffi.Pointer<ffi.Void>, ffi.Int32)>)>>(
2142+
ffi.VarArgs<(ffi.Pointer<ffi.Void>, $Int32)>)>>(
21432143
"globalEnv_CallBooleanMethod")
21442144
.asFunction<
21452145
jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
@@ -2177,7 +2177,7 @@ class EmojiCompat extends jni.JObject {
21772177
jni.JniResult Function(
21782178
ffi.Pointer<ffi.Void>,
21792179
jni.JMethodIDPtr,
2180-
ffi.VarArgs<(ffi.Pointer<ffi.Void>, ffi.Int32)>)>>(
2180+
ffi.VarArgs<(ffi.Pointer<ffi.Void>, $Int32)>)>>(
21812181
"globalEnv_CallIntMethod")
21822182
.asFunction<
21832183
jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
@@ -2247,16 +2247,12 @@ class EmojiCompat extends jni.JObject {
22472247
);
22482248

22492249
static final _process1 = ProtectedJniExtensions.lookup<
2250-
ffi.NativeFunction<
2251-
jni.JniResult Function(
2252-
ffi.Pointer<ffi.Void>,
2253-
jni.JMethodIDPtr,
2254-
ffi.VarArgs<
2255-
(
2256-
ffi.Pointer<ffi.Void>,
2257-
ffi.Int32,
2258-
ffi.Int32
2259-
)>)>>("globalEnv_CallObjectMethod")
2250+
ffi.NativeFunction<
2251+
jni.JniResult Function(
2252+
ffi.Pointer<ffi.Void>,
2253+
jni.JMethodIDPtr,
2254+
ffi.VarArgs<(ffi.Pointer<ffi.Void>, $Int32, $Int32)>)>>(
2255+
"globalEnv_CallObjectMethod")
22602256
.asFunction<
22612257
jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
22622258
ffi.Pointer<ffi.Void>, int, int)>();
@@ -2310,9 +2306,9 @@ class EmojiCompat extends jni.JObject {
23102306
ffi.VarArgs<
23112307
(
23122308
ffi.Pointer<ffi.Void>,
2313-
ffi.Int32,
2314-
ffi.Int32,
2315-
ffi.Int32
2309+
$Int32,
2310+
$Int32,
2311+
$Int32
23162312
)>)>>("globalEnv_CallObjectMethod")
23172313
.asFunction<
23182314
jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
@@ -2371,10 +2367,10 @@ class EmojiCompat extends jni.JObject {
23712367
ffi.VarArgs<
23722368
(
23732369
ffi.Pointer<ffi.Void>,
2374-
ffi.Int32,
2375-
ffi.Int32,
2376-
ffi.Int32,
2377-
ffi.Int32
2370+
$Int32,
2371+
$Int32,
2372+
$Int32,
2373+
$Int32
23782374
)>)>>("globalEnv_CallObjectMethod")
23792375
.asFunction<
23802376
jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
@@ -2738,7 +2734,7 @@ class DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper
27382734
(
27392735
ffi.Pointer<ffi.Void>,
27402736
ffi.Pointer<ffi.Void>,
2741-
ffi.Int32
2737+
$Int32
27422738
)>)>>("globalEnv_CallObjectMethod")
27432739
.asFunction<
27442740
jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
@@ -2888,7 +2884,7 @@ class DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper_API19
28882884
(
28892885
ffi.Pointer<ffi.Void>,
28902886
ffi.Pointer<ffi.Void>,
2891-
ffi.Int32
2887+
$Int32
28922888
)>)>>("globalEnv_CallObjectMethod")
28932889
.asFunction<
28942890
jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
@@ -4158,7 +4154,7 @@ class HashMap<$K extends jni.JObject, $V extends jni.JObject>
41584154
static final _new0 = ProtectedJniExtensions.lookup<
41594155
ffi.NativeFunction<
41604156
jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
4161-
ffi.VarArgs<(ffi.Int32, ffi.Float)>)>>("globalEnv_NewObject")
4157+
ffi.VarArgs<($Int32, ffi.Double)>)>>("globalEnv_NewObject")
41624158
.asFunction<
41634159
jni.JniResult Function(
41644160
ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int, double)>();
@@ -4185,7 +4181,7 @@ class HashMap<$K extends jni.JObject, $V extends jni.JObject>
41854181
static final _new1 = ProtectedJniExtensions.lookup<
41864182
ffi.NativeFunction<
41874183
jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
4188-
ffi.VarArgs<(ffi.Int32,)>)>>("globalEnv_NewObject")
4184+
ffi.VarArgs<($Int32,)>)>>("globalEnv_NewObject")
41894185
.asFunction<
41904186
jni.JniResult Function(
41914187
ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
@@ -4999,7 +4995,7 @@ class AndroidUtils extends jni.JObject {
49994995
(
50004996
ffi.Pointer<ffi.Void>,
50014997
ffi.Pointer<ffi.Void>,
5002-
ffi.Int32
4998+
$Int32
50034999
)>)>>("globalEnv_CallStaticVoidMethod")
50045000
.asFunction<
50055001
jni.JThrowablePtr Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,

pkgs/jnigen/example/notification_plugin/lib/notifications.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class Notifications extends jni.JObject {
7878
ffi.VarArgs<
7979
(
8080
ffi.Pointer<ffi.Void>,
81-
ffi.Int32,
81+
$Int32,
8282
ffi.Pointer<ffi.Void>,
8383
ffi.Pointer<ffi.Void>
8484
)>)>>("globalEnv_CallStaticVoidMethod")

pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/pdmodel/PDDocument.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,7 @@ class PDDocument extends jni.JObject {
510510
jni.JThrowablePtr Function(
511511
ffi.Pointer<ffi.Void>,
512512
jni.JMethodIDPtr,
513-
ffi.VarArgs<(ffi.Int32,)>)>>("globalEnv_CallVoidMethod")
513+
ffi.VarArgs<($Int32,)>)>>("globalEnv_CallVoidMethod")
514514
.asFunction<
515515
jni.JThrowablePtr Function(
516516
ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
@@ -1883,7 +1883,7 @@ class PDDocument extends jni.JObject {
18831883
static final _getPage = ProtectedJniExtensions.lookup<
18841884
ffi.NativeFunction<
18851885
jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
1886-
ffi.VarArgs<(ffi.Int32,)>)>>("globalEnv_CallObjectMethod")
1886+
ffi.VarArgs<($Int32,)>)>>("globalEnv_CallObjectMethod")
18871887
.asFunction<
18881888
jni.JniResult Function(
18891889
ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
@@ -2089,7 +2089,7 @@ class PDDocument extends jni.JObject {
20892089
jni.JThrowablePtr Function(
20902090
ffi.Pointer<ffi.Void>,
20912091
jni.JMethodIDPtr,
2092-
ffi.VarArgs<(ffi.Uint8,)>)>>("globalEnv_CallVoidMethod")
2092+
ffi.VarArgs<($Int32,)>)>>("globalEnv_CallVoidMethod")
20932093
.asFunction<
20942094
jni.JThrowablePtr Function(
20952095
ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
@@ -2200,7 +2200,7 @@ class PDDocument extends jni.JObject {
22002200
jni.JThrowablePtr Function(
22012201
ffi.Pointer<ffi.Void>,
22022202
jni.JMethodIDPtr,
2203-
ffi.VarArgs<(ffi.Float,)>)>>("globalEnv_CallVoidMethod")
2203+
ffi.VarArgs<(ffi.Double,)>)>>("globalEnv_CallVoidMethod")
22042204
.asFunction<
22052205
jni.JThrowablePtr Function(
22062206
ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, double)>();

0 commit comments

Comments
 (0)