Skip to content

Commit efbfaca

Browse files
Address comments
1 parent d611416 commit efbfaca

File tree

5 files changed

+103
-29
lines changed

5 files changed

+103
-29
lines changed

pkgs/jnigen/CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
## 0.9.3
1+
## 0.9.3-wip
22

33
- Support throwing Java exceptions from Dart code. ([#1209](https://github.com/dart-lang/native/issues/1209))
44

pkgs/jnigen/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
name: jnigen
66
description: A Dart bindings generator for Java and Kotlin that uses JNI under the hood to interop with Java virtual machine.
7-
version: 0.9.3
7+
version: 0.9.3-wip
88
repository: https://github.com/dart-lang/native/tree/main/pkgs/jnigen
99

1010
environment:

pkgs/jnigen/test/simple_package_test/bindings/simple_package.dart

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4442,7 +4442,7 @@ class StringConverterConsumer extends jni.JObject {
44424442

44434443
static final _id_consumeOnSameThread = _class.staticMethodId(
44444444
r"consumeOnSameThread",
4445-
r"(Lcom/github/dart_lang/jnigen/interfaces/StringConverter;Ljava/lang/String;)I",
4445+
r"(Lcom/github/dart_lang/jnigen/interfaces/StringConverter;Ljava/lang/String;)Ljava/lang/Integer;",
44464446
);
44474447

44484448
static final _consumeOnSameThread = ProtectedJniExtensions.lookup<
@@ -4454,13 +4454,14 @@ class StringConverterConsumer extends jni.JObject {
44544454
(
44554455
ffi.Pointer<ffi.Void>,
44564456
ffi.Pointer<ffi.Void>
4457-
)>)>>("globalEnv_CallStaticIntMethod")
4457+
)>)>>("globalEnv_CallStaticObjectMethod")
44584458
.asFunction<
44594459
jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
44604460
ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
44614461

4462-
/// from: static public int consumeOnSameThread(com.github.dart_lang.jnigen.interfaces.StringConverter stringConverter, java.lang.String s)
4463-
static int consumeOnSameThread(
4462+
/// from: static public java.lang.Integer consumeOnSameThread(com.github.dart_lang.jnigen.interfaces.StringConverter stringConverter, java.lang.String s)
4463+
/// The returned object must be released after use, by calling the [release] method.
4464+
static jni.JInteger consumeOnSameThread(
44644465
StringConverter stringConverter,
44654466
jni.JString s,
44664467
) {
@@ -4469,7 +4470,40 @@ class StringConverterConsumer extends jni.JObject {
44694470
_id_consumeOnSameThread as jni.JMethodIDPtr,
44704471
stringConverter.reference.pointer,
44714472
s.reference.pointer)
4472-
.integer;
4473+
.object(const jni.JIntegerType());
4474+
}
4475+
4476+
static final _id_consumeOnAnotherThread = _class.staticMethodId(
4477+
r"consumeOnAnotherThread",
4478+
r"(Lcom/github/dart_lang/jnigen/interfaces/StringConverter;Ljava/lang/String;)Ljava/util/concurrent/Future;",
4479+
);
4480+
4481+
static final _consumeOnAnotherThread = ProtectedJniExtensions.lookup<
4482+
ffi.NativeFunction<
4483+
jni.JniResult Function(
4484+
ffi.Pointer<ffi.Void>,
4485+
jni.JMethodIDPtr,
4486+
ffi.VarArgs<
4487+
(
4488+
ffi.Pointer<ffi.Void>,
4489+
ffi.Pointer<ffi.Void>
4490+
)>)>>("globalEnv_CallStaticObjectMethod")
4491+
.asFunction<
4492+
jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
4493+
ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
4494+
4495+
/// from: static public java.util.concurrent.Future<java.lang.Integer> consumeOnAnotherThread(com.github.dart_lang.jnigen.interfaces.StringConverter stringConverter, java.lang.String s)
4496+
/// The returned object must be released after use, by calling the [release] method.
4497+
static jni.JObject consumeOnAnotherThread(
4498+
StringConverter stringConverter,
4499+
jni.JString s,
4500+
) {
4501+
return _consumeOnAnotherThread(
4502+
_class.reference.pointer,
4503+
_id_consumeOnAnotherThread as jni.JMethodIDPtr,
4504+
stringConverter.reference.pointer,
4505+
s.reference.pointer)
4506+
.object(const jni.JObjectType());
44734507
}
44744508
}
44754509

pkgs/jnigen/test/simple_package_test/java/com/github/dart_lang/jnigen/interfaces/StringConverterConsumer.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,21 @@
44

55
package com.github.dart_lang.jnigen.interfaces;
66

7-
public class StringConverterConsumer {
7+
import java.util.concurrent.ExecutorService;
8+
import java.util.concurrent.Executors;
9+
import java.util.concurrent.Future;
810

9-
public static int consumeOnSameThread(StringConverter stringConverter, String s) {
11+
public class StringConverterConsumer {
12+
public static Integer consumeOnSameThread(StringConverter stringConverter, String s) {
1013
try {
1114
return stringConverter.parseToInt(s);
1215
} catch (StringConversionException e) {
1316
return -1;
1417
}
1518
}
19+
20+
public static Future<Integer> consumeOnAnotherThread(StringConverter stringConverter, String s) {
21+
ExecutorService executor = Executors.newSingleThreadExecutor();
22+
return executor.submit(() -> consumeOnSameThread(stringConverter, s));
23+
}
1624
}

pkgs/jnigen/test/simple_package_test/runtime_test_registrant.dart

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

55
import 'dart:async';
66
import 'dart:io';
7+
import 'dart:isolate';
78

89
import 'package:test/test.dart';
910
import 'package:jni/jni.dart';
@@ -689,29 +690,60 @@ void registerTests(String groupName, TestRunnerCallback test) {
689690
});
690691

691692
group('throw Java exceptions', () {
692-
test('StringConverter.implement', () async {
693-
final stringConverter = StringConverter.implement($StringConverterImpl(
694-
parseToInt: (s) {
695-
final value = int.tryParse(s.toDartString());
696-
if (value == null) {
697-
throw StringConversionException(
698-
'Invalid integer expression: ${s.toDartString()}'
699-
.toJString());
700-
}
693+
for (final (threading, consume) in [
694+
('another thread', StringConverterConsumer.consumeOnAnotherThread),
695+
('the same thread', StringConverterConsumer.consumeOnSameThread),
696+
]) {
697+
test('StringConverter.implement on $threading ', () async {
698+
final stringConverter =
699+
StringConverter.implement($StringConverterImpl(
700+
parseToInt: (s) {
701+
final value = int.tryParse(s.toDartString());
702+
if (value == null) {
703+
throw StringConversionException(
704+
'Invalid integer expression: $s'.toJString());
705+
}
701706

702-
return value;
703-
},
704-
));
707+
return value;
708+
},
709+
));
710+
711+
// Gets the result of a Java Future.
712+
// TODO(#1213): remove this once we support Java futures.
713+
Future<$T> toDartFuture<$T extends JObject>(
714+
JObject future, JObjType<$T> T) {
715+
return Isolate.run(() {
716+
final futureClass = JClass.forName('java/util/concurrent');
717+
final getMethod = futureClass.instanceMethodId(
718+
'get', '(Ljava/lang/Object;)Ljava/lang/Object;');
719+
final result = getMethod(future, JObject.type, []);
720+
return result.castTo(T);
721+
});
722+
}
705723

706-
var result = StringConverterConsumer.consumeOnSameThread(
707-
stringConverter, '700'.toJString());
708-
expect(result, 700);
724+
final sevenHundredBoxed = consume(stringConverter, '700'.toJString());
725+
final int sevenHundred;
726+
if (sevenHundredBoxed is JInteger) {
727+
sevenHundred = sevenHundredBoxed.intValue();
728+
} else {
729+
sevenHundred =
730+
(await toDartFuture(sevenHundredBoxed, JInteger.type))
731+
.intValue();
732+
}
733+
expect(sevenHundred, 700);
734+
735+
final fooBoxed = consume(stringConverter, 'foo'.toJString());
736+
final int foo;
737+
if (fooBoxed is JInteger) {
738+
foo = fooBoxed.intValue();
739+
} else {
740+
foo = (await toDartFuture(fooBoxed, JInteger.type)).intValue();
741+
}
742+
expect(foo, -1);
709743

710-
result = StringConverterConsumer.consumeOnSameThread(
711-
stringConverter, 'foo'.toJString());
712-
expect(result, -1);
713-
stringConverter.release();
714-
});
744+
stringConverter.release();
745+
});
746+
}
715747
});
716748
});
717749

0 commit comments

Comments
 (0)