[jnigen] added .filled ctor to JArray (https://github.com/dart-lang/jnigen/issues/130)

Closed https://github.com/dart-lang/jnigen/issues/129.
diff --git a/pkgs/jni/lib/src/jarray.dart b/pkgs/jni/lib/src/jarray.dart
index 8ce6b30..4169167 100644
--- a/pkgs/jni/lib/src/jarray.dart
+++ b/pkgs/jni/lib/src/jarray.dart
@@ -22,17 +22,38 @@
   /// Construct a new [JArray] with [reference] as its underlying reference.
   JArray.fromRef(JArrayPtr reference) : super.fromRef(reference);
 
-  JArray(JType<E> typeClass, int length)
-      : super.fromRef(
-          (typeClass._type == JniCallType.objectType)
-              ? _accessors
-                  .newObjectArray(
-                      length, typeClass._getClass().reference, nullptr)
-                  .checkedRef
-              : _accessors
-                  .newPrimitiveArray(length, typeClass._type)
-                  .checkedRef,
-        );
+  /// Creates a [JArray] of the given length from the given [type].
+  ///
+  /// The [length] must be a non-negative integer.
+  factory JArray(JType<E> type, int length) {
+    if (type._type == JniCallType.objectType) {
+      final clazz = type._getClass();
+      final array = JArray<E>.fromRef(
+        _accessors.newObjectArray(length, clazz.reference, nullptr).checkedRef,
+      );
+      clazz.delete();
+      return array;
+    }
+    return JArray.fromRef(
+      _accessors.newPrimitiveArray(length, type._type).checkedRef,
+    );
+  }
+
+  /// Creates a [JArray] of the given length with [fill] at each position.
+  ///
+  /// The [length] must be a non-negative integer.
+  /// The [fill] must be a non-null [JObject].
+  static JArray<E> filled<E extends JObject>(int length, E fill) {
+    assert(!fill.isNull, "fill must not be null.");
+    final clazz = fill.getClass();
+    final array = JArray<E>.fromRef(
+      _accessors
+          .newObjectArray(length, clazz.reference, fill.reference)
+          .checkedRef,
+    );
+    clazz.delete();
+    return array;
+  }
 
   int? _length;
 
diff --git a/pkgs/jni/test/jarray_test.dart b/pkgs/jni/test/jarray_test.dart
index ad14c0f..9a75e41 100644
--- a/pkgs/jni/test/jarray_test.dart
+++ b/pkgs/jni/test/jarray_test.dart
@@ -199,9 +199,9 @@
       array[0] = "حس".toJString()..deletedIn(arena);
       array[1] = "\$".toJString()..deletedIn(arena);
       array[2] = "33".toJString()..deletedIn(arena);
-      expect(array[0].toDartString(), "حس");
-      expect(array[1].toDartString(), "\$");
-      expect(array[2].toDartString(), "33");
+      expect(array[0].toDartString(deleteOriginal: true), "حس");
+      expect(array[1].toDartString(deleteOriginal: true), "\$");
+      expect(array[2].toDartString(deleteOriginal: true), "33");
       array.setRange(
         0,
         3,
@@ -213,9 +213,9 @@
         ],
         1,
       );
-      expect(array[0].toDartString(), "55");
-      expect(array[1].toDartString(), "66");
-      expect(array[2].toDartString(), "77");
+      expect(array[0].toDartString(deleteOriginal: true), "55");
+      expect(array[1].toDartString(deleteOriginal: true), "66");
+      expect(array[2].toDartString(deleteOriginal: true), "77");
       expect(() {
         final _ = array[-1];
       }, throwsRangeError);
@@ -256,4 +256,21 @@
       expect(twoDimArray[2][2], 4);
     });
   });
+  test("JArray.filled", () {
+    using((arena) {
+      final string = "abc".toJString()..deletedIn(arena);
+      final array = JArray.filled(3, string)..deletedIn(arena);
+      expect(
+        () {
+          final _ = JArray.filled(3, JString.fromRef(nullptr))
+            ..deletedIn(arena);
+        },
+        throwsA(isA<AssertionError>()),
+      );
+      expect(array.length, 3);
+      expect(array[0].toDartString(deleteOriginal: true), "abc");
+      expect(array[1].toDartString(deleteOriginal: true), "abc");
+      expect(array[2].toDartString(deleteOriginal: true), "abc");
+    });
+  });
 }