Skip to content

Commit 01e293e

Browse files
committed
fix:resolve failing tests and align JNI null handling
1 parent 6336914 commit 01e293e

File tree

5 files changed

+11
-5
lines changed

5 files changed

+11
-5
lines changed

pkgs/jni/lib/src/errors.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ final class UseAfterReleaseError extends StateError with _ExplainsRelease {
3737
}
3838

3939
// TODO(#567): Use NullPointerError once it's available.
40-
final class JNullError extends StateError {
41-
JNullError() : super('The reference was null');
40+
final class JNullError extends JniException {
41+
JNullError() : super('The reference was null', '');
4242
}
4343

4444
final class DoubleReleaseError extends StateError with _ExplainsRelease {

pkgs/jni/lib/src/jclass.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ extension type JInstanceFieldId._fromPointer(JFieldIDPtr pointer) {
4242
JInstanceFieldId._(JClass jClass, String name, String signature)
4343
: pointer = using((arena) {
4444
final jClassRef = jClass.reference;
45+
if (jClassRef.isNull) throw JNullError();
4546
return Jni.env.GetFieldID(
4647
jClassRef.pointer,
4748
name.toNativeChars(arena),
@@ -66,6 +67,7 @@ extension type JStaticFieldId._fromPointer(JFieldIDPtr pointer) {
6667
JStaticFieldId._(JClass jClass, String name, String signature)
6768
: pointer = using((arena) {
6869
final jClassRef = jClass.reference;
70+
if (jClassRef.isNull) throw JNullError();
6971
return Jni.env.GetStaticFieldID(
7072
jClassRef.pointer,
7173
name.toNativeChars(arena),
@@ -93,6 +95,7 @@ extension type JInstanceMethodId._fromPointer(JMethodIDPtr pointer) {
9395
String signature,
9496
) : pointer = using((arena) {
9597
final jClassRef = jClass.reference;
98+
if (jClassRef.isNull) throw JNullError();
9699
return Jni.env.GetMethodID(
97100
jClassRef.pointer,
98101
name.toNativeChars(arena),
@@ -122,6 +125,7 @@ extension type JStaticMethodId._fromPointer(JMethodIDPtr pointer) {
122125
String signature,
123126
) : pointer = using((arena) {
124127
final jClassRef = jClass.reference;
128+
if (jClassRef.isNull) throw JNullError();
125129
return Jni.env.GetStaticMethodID(
126130
jClassRef.pointer,
127131
name.toNativeChars(arena),
@@ -148,6 +152,7 @@ extension type JConstructorId._fromPointer(JMethodIDPtr pointer) {
148152
String signature,
149153
) : pointer = using((arena) {
150154
final jClassRef = jClass.reference;
155+
if (jClassRef.isNull) throw JNullError();
151156
return Jni.env.GetMethodID(
152157
jClassRef.pointer,
153158
'<init>'.toNativeChars(arena),

pkgs/jni/lib/src/jobject.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ class JObject {
107107

108108
/// Constructs a [JObject] with the underlying [reference].
109109
JObject.fromReference(this.reference) {
110-
if (reference.isNull) {
110+
if (reference.isNull && runtimeType == JObject) {
111111
throw JNullError();
112112
}
113113
}

pkgs/jni/lib/src/types.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:ffi';
77
import 'package:ffi/ffi.dart';
88
import 'package:meta/meta.dart' show internal;
99

10+
import 'errors.dart';
1011
import 'jni.dart';
1112
import 'jobject.dart';
1213
import 'jreference.dart';

pkgs/jni/test/null_check_test.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,10 @@ void run({required TestRunnerCallback testRunner}) {
112112
);
113113

114114
final isSame1 = Jni.env.IsSameObject(random.reference.pointer, nullptr);
115-
expect(isSame1, equals(0)); // false
115+
expect(isSame1, isFalse); // false
116116

117117
final isSame2 = Jni.env.IsSameObject(nullptr, nullptr);
118-
expect(isSame2, equals(1)); // true
118+
expect(isSame2, isTrue); // true
119119

120120
random.release();
121121
});

0 commit comments

Comments
 (0)