Skip to content

Commit 60890ee

Browse files
authored
[jni] Add support for JArray.of() (#1938)
1 parent cb09254 commit 60890ee

File tree

3 files changed

+45
-3
lines changed

3 files changed

+45
-3
lines changed

pkgs/jni/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
java types.
88
- Do not require a `dylibDir` when running `Jni.spawn` from Dart standalone,
99
instead use the default value of `build/jni_libs`.
10+
- Added `JArray.of`, which allows a `JArray` to be constructed from an
11+
`Iterable`.
1012

1113
## 0.13.0
1214

pkgs/jni/lib/src/jarray.dart

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,12 @@ class JArray<E extends JObject?> extends JObject with Iterable<E> {
125125
factory JArray(JObjType<E> elementType, int length) {
126126
RangeError.checkNotNegative(length);
127127
if (!elementType.isNullable) {
128-
throw StateError('Element type of JArray must be nullable when '
129-
'all elements with null\n\n'
130-
'Try using .nullableType instead');
128+
throw ArgumentError.value(
129+
elementType,
130+
'elementType',
131+
'Element type of JArray must be nullable when constructed with a '
132+
'length (because the elements will be initialized to null).\n\n'
133+
'Try using .nullableType instead');
131134
}
132135
return _newArray<E>(elementType, length);
133136
}
@@ -159,6 +162,13 @@ class JArray<E extends JObject?> extends JObject with Iterable<E> {
159162
return _newArray<$E>(E, length, fill);
160163
}
161164

165+
/// Creates a [JArray] from `elements`.
166+
static JArray<$E> of<$E extends JObject?>(
167+
JObjType<$E> elementType, Iterable<$E> elements) {
168+
return _newArray<$E>(elementType, elements.length)
169+
..setRange(0, elements.length, elements);
170+
}
171+
162172
/// The number of elements in this array.
163173
@override
164174
late final length = Jni.env.GetArrayLength(reference.pointer);

pkgs/jni/test/jarray_test.dart

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,8 @@ void run({required TestRunnerCallback testRunner}) {
411411
expect(array[0], isNull);
412412
expect(array[1], isNull);
413413
expect(array[2], isNull);
414+
415+
expect(() => JArray(JObject.type, 3), throwsArgumentError);
414416
});
415417
});
416418
testRunner('Java 2d array', () {
@@ -447,6 +449,34 @@ void run({required TestRunnerCallback testRunner}) {
447449
expect(array[2].toDartString(releaseOriginal: true), 'abc');
448450
});
449451
});
452+
testRunner('JArray.of', () {
453+
using((arena) {
454+
final array1 = JArray.of(JString.type, [
455+
'apple'.toJString()..releasedBy(arena),
456+
'banana'.toJString()..releasedBy(arena)
457+
])
458+
..releasedBy(arena);
459+
expect(array1.length, 2);
460+
expect(array1[0].toDartString(releaseOriginal: true), 'apple');
461+
expect(array1[1].toDartString(releaseOriginal: true), 'banana');
462+
463+
final array2 = JArray.of(JString.nullableType, [
464+
'apple'.toJString()..releasedBy(arena),
465+
null,
466+
'banana'.toJString()..releasedBy(arena)
467+
]);
468+
expect(array2.length, 3);
469+
expect(array2[0]!.toDartString(releaseOriginal: true), 'apple');
470+
expect(array2[1], isNull);
471+
expect(array2[2]!.toDartString(releaseOriginal: true), 'banana');
472+
473+
final array3 = JArray.of<JObject>(JString.type, []);
474+
expect(array3.length, 0);
475+
476+
final array4 = JArray.of<JObject?>(JString.nullableType, []);
477+
expect(array4.length, 0);
478+
});
479+
});
450480
testRunner('JArray of JByte', () {
451481
using((arena) {
452482
final arr = JArray(JByte.nullableType, 1)..releasedBy(arena);

0 commit comments

Comments
 (0)