Skip to content

Commit 048a423

Browse files
[jnigen] Boxed types + Map + Set + List (#271)
* make primitive types lowercased * remove part statements * add jset, jlist, jmap and jiterator * add JNumber and JBoolean, JInteger and other boxed types * increase coverage
1 parent ef44e98 commit 048a423

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+4024
-6433
lines changed

pkgs/jni/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.5.0-dev.0
2+
* **Breaking Change** ([#137](https://github.com/dart-lang/jnigen/issues/137)): Java primitive types are now all lowercase like `jint`, `jshort`, ...
3+
* The bindings for `java.util.Set`, `java.util.Map`, `java.util.List` and the numeric types like `java.lang.Integer`, `java.lang.Boolean`, ... are now included in `package:jni`.
4+
15
## 0.4.0
26
* Type classes now have `superCount` and `superType` getters used for type inference.
37

pkgs/jni/example/integration_test/on_device_jni_test.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@ import 'package:flutter_test/flutter_test.dart';
66

77
import '../../test/global_env_test.dart' as global_env_test;
88
import '../../test/exception_test.dart' as exception_test;
9+
import '../../test/jlist_test.dart' as jlist_test;
10+
import '../../test/jmap_test.dart' as jmap_test;
911
import '../../test/jobject_test.dart' as jobject_test;
12+
import '../../test/jset_test.dart' as jset_test;
1013
import '../../test/jarray_test.dart' as jarray_test;
14+
import '../../test/boxed_test.dart' as boxed_test;
1115
import '../../test/type_test.dart' as type_test;
1216
import '../../test/load_test.dart' as load_test;
1317

@@ -19,8 +23,12 @@ void main() {
1923
final testSuites = [
2024
global_env_test.run,
2125
exception_test.run,
26+
jlist_test.run,
27+
jmap_test.run,
2228
jobject_test.run,
29+
jset_test.run,
2330
jarray_test.run,
31+
boxed_test.run,
2432
type_test.run,
2533
load_test.run,
2634
];

pkgs/jni/lib/internal_helpers_for_jnigen.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@
77
library internal_helpers_for_jnigen;
88

99
export 'src/jni.dart' show ProtectedJniExtensions;
10-
export 'src/types.dart' show JReference;
10+
export 'src/jreference.dart';
1111
export 'src/accessors.dart';

pkgs/jni/lib/jni.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,14 @@ export 'src/third_party/generated_bindings.dart'
6464
hide JniBindings, JniEnv, JniEnv1, JniExceptionDetails;
6565
export 'src/jni.dart' hide ProtectedJniExtensions;
6666
export 'src/jvalues.dart' hide JValueArgs, toJValues;
67-
export 'src/types.dart' hide JReference;
67+
export 'src/types.dart';
68+
export 'src/jarray.dart';
69+
export 'src/jexceptions.dart';
70+
export 'src/jobject.dart';
71+
export 'src/jprimitives.dart';
72+
export 'src/jreference.dart' show JReferenceUseExtension;
73+
export 'src/lang/lang.dart';
74+
export 'src/util/util.dart';
6875

6976
export 'package:ffi/ffi.dart' show using, Arena;
7077
export 'dart:ffi' show nullptr;

pkgs/jni/lib/src/accessors.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import 'package:ffi/ffi.dart' show using;
77

88
import 'package:jni/src/jvalues.dart';
99

10+
import 'jexceptions.dart';
1011
import 'third_party/generated_bindings.dart';
1112
import 'jni.dart';
12-
import 'types.dart';
1313

1414
void _check(JThrowablePtr exception) {
1515
if (exception != nullptr) {

pkgs/jni/lib/src/jarray.dart

Lines changed: 46 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,19 @@
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-
// ignore_for_file: unnecessary_cast
5+
// ignore_for_file: unnecessary_cast, overridden_fields
66

7-
part of 'types.dart';
7+
import 'dart:ffi';
8+
9+
import 'package:collection/collection.dart';
10+
import 'package:ffi/ffi.dart';
11+
import 'package:jni/src/accessors.dart';
12+
import 'package:jni/src/third_party/generated_bindings.dart';
13+
14+
import 'jni.dart';
15+
import 'jobject.dart';
16+
import 'jprimitives.dart';
17+
import 'types.dart';
818

919
class JArrayType<T> extends JObjType<JArray<T>> {
1020
final JType<T> elementType;
@@ -38,7 +48,7 @@ class JArray<E> extends JObject {
3848
final JType<E> elementType;
3949

4050
@override
41-
JArrayType<E> get $type => (_$type ??= type(elementType)) as JArrayType<E>;
51+
late final JArrayType<E> $type = type(elementType) as JArrayType<E>;
4252

4353
/// The type which includes information such as the signature of this class.
4454
static JObjType<JArray<T>> type<T>(JType<T> innerType) =>
@@ -52,18 +62,18 @@ class JArray<E> extends JObject {
5262
///
5363
/// The [length] must be a non-negative integer.
5464
factory JArray(JType<E> type, int length) {
55-
if (type._type == JniCallType.objectType && type is JObjType) {
65+
if (type.callType == JniCallType.objectType && type is JObjType) {
5666
final clazz = (type as JObjType).getClass();
5767
final array = JArray<E>.fromRef(
5868
type,
59-
_accessors.newObjectArray(length, clazz.reference, nullptr).object,
69+
Jni.accessors.newObjectArray(length, clazz.reference, nullptr).object,
6070
);
6171
clazz.delete();
6272
return array;
6373
}
6474
return JArray.fromRef(
6575
type,
66-
_accessors.newPrimitiveArray(length, type._type).object,
76+
Jni.accessors.newPrimitiveArray(length, type.callType).object,
6777
);
6878
}
6979

@@ -76,7 +86,9 @@ class JArray<E> extends JObject {
7686
final clazz = fill.getClass();
7787
final array = JArray<E>.fromRef(
7888
fill.$type as JObjType<E>,
79-
_accessors.newObjectArray(length, clazz.reference, fill.reference).object,
89+
Jni.accessors
90+
.newObjectArray(length, clazz.reference, fill.reference)
91+
.object,
8092
);
8193
clazz.delete();
8294
return array;
@@ -86,12 +98,12 @@ class JArray<E> extends JObject {
8698

8799
JniResult elementAt(int index, int type) {
88100
RangeError.checkValidIndex(index, this);
89-
return _accessors.getArrayElement(reference, index, type);
101+
return Jni.accessors.getArrayElement(reference, index, type);
90102
}
91103

92104
/// The number of elements in this array.
93105
int get length {
94-
return _length ??= _env.GetArrayLength(reference);
106+
return _length ??= Jni.env.GetArrayLength(reference);
95107
}
96108
}
97109

@@ -107,7 +119,7 @@ extension NativeArray<E extends JPrimitive> on JArray<E> {
107119
}
108120
}
109121

110-
extension BoolArray on JArray<JBoolean> {
122+
extension BoolArray on JArray<jboolean> {
111123
bool operator [](int index) {
112124
return elementAt(index, JniCallType.booleanType).boolean;
113125
}
@@ -116,7 +128,7 @@ extension BoolArray on JArray<JBoolean> {
116128
RangeError.checkValidIndex(index, this);
117129
_allocate<JBooleanMarker>(sizeOf<JBooleanMarker>(), (ptr) {
118130
ptr.value = value ? 1 : 0;
119-
_env.SetBooleanArrayRegion(reference, index, 1, ptr);
131+
Jni.env.SetBooleanArrayRegion(reference, index, 1, ptr);
120132
});
121133
}
122134

@@ -129,12 +141,12 @@ extension BoolArray on JArray<JBoolean> {
129141
it.forEachIndexed((index, element) {
130142
ptr[index] = element ? 1 : 0;
131143
});
132-
_env.SetBooleanArrayRegion(reference, start, size, ptr);
144+
Jni.env.SetBooleanArrayRegion(reference, start, size, ptr);
133145
});
134146
}
135147
}
136148

137-
extension ByteArray on JArray<JByte> {
149+
extension ByteArray on JArray<jbyte> {
138150
int operator [](int index) {
139151
return elementAt(index, JniCallType.byteType).byte;
140152
}
@@ -143,7 +155,7 @@ extension ByteArray on JArray<JByte> {
143155
RangeError.checkValidIndex(index, this);
144156
_allocate<JByteMarker>(sizeOf<JByteMarker>(), (ptr) {
145157
ptr.value = value;
146-
_env.SetByteArrayRegion(reference, index, 1, ptr);
158+
Jni.env.SetByteArrayRegion(reference, index, 1, ptr);
147159
});
148160
}
149161

@@ -156,12 +168,12 @@ extension ByteArray on JArray<JByte> {
156168
it.forEachIndexed((index, element) {
157169
ptr[index] = element;
158170
});
159-
_env.SetByteArrayRegion(reference, start, size, ptr);
171+
Jni.env.SetByteArrayRegion(reference, start, size, ptr);
160172
});
161173
}
162174
}
163175

164-
extension CharArray on JArray<JChar> {
176+
extension CharArray on JArray<jchar> {
165177
String operator [](int index) {
166178
return String.fromCharCode(
167179
elementAt(index, JniCallType.charType).char,
@@ -172,7 +184,7 @@ extension CharArray on JArray<JChar> {
172184
RangeError.checkValidIndex(index, this);
173185
_allocate<JCharMarker>(sizeOf<JCharMarker>(), (ptr) {
174186
ptr.value = value.codeUnits.first;
175-
_env.SetCharArrayRegion(reference, index, 1, ptr);
187+
Jni.env.SetCharArrayRegion(reference, index, 1, ptr);
176188
});
177189
}
178190

@@ -185,12 +197,12 @@ extension CharArray on JArray<JChar> {
185197
it.forEachIndexed((index, element) {
186198
ptr[index] = element.codeUnits.first;
187199
});
188-
_env.SetCharArrayRegion(reference, start, size, ptr);
200+
Jni.env.SetCharArrayRegion(reference, start, size, ptr);
189201
});
190202
}
191203
}
192204

193-
extension ShortArray on JArray<JShort> {
205+
extension ShortArray on JArray<jshort> {
194206
int operator [](int index) {
195207
return elementAt(index, JniCallType.shortType).short;
196208
}
@@ -199,7 +211,7 @@ extension ShortArray on JArray<JShort> {
199211
RangeError.checkValidIndex(index, this);
200212
_allocate<JShortMarker>(sizeOf<JShortMarker>(), (ptr) {
201213
ptr.value = value;
202-
_env.SetShortArrayRegion(reference, index, 1, ptr);
214+
Jni.env.SetShortArrayRegion(reference, index, 1, ptr);
203215
});
204216
}
205217

@@ -212,12 +224,12 @@ extension ShortArray on JArray<JShort> {
212224
it.forEachIndexed((index, element) {
213225
ptr[index] = element;
214226
});
215-
_env.SetShortArrayRegion(reference, start, size, ptr);
227+
Jni.env.SetShortArrayRegion(reference, start, size, ptr);
216228
});
217229
}
218230
}
219231

220-
extension IntArray on JArray<JInt> {
232+
extension IntArray on JArray<jint> {
221233
int operator [](int index) {
222234
return elementAt(index, JniCallType.intType).integer;
223235
}
@@ -226,7 +238,7 @@ extension IntArray on JArray<JInt> {
226238
RangeError.checkValidIndex(index, this);
227239
_allocate<JIntMarker>(sizeOf<JIntMarker>(), (ptr) {
228240
ptr.value = value;
229-
_env.SetIntArrayRegion(reference, index, 1, ptr);
241+
Jni.env.SetIntArrayRegion(reference, index, 1, ptr);
230242
});
231243
}
232244

@@ -239,12 +251,12 @@ extension IntArray on JArray<JInt> {
239251
it.forEachIndexed((index, element) {
240252
ptr[index] = element;
241253
});
242-
_env.SetIntArrayRegion(reference, start, size, ptr);
254+
Jni.env.SetIntArrayRegion(reference, start, size, ptr);
243255
});
244256
}
245257
}
246258

247-
extension LongArray on JArray<JLong> {
259+
extension LongArray on JArray<jlong> {
248260
int operator [](int index) {
249261
return elementAt(index, JniCallType.longType).long;
250262
}
@@ -253,7 +265,7 @@ extension LongArray on JArray<JLong> {
253265
RangeError.checkValidIndex(index, this);
254266
_allocate<JLongMarker>(sizeOf<JLongMarker>(), (ptr) {
255267
ptr.value = value;
256-
_env.SetLongArrayRegion(reference, index, 1, ptr);
268+
Jni.env.SetLongArrayRegion(reference, index, 1, ptr);
257269
});
258270
}
259271

@@ -266,12 +278,12 @@ extension LongArray on JArray<JLong> {
266278
it.forEachIndexed((index, element) {
267279
ptr[index] = element;
268280
});
269-
_env.SetLongArrayRegion(reference, start, size, ptr);
281+
Jni.env.SetLongArrayRegion(reference, start, size, ptr);
270282
});
271283
}
272284
}
273285

274-
extension FloatArray on JArray<JFloat> {
286+
extension FloatArray on JArray<jfloat> {
275287
double operator [](int index) {
276288
return elementAt(index, JniCallType.floatType).float;
277289
}
@@ -280,7 +292,7 @@ extension FloatArray on JArray<JFloat> {
280292
RangeError.checkValidIndex(index, this);
281293
_allocate<JFloatMarker>(sizeOf<JFloatMarker>(), (ptr) {
282294
ptr.value = value;
283-
_env.SetFloatArrayRegion(reference, index, 1, ptr);
295+
Jni.env.SetFloatArrayRegion(reference, index, 1, ptr);
284296
});
285297
}
286298

@@ -293,12 +305,12 @@ extension FloatArray on JArray<JFloat> {
293305
it.forEachIndexed((index, element) {
294306
ptr[index] = element;
295307
});
296-
_env.SetFloatArrayRegion(reference, start, size, ptr);
308+
Jni.env.SetFloatArrayRegion(reference, start, size, ptr);
297309
});
298310
}
299311
}
300312

301-
extension DoubleArray on JArray<JDouble> {
313+
extension DoubleArray on JArray<jdouble> {
302314
double operator [](int index) {
303315
return elementAt(index, JniCallType.doubleType).doubleFloat;
304316
}
@@ -307,7 +319,7 @@ extension DoubleArray on JArray<JDouble> {
307319
RangeError.checkValidIndex(index, this);
308320
_allocate<JDoubleMarker>(sizeOf<JDoubleMarker>(), (ptr) {
309321
ptr.value = value;
310-
_env.SetDoubleArrayRegion(reference, index, 1, ptr);
322+
Jni.env.SetDoubleArrayRegion(reference, index, 1, ptr);
311323
});
312324
}
313325

@@ -320,7 +332,7 @@ extension DoubleArray on JArray<JDouble> {
320332
it.forEachIndexed((index, element) {
321333
ptr[index] = element;
322334
});
323-
_env.SetDoubleArrayRegion(reference, start, size, ptr);
335+
Jni.env.SetDoubleArrayRegion(reference, start, size, ptr);
324336
});
325337
}
326338
}
@@ -333,7 +345,7 @@ extension ObjectArray<T extends JObject> on JArray<T> {
333345

334346
void operator []=(int index, T value) {
335347
RangeError.checkValidIndex(index, this);
336-
_env.SetObjectArrayElement(reference, index, value.reference);
348+
Jni.env.SetObjectArrayElement(reference, index, value.reference);
337349
}
338350

339351
void setRange(int start, int end, Iterable<T> iterable, [int skipCount = 0]) {

pkgs/jni/lib/src/jexceptions.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
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-
part of 'types.dart';
5+
import 'dart:ffi';
6+
7+
import 'package:jni/src/third_party/generated_bindings.dart';
68

79
abstract class JException implements Exception {}
810

pkgs/jni/lib/src/jni.dart

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@ import 'dart:isolate';
99
import 'package:ffi/ffi.dart';
1010
import 'package:path/path.dart';
1111

12+
import 'jexceptions.dart';
13+
import 'jobject.dart';
14+
import 'jreference.dart';
1215
import 'third_party/generated_bindings.dart';
1316
import 'jvalues.dart';
14-
import 'types.dart';
1517
import 'accessors.dart';
1618

1719
String _getLibraryFileName(String base) {
@@ -183,17 +185,13 @@ abstract class Jni {
183185
return env;
184186
}
185187

186-
static GlobalJniEnv? _env;
187-
188-
/// Points to a process-wide shared instance of [GlobalJniEnvStruct].
188+
/// Points to a process-wide shared instance of [GlobalJniEnv].
189189
///
190190
/// It provides an indirection over [JniEnv] so that it can be used from
191191
/// any thread, and always returns global object references.
192-
static GlobalJniEnv get env {
193-
return _env ??= GlobalJniEnv(_fetchGlobalEnv());
194-
}
192+
static final env = GlobalJniEnv(_fetchGlobalEnv());
195193

196-
static JniAccessors get accessors => JniAccessors(_bindings.GetAccessors());
194+
static final accessors = JniAccessors(_bindings.GetAccessors());
197195

198196
/// Returns a new PortContinuation.
199197
static JObjectPtr newPortContinuation(ReceivePort port) {

0 commit comments

Comments
 (0)