Skip to content

Commit f77a3d7

Browse files
[jnigen] JniX to JX rename (#126)
Closed #124. Closed #125. * Added `JPrimitive` and its subclasses instead of using the typedefs from `ffi` directly. * Renamed `JniObject`, `JniString`, and ... to the shorter `JObject`, JString`, and ... * Made tests more robust by deleting the objects in an arena.
1 parent ca1be9f commit f77a3d7

38 files changed

+2754
-2503
lines changed

pkgs/jni/example/integration_test/on_device_jni_test.dart

+3-3
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ void main() {
2222
}
2323
}
2424

25-
testWidgets("Long.intValue() using JniObject", (t) async {
25+
testWidgets("Long.intValue() using JObject", (t) async {
2626
final longClass = Jni.findJniClass("java/lang/Long");
2727

2828
final longCtor = longClass.getCtorID("(J)V");
@@ -38,7 +38,7 @@ void main() {
3838

3939
testWidgets("call a static method using JniClass APIs", (t) async {
4040
final integerClass = JniClass.fromRef(Jni.findClass("java/lang/Integer"));
41-
final result = integerClass.callStaticMethodByName<JniString>(
41+
final result = integerClass.callStaticMethodByName<JString>(
4242
"toHexString", "(I)Ljava/lang/String;", [31]);
4343

4444
final resultString = result.toDartString();
@@ -116,7 +116,7 @@ void main() {
116116
});
117117

118118
testWidgets("enums", (t) async {
119-
final ordinal = Jni.retrieveStaticField<JniObject>(
119+
final ordinal = Jni.retrieveStaticField<JObject>(
120120
"java/net/Proxy\$Type", "HTTP", "Ljava/net/Proxy\$Type;")
121121
.use((f) => f.callMethodByName<int>("ordinal", "()I", []));
122122
expect(ordinal, equals(1));

pkgs/jni/example/lib/main.dart

+4-4
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import 'package:jni/jni.dart';
1515
// GlobalJniEnv is a thin abstraction over JNIEnv in JNI C API.
1616
//
1717
// For a more ergonomic API for common use cases of calling methods and
18-
// accessing fields, see next examples using JniObject and JniClass.
18+
// accessing fields, see next examples using JObject and JniClass.
1919
String toJavaStringUsingEnv(int n) => using((arena) {
2020
final env = Jni.env;
2121
final cls = env.FindClass("java/lang/String".toNativeChars(arena));
@@ -56,7 +56,7 @@ int uptime() {
5656
}
5757

5858
void quit() {
59-
JniObject.fromRef(Jni.getCurrentActivity())
59+
JObject.fromRef(Jni.getCurrentActivity())
6060
.use((ac) => ac.callMethodByName<void>("finish", "()V", []));
6161
}
6262

@@ -68,7 +68,7 @@ void showToast(String text) {
6868
// In this example, Toaster class wraps android.widget.Toast so that it
6969
// can be called from any thread. See
7070
// android/app/src/main/java/com/github/dart_lang/jni_example/Toaster.java
71-
Jni.invokeStaticMethod<JniObject>(
71+
Jni.invokeStaticMethod<JObject>(
7272
"com/github/dart_lang/jni_example/Toaster",
7373
"makeText",
7474
"(Landroid/app/Activity;Landroid/content/Context;"
@@ -100,7 +100,7 @@ void main() {
100100
"android/os/Build", "DEVICE", "Ljava/lang/String;")),
101101
Example(
102102
"Package name",
103-
() => JniObject.fromRef(Jni.getCurrentActivity()).use((activity) =>
103+
() => JObject.fromRef(Jni.getCurrentActivity()).use((activity) =>
104104
activity.callMethodByName<String>(
105105
"getPackageName", "()Ljava/lang/String;", [])),
106106
),

pkgs/jni/ffigen.yaml

+28-26
Original file line numberDiff line numberDiff line change
@@ -55,32 +55,34 @@ typedefs:
5555
- '__builtin_va_list'
5656
rename:
5757
'JNI(.*)': 'Jni$1'
58-
'jint': 'JInt'
59-
'jclass': 'JClass'
60-
'jobject': 'JObject'
61-
'jbyte': 'JByte'
62-
'jsize': 'JSize'
63-
'jmethodID': 'JMethodID'
64-
'jfieldID': 'JFieldID'
65-
'jboolean': 'JBoolean'
66-
'jthrowable': 'JThrowable'
67-
'jchar': 'JChar'
68-
'jshort': 'JShort'
69-
'jlong': 'JLong'
70-
'jfloat': 'JFloat'
71-
'jdouble': 'JDouble'
72-
'jstring': 'JString'
73-
'jarray': 'JArray'
74-
'jobjectArray': 'JObjectArray'
75-
'jbooleanArray': 'JBooleanArray'
76-
'jbyteArray': 'JByteArray'
77-
'jcharArray': 'JCharArray'
78-
'jshortArray': 'JShortArray'
79-
'jintArray': 'JIntArray'
80-
'jlongArray': 'JLongArray'
81-
'jfloatArray': 'JFloatArray'
82-
'jdoubleArray': 'JDoubleArray'
83-
'jweak': 'JWeak'
58+
# Primitives
59+
'jbyte': 'JByteMarker'
60+
'jboolean': 'JBooleanMarker'
61+
'jchar': 'JCharMarker'
62+
'jshort': 'JShortMarker'
63+
'jint': 'JIntMarker'
64+
'jlong': 'JLongMarker'
65+
'jfloat': 'JFloatMarker'
66+
'jdouble': 'JDoubleMarker'
67+
'jsize': 'JSizeMarker'
68+
69+
'jclass': 'JClassPtr'
70+
'jobject': 'JObjectPtr'
71+
'jmethodID': 'JMethodIDPtr'
72+
'jfieldID': 'JFieldIDPtr'
73+
'jthrowable': 'JThrowablePtr'
74+
'jstring': 'JStringPtr'
75+
'jarray': 'JArrayPtr'
76+
'jobjectArray': 'JObjectArrayPtr'
77+
'jbooleanArray': 'JBooleanArrayPtr'
78+
'jbyteArray': 'JByteArrayPtr'
79+
'jcharArray': 'JCharArrayPtr'
80+
'jshortArray': 'JShortArrayPtr'
81+
'jintArray': 'JIntArrayPtr'
82+
'jlongArray': 'JLongArrayPtr'
83+
'jfloatArray': 'JFloatArrayPtr'
84+
'jdoubleArray': 'JDoubleArrayPtr'
85+
'jweak': 'JWeakPtr'
8486
'jvalue': 'JValue'
8587
preamble: |
8688
// Autogenerated file. Do not edit.

pkgs/jni/lib/internal_helpers_for_jnigen.dart

+1-1
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/jni_object.dart' show JniReference;
10+
export 'src/types.dart' show JReference;
1111
export 'src/accessors.dart';

pkgs/jni/lib/jni.dart

+1-2
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,7 @@ export 'src/third_party/jni_bindings_generated.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/jni_exceptions.dart';
68-
export 'src/jni_object.dart' hide JniReference;
67+
export 'src/types.dart' hide JReference;
6968

7069
export 'package:ffi/ffi.dart' show using, Arena;
7170
export 'dart:ffi' show nullptr;

pkgs/jni/lib/src/accessors.dart

+18-15
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ import 'package:jni/src/jvalues.dart';
99

1010
import 'third_party/jni_bindings_generated.dart';
1111
import 'jni.dart';
12-
import 'jni_exceptions.dart';
12+
import 'types.dart';
1313

14-
void _check(JThrowable exception) {
14+
void _check(JThrowablePtr exception) {
1515
if (exception != nullptr) {
1616
Jni.accessors.throwException(exception);
1717
}
@@ -55,7 +55,7 @@ extension JniResultMethods on JniResult {
5555
return result.d;
5656
}
5757

58-
JObject get object {
58+
JObjectPtr get object {
5959
check();
6060
return result.l;
6161
}
@@ -67,12 +67,12 @@ extension JniResultMethods on JniResult {
6767
}
6868

6969
extension JniIdLookupResultMethods on JniPointerResult {
70-
JMethodID get methodID {
70+
JMethodIDPtr get methodID {
7171
_check(exception);
7272
return id.cast<jmethodID_>();
7373
}
7474

75-
JFieldID get fieldID {
75+
JFieldIDPtr get fieldID {
7676
_check(exception);
7777
return id.cast<jfieldID_>();
7878
}
@@ -84,7 +84,7 @@ extension JniIdLookupResultMethods on JniPointerResult {
8484
}
8585

8686
extension JniClassLookupResultMethods on JniClassLookupResult {
87-
JClass get checkedClassRef {
87+
JClassPtr get checkedClassRef {
8888
_check(exception);
8989
return classRef;
9090
}
@@ -95,7 +95,7 @@ extension JniAccessorWrappers on Pointer<JniAccessors> {
9595
///
9696
/// The original exception object is deleted by this method. The message
9797
/// and Java stack trace are included in the exception.
98-
void throwException(JThrowable exception) {
98+
void throwException(JThrowablePtr exception) {
9999
final details = getExceptionDetails(exception);
100100
final env = Jni.env;
101101
final message = env.asDartString(details.message);
@@ -108,42 +108,45 @@ extension JniAccessorWrappers on Pointer<JniAccessors> {
108108

109109
// TODO(PR): How to name these methods? These only wrap toNativeChars()
110110
// so that generated bindings are less verbose.
111-
JClass getClassOf(String internalName) =>
111+
JClassPtr getClassOf(String internalName) =>
112112
using((arena) => getClass(internalName.toNativeChars(arena)))
113113
.checkedClassRef;
114114

115-
JMethodID getMethodIDOf(JClass cls, String name, String signature) =>
115+
JMethodIDPtr getMethodIDOf(JClassPtr cls, String name, String signature) =>
116116
using((arena) => getMethodID(
117117
cls, name.toNativeChars(arena), signature.toNativeChars(arena)))
118118
.methodID;
119119

120-
JMethodID getStaticMethodIDOf(JClass cls, String name, String signature) =>
120+
JMethodIDPtr getStaticMethodIDOf(
121+
JClassPtr cls, String name, String signature) =>
121122
using((arena) => getStaticMethodID(
122123
cls, name.toNativeChars(arena), signature.toNativeChars(arena)))
123124
.methodID;
124125

125-
JFieldID getFieldIDOf(JClass cls, String name, String signature) =>
126+
JFieldIDPtr getFieldIDOf(JClassPtr cls, String name, String signature) =>
126127
using((arena) => getFieldID(
127128
cls, name.toNativeChars(arena), signature.toNativeChars(arena)))
128129
.fieldID;
129130

130-
JFieldID getStaticFieldIDOf(JClass cls, String name, String signature) =>
131+
JFieldIDPtr getStaticFieldIDOf(
132+
JClassPtr cls, String name, String signature) =>
131133
using((arena) => getStaticFieldID(
132134
cls, name.toNativeChars(arena), signature.toNativeChars(arena)))
133135
.fieldID;
134136

135-
JniResult newObjectWithArgs(JClass cls, JMethodID ctor, List<dynamic> args) =>
137+
JniResult newObjectWithArgs(
138+
JClassPtr cls, JMethodIDPtr ctor, List<dynamic> args) =>
136139
using((arena) {
137140
return newObject(cls, ctor, toJValues(args, allocator: arena));
138141
});
139142

140143
JniResult callMethodWithArgs(
141-
JObject obj, JMethodID id, int callType, List<dynamic> args) =>
144+
JObjectPtr obj, JMethodIDPtr id, int callType, List<dynamic> args) =>
142145
using((arena) =>
143146
callMethod(obj, id, callType, toJValues(args, allocator: arena)));
144147

145148
JniResult callStaticMethodWithArgs(
146-
JClass cls, JMethodID id, int callType, List<dynamic> args) =>
149+
JClassPtr cls, JMethodIDPtr id, int callType, List<dynamic> args) =>
147150
using((arena) => callStaticMethod(
148151
cls, id, callType, toJValues(args, allocator: arena)));
149152
}

0 commit comments

Comments
 (0)