diff --git a/pkgs/jni/CHANGELOG.md b/pkgs/jni/CHANGELOG.md
index d9b2a72..31db3e2 100644
--- a/pkgs/jni/CHANGELOG.md
+++ b/pkgs/jni/CHANGELOG.md
@@ -1,5 +1,7 @@
 ## 0.8.0-wip
 
+- **Breaking Change**: `JObject.reference` now returns a `JReference` instead of
+  `Pointer<Void>`.
 - **Breaking Change** ([#548](https://github.com/dart-lang/native/issues/548)):
   Converted various `Exception`s into `Error`s:
   - `UseAfterReleaseException` -> `UseAfterReleaseError`
diff --git a/pkgs/jni/example/pubspec.lock b/pkgs/jni/example/pubspec.lock
index a202698..9a5a874 100644
--- a/pkgs/jni/example/pubspec.lock
+++ b/pkgs/jni/example/pubspec.lock
@@ -5,18 +5,18 @@
     dependency: transitive
     description:
       name: _fe_analyzer_shared
-      sha256: ae92f5d747aee634b87f89d9946000c2de774be1d6ac3e58268224348cd0101a
+      sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7"
       url: "https://pub.dev"
     source: hosted
-    version: "61.0.0"
+    version: "67.0.0"
   analyzer:
     dependency: transitive
     description:
       name: analyzer
-      sha256: ea3d8652bda62982addfd92fdc2d0214e5f82e43325104990d4f4c4a2a313562
+      sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d"
       url: "https://pub.dev"
     source: hosted
-    version: "5.13.0"
+    version: "6.4.1"
   args:
     dependency: transitive
     description:
@@ -93,10 +93,10 @@
     dependency: "direct main"
     description:
       name: cupertino_icons
-      sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be
+      sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d
       url: "https://pub.dev"
     source: hosted
-    version: "1.0.5"
+    version: "1.0.6"
   fake_async:
     dependency: transitive
     description:
@@ -109,10 +109,10 @@
     dependency: "direct main"
     description:
       name: ffi
-      sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878"
+      sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21"
       url: "https://pub.dev"
     source: hosted
-    version: "2.1.0"
+    version: "2.1.2"
   file:
     dependency: transitive
     description:
@@ -135,10 +135,10 @@
     dependency: "direct dev"
     description:
       name: flutter_lints
-      sha256: "2118df84ef0c3ca93f96123a616ae8540879991b8b57af2f81b76a7ada49b2a4"
+      sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04
       url: "https://pub.dev"
     source: hosted
-    version: "2.0.2"
+    version: "2.0.3"
   flutter_test:
     dependency: "direct dev"
     description: flutter
@@ -205,10 +205,10 @@
     dependency: transitive
     description:
       name: js
-      sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
+      sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf
       url: "https://pub.dev"
     source: hosted
-    version: "0.6.7"
+    version: "0.7.1"
   leak_tracker:
     dependency: transitive
     description:
@@ -277,10 +277,10 @@
     dependency: transitive
     description:
       name: mime
-      sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e
+      sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2"
       url: "https://pub.dev"
     source: hosted
-    version: "1.0.4"
+    version: "1.0.5"
   node_preamble:
     dependency: transitive
     description:
@@ -317,10 +317,10 @@
     dependency: transitive
     description:
       name: plugin_platform_interface
-      sha256: "43798d895c929056255600343db8f049921cbec94d31ec87f1dc5c16c01935dd"
+      sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
       url: "https://pub.dev"
     source: hosted
-    version: "2.1.5"
+    version: "2.1.8"
   pool:
     dependency: transitive
     description:
@@ -502,14 +502,22 @@
       url: "https://pub.dev"
     source: hosted
     version: "1.1.0"
+  web:
+    dependency: transitive
+    description:
+      name: web
+      sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.5.1"
   web_socket_channel:
     dependency: transitive
     description:
       name: web_socket_channel
-      sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b
+      sha256: "1d8e795e2a8b3730c41b8a98a2dff2e0fb57ae6f0764a1c46ec5915387d257b2"
       url: "https://pub.dev"
     source: hosted
-    version: "2.4.0"
+    version: "2.4.4"
   webdriver:
     dependency: transitive
     description:
@@ -522,10 +530,10 @@
     dependency: transitive
     description:
       name: webkit_inspection_protocol
-      sha256: "67d3a8b6c79e1987d19d848b0892e582dbb0c66c57cc1fef58a177dd2aa2823d"
+      sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572"
       url: "https://pub.dev"
     source: hosted
-    version: "1.2.0"
+    version: "1.2.1"
   yaml:
     dependency: transitive
     description:
@@ -535,5 +543,5 @@
     source: hosted
     version: "3.1.2"
 sdks:
-  dart: ">=3.2.0 <4.0.0"
+  dart: ">=3.3.0 <4.0.0"
   flutter: ">=3.18.0-18.0.pre.54"
diff --git a/pkgs/jni/lib/jni.dart b/pkgs/jni/lib/jni.dart
index 5f0f34c..62f3b29 100644
--- a/pkgs/jni/lib/jni.dart
+++ b/pkgs/jni/lib/jni.dart
@@ -66,7 +66,6 @@
 export 'src/types.dart';
 export 'src/jarray.dart';
 export 'src/jobject.dart';
-export 'src/jreference.dart' show JReferenceUseExtension;
 
 export 'src/lang/lang.dart';
 export 'src/nio/nio.dart';
diff --git a/pkgs/jni/lib/src/jarray.dart b/pkgs/jni/lib/src/jarray.dart
index 2364312..bfccf96 100644
--- a/pkgs/jni/lib/src/jarray.dart
+++ b/pkgs/jni/lib/src/jarray.dart
@@ -75,7 +75,9 @@
       final clazz = (type as JObjType).getClass();
       final array = JArray<E>.fromRef(
         type,
-        Jni.accessors.newObjectArray(length, clazz.reference, nullptr).object,
+        Jni.accessors
+            .newObjectArray(length, clazz.reference.pointer, nullptr)
+            .object,
       );
       clazz.release();
       return array;
@@ -97,7 +99,8 @@
     final array = JArray<E>.fromRef(
       fill.$type as JObjType<E>,
       Jni.accessors
-          .newObjectArray(length, clazz.reference, fill.reference)
+          .newObjectArray(
+              length, clazz.reference.pointer, fill.reference.pointer)
           .object,
     );
     clazz.release();
@@ -108,12 +111,12 @@
 
   JniResult elementAt(int index, int type) {
     RangeError.checkValidIndex(index, this);
-    return Jni.accessors.getArrayElement(reference, index, type);
+    return Jni.accessors.getArrayElement(reference.pointer, index, type);
   }
 
   /// The number of elements in this array.
   int get length {
-    return _length ??= Jni.env.GetArrayLength(reference);
+    return _length ??= Jni.env.GetArrayLength(reference.pointer);
   }
 }
 
@@ -138,7 +141,7 @@
     RangeError.checkValidIndex(index, this);
     _allocate<JBooleanMarker>(sizeOf<JBooleanMarker>(), (ptr) {
       ptr.value = value ? 1 : 0;
-      Jni.env.SetBooleanArrayRegion(reference, index, 1, ptr);
+      Jni.env.SetBooleanArrayRegion(reference.pointer, index, 1, ptr);
     });
   }
 
@@ -151,7 +154,7 @@
       it.forEachIndexed((index, element) {
         ptr[index] = element ? 1 : 0;
       });
-      Jni.env.SetBooleanArrayRegion(reference, start, size, ptr);
+      Jni.env.SetBooleanArrayRegion(reference.pointer, start, size, ptr);
     });
   }
 }
@@ -165,7 +168,7 @@
     RangeError.checkValidIndex(index, this);
     _allocate<JByteMarker>(sizeOf<JByteMarker>(), (ptr) {
       ptr.value = value;
-      Jni.env.SetByteArrayRegion(reference, index, 1, ptr);
+      Jni.env.SetByteArrayRegion(reference.pointer, index, 1, ptr);
     });
   }
 
@@ -178,7 +181,7 @@
       it.forEachIndexed((index, element) {
         ptr[index] = element;
       });
-      Jni.env.SetByteArrayRegion(reference, start, size, ptr);
+      Jni.env.SetByteArrayRegion(reference.pointer, start, size, ptr);
     });
   }
 }
@@ -194,7 +197,7 @@
     RangeError.checkValidIndex(index, this);
     _allocate<JCharMarker>(sizeOf<JCharMarker>(), (ptr) {
       ptr.value = value.codeUnits.first;
-      Jni.env.SetCharArrayRegion(reference, index, 1, ptr);
+      Jni.env.SetCharArrayRegion(reference.pointer, index, 1, ptr);
     });
   }
 
@@ -207,7 +210,7 @@
       it.forEachIndexed((index, element) {
         ptr[index] = element.codeUnits.first;
       });
-      Jni.env.SetCharArrayRegion(reference, start, size, ptr);
+      Jni.env.SetCharArrayRegion(reference.pointer, start, size, ptr);
     });
   }
 }
@@ -221,7 +224,7 @@
     RangeError.checkValidIndex(index, this);
     _allocate<JShortMarker>(sizeOf<JShortMarker>(), (ptr) {
       ptr.value = value;
-      Jni.env.SetShortArrayRegion(reference, index, 1, ptr);
+      Jni.env.SetShortArrayRegion(reference.pointer, index, 1, ptr);
     });
   }
 
@@ -234,7 +237,7 @@
       it.forEachIndexed((index, element) {
         ptr[index] = element;
       });
-      Jni.env.SetShortArrayRegion(reference, start, size, ptr);
+      Jni.env.SetShortArrayRegion(reference.pointer, start, size, ptr);
     });
   }
 }
@@ -248,7 +251,7 @@
     RangeError.checkValidIndex(index, this);
     _allocate<JIntMarker>(sizeOf<JIntMarker>(), (ptr) {
       ptr.value = value;
-      Jni.env.SetIntArrayRegion(reference, index, 1, ptr);
+      Jni.env.SetIntArrayRegion(reference.pointer, index, 1, ptr);
     });
   }
 
@@ -261,7 +264,7 @@
       it.forEachIndexed((index, element) {
         ptr[index] = element;
       });
-      Jni.env.SetIntArrayRegion(reference, start, size, ptr);
+      Jni.env.SetIntArrayRegion(reference.pointer, start, size, ptr);
     });
   }
 }
@@ -275,7 +278,7 @@
     RangeError.checkValidIndex(index, this);
     _allocate<JLongMarker>(sizeOf<JLongMarker>(), (ptr) {
       ptr.value = value;
-      Jni.env.SetLongArrayRegion(reference, index, 1, ptr);
+      Jni.env.SetLongArrayRegion(reference.pointer, index, 1, ptr);
     });
   }
 
@@ -288,7 +291,7 @@
       it.forEachIndexed((index, element) {
         ptr[index] = element;
       });
-      Jni.env.SetLongArrayRegion(reference, start, size, ptr);
+      Jni.env.SetLongArrayRegion(reference.pointer, start, size, ptr);
     });
   }
 }
@@ -302,7 +305,7 @@
     RangeError.checkValidIndex(index, this);
     _allocate<JFloatMarker>(sizeOf<JFloatMarker>(), (ptr) {
       ptr.value = value;
-      Jni.env.SetFloatArrayRegion(reference, index, 1, ptr);
+      Jni.env.SetFloatArrayRegion(reference.pointer, index, 1, ptr);
     });
   }
 
@@ -315,7 +318,7 @@
       it.forEachIndexed((index, element) {
         ptr[index] = element;
       });
-      Jni.env.SetFloatArrayRegion(reference, start, size, ptr);
+      Jni.env.SetFloatArrayRegion(reference.pointer, start, size, ptr);
     });
   }
 }
@@ -329,7 +332,7 @@
     RangeError.checkValidIndex(index, this);
     _allocate<JDoubleMarker>(sizeOf<JDoubleMarker>(), (ptr) {
       ptr.value = value;
-      Jni.env.SetDoubleArrayRegion(reference, index, 1, ptr);
+      Jni.env.SetDoubleArrayRegion(reference.pointer, index, 1, ptr);
     });
   }
 
@@ -342,7 +345,7 @@
       it.forEachIndexed((index, element) {
         ptr[index] = element;
       });
-      Jni.env.SetDoubleArrayRegion(reference, start, size, ptr);
+      Jni.env.SetDoubleArrayRegion(reference.pointer, start, size, ptr);
     });
   }
 }
@@ -355,7 +358,8 @@
 
   void operator []=(int index, T value) {
     RangeError.checkValidIndex(index, this);
-    Jni.env.SetObjectArrayElement(reference, index, value.reference);
+    Jni.env.SetObjectArrayElement(
+        reference.pointer, index, value.reference.pointer);
   }
 
   void setRange(int start, int end, Iterable<T> iterable, [int skipCount = 0]) {
diff --git a/pkgs/jni/lib/src/jobject.dart b/pkgs/jni/lib/src/jobject.dart
index 15c6972..cb68632 100644
--- a/pkgs/jni/lib/src/jobject.dart
+++ b/pkgs/jni/lib/src/jobject.dart
@@ -5,13 +5,12 @@
 import 'dart:ffi';
 
 import 'package:ffi/ffi.dart';
-import 'package:jni/src/accessors.dart';
+import 'package:jni/internal_helpers_for_jnigen.dart';
 
 import 'errors.dart';
 import 'jni.dart';
-import 'jreference.dart';
-import 'lang/jstring.dart';
 import 'jvalues.dart';
+import 'lang/jstring.dart';
 import 'third_party/generated_bindings.dart';
 import 'types.dart';
 
@@ -50,12 +49,12 @@
   JniPointerResult Function(
           Pointer<Void> ptr, Pointer<Char> name, Pointer<Char> sig)
       f,
-  Pointer<Void> ptr,
+  JReference ref,
   String name,
   String sig,
 ) {
-  final result = using(
-      (arena) => f(ptr, name.toNativeChars(arena), sig.toNativeChars(arena)));
+  final result = using((arena) =>
+      f(ref.pointer, name.toNativeChars(arena), sig.toNativeChars(arena)));
   if (result.exception != nullptr) {
     Jni.accessors.throwException(result.exception);
   }
@@ -162,14 +161,16 @@
 /// A high-level wrapper for JNI global object reference.
 ///
 /// This is the base class for classes generated by `jnigen`.
-class JObject extends JReference {
+class JObject {
+  final JReference reference;
+
   late final JObjType<JObject> $type = type;
 
   /// The type which includes information such as the signature of this class.
   static const JObjType<JObject> type = JObjectType();
 
-  /// Construct a new [JObject] with [reference] as its underlying reference.
-  JObject.fromRef(JObjectPtr reference) : super.fromRef(reference);
+  /// Construct a new [JObject] with [ref] as its underlying reference.
+  JObject.fromRef(JObjectPtr ref) : reference = JGlobalReference(ref);
 
   JClass? _jClass;
 
@@ -177,17 +178,18 @@
     return _jClass ??= getClass();
   }
 
-  @override
+  bool get isNull => reference.isNull;
+
   void release() {
     _jClass?.release();
-    super.release();
+    reference.release();
   }
 
   /// Returns [JClass] corresponding to concrete class of this object.
   ///
   /// This may be a subclass of compile-time class.
   JClass getClass() {
-    final classRef = Jni.env.GetObjectClass(reference);
+    final classRef = Jni.env.GetObjectClass(reference.pointer);
     if (classRef == nullptr) {
       Jni.accessors.throwException(Jni.env.ExceptionOccurred());
     }
@@ -231,8 +233,8 @@
     if (callType == JniCallType.voidType) {
       throw ArgumentError("void is not a valid field type.");
     }
-    return _getField<T>(
-        callType, (ct) => Jni.accessors.getField(reference, fieldID, ct));
+    return _getField<T>(callType,
+        (ct) => Jni.accessors.getField(reference.pointer, fieldID, ct));
   }
 
   /// Get value of the field identified by [name] and [signature].
@@ -250,8 +252,10 @@
     if (callType == JniCallType.voidType) {
       throw ArgumentError("void is not a valid field type.");
     }
-    return _getField<T>(callType,
-        (ct) => Jni.accessors.getStaticField(_class.reference, fieldID, ct));
+    return _getField<T>(
+        callType,
+        (ct) => Jni.accessors
+            .getStaticField(_class.reference.pointer, fieldID, ct));
   }
 
   /// Get value of the static field identified by [name] and [signature].
@@ -269,8 +273,11 @@
   ///
   /// See [getField] for an explanation about [callType] and return type [T].
   T callMethod<T>(JMethodIDPtr methodID, List<dynamic> args, [int? callType]) {
-    return _callMethod<T>(callType, args,
-        (ct, jvs) => Jni.accessors.callMethod(reference, methodID, ct, jvs));
+    return _callMethod<T>(
+        callType,
+        args,
+        (ct, jvs) =>
+            Jni.accessors.callMethod(reference.pointer, methodID, ct, jvs));
   }
 
   /// Call instance method identified by [name] and [signature].
@@ -289,8 +296,8 @@
     return _callMethod<T>(
         callType,
         args,
-        (ct, jvs) =>
-            Jni.accessors.callStaticMethod(reference, methodID, ct, jvs));
+        (ct, jvs) => Jni.accessors
+            .callStaticMethod(reference.pointer, methodID, ct, jvs));
   }
 
   /// Call static method identified by [name] and [signature].
@@ -311,47 +318,54 @@
   }) {
     if (releaseOriginal) {
       _jClass?.release();
-      final ret = type.fromRef(reference);
-      setAsReleased();
+      final ret = type.fromRef(reference.pointer);
+      reference.setAsReleased();
       return ret;
     }
-    final newRef = Jni.env.NewGlobalRef(reference);
+    final newRef = Jni.env.NewGlobalRef(reference.pointer);
     return type.fromRef(newRef);
   }
 
   static final _objectClass = Jni.findJClass('java/lang/Object');
 
-  static final _hashCodeId =
-      Jni.accessors.getMethodIDOf(_objectClass.reference, r"hashCode", r"()I");
+  static final _hashCodeId = Jni.accessors
+      .getMethodIDOf(_objectClass.reference.pointer, r"hashCode", r"()I");
   @override
   int get hashCode => Jni.accessors.callMethodWithArgs(
-      reference, _hashCodeId, JniCallType.intType, []).integer;
+      reference.pointer, _hashCodeId, JniCallType.intType, []).integer;
 
   static final _equalsId = Jni.accessors.getMethodIDOf(
-      _objectClass.reference, r"equals", r"(Ljava/lang/Object;)Z");
+      _objectClass.reference.pointer, r"equals", r"(Ljava/lang/Object;)Z");
   @override
   bool operator ==(Object other) {
     if (other is! JObject) {
       return false;
     }
-    return Jni.accessors.callMethodWithArgs(reference, _equalsId,
-        JniCallType.booleanType, [other.reference]).boolean;
+    return Jni.accessors.callMethodWithArgs(reference.pointer, _equalsId,
+        JniCallType.booleanType, [other.reference.pointer]).boolean;
   }
 
   static final _toStringId = Jni.accessors.getMethodIDOf(
-      _objectClass.reference, r"toString", r"()Ljava/lang/String;");
+      _objectClass.reference.pointer, r"toString", r"()Ljava/lang/String;");
   @override
   String toString() {
     return JString.fromRef(Jni.accessors.callMethodWithArgs(
-            reference, _toStringId, JniCallType.objectType, []).object)
+            reference.pointer, _toStringId, JniCallType.objectType, []).object)
         .toDartString(releaseOriginal: true);
   }
+
+  bool get isReleased => reference.isReleased;
+
+  /// Registers this object to be released at the end of [arena]'s lifetime.
+  void releasedBy(Arena arena) => arena.onReleaseAll(release);
 }
 
 /// A high level wrapper over a JNI class reference.
-class JClass extends JReference {
-  /// Construct a new [JClass] with [reference] as its underlying reference.
-  JClass.fromRef(JObjectPtr reference) : super.fromRef(reference);
+class JClass {
+  final JReference reference;
+
+  /// Construct a new [JClass] with [ref] as its underlying reference.
+  JClass.fromRef(JObjectPtr ref) : reference = JGlobalReference(ref);
 
   /// Get [JFieldIDPtr] of static field [fieldName] with [signature].
   JFieldIDPtr getStaticFieldID(String fieldName, String signature) {
@@ -387,8 +401,8 @@
     if (callType == JniCallType.voidType) {
       throw ArgumentError("void is not a valid field type.");
     }
-    return _getField<T>(
-        callType, (ct) => Jni.accessors.getStaticField(reference, fieldID, ct));
+    return _getField<T>(callType,
+        (ct) => Jni.accessors.getStaticField(reference.pointer, fieldID, ct));
   }
 
   /// Get the value of static field identified by [name] and [signature].
@@ -408,8 +422,8 @@
     return _callMethod<T>(
         callType,
         args,
-        (ct, jvs) =>
-            Jni.accessors.callStaticMethod(reference, methodID, ct, jvs));
+        (ct, jvs) => Jni.accessors
+            .callStaticMethod(reference.pointer, methodID, ct, jvs));
   }
 
   /// Call the static method identified by [name] and [signature].
@@ -424,8 +438,44 @@
   /// Create a new instance of this class with [ctor] and [args].
   JObject newInstance(JMethodIDPtr ctor, List<dynamic> args) => using((arena) {
         final jArgs = JValueArgs(args, arena);
-        final res =
-            Jni.accessors.newObject(reference, ctor, jArgs.values).object;
+        final res = Jni.accessors
+            .newObject(reference.pointer, ctor, jArgs.values)
+            .object;
         return JObject.fromRef(res);
       });
+
+  bool get isReleased => reference.isReleased;
+
+  void release() {
+    reference.release();
+  }
+
+  /// Registers this object to be released at the end of [arena]'s lifetime.
+  void releasedBy(Arena arena) => arena.onReleaseAll(release);
+}
+
+extension JObjectUseExtension<T extends JObject> on T {
+  /// Applies [callback] on [this] object and then delete the underlying JNI
+  /// reference, returning the result of [callback].
+  R use<R>(R Function(T) callback) {
+    try {
+      final result = callback(this);
+      return result;
+    } finally {
+      release();
+    }
+  }
+}
+
+extension JClassUseExtension<T extends JClass> on T {
+  /// Applies [callback] on [this] object and then delete the underlying JNI
+  /// reference, returning the result of [callback].
+  R use<R>(R Function(T) callback) {
+    try {
+      final result = callback(this);
+      return result;
+    } finally {
+      release();
+    }
+  }
 }
diff --git a/pkgs/jni/lib/src/jreference.dart b/pkgs/jni/lib/src/jreference.dart
index 8d8b71d..38dad2d 100644
--- a/pkgs/jni/lib/src/jreference.dart
+++ b/pkgs/jni/lib/src/jreference.dart
@@ -4,7 +4,6 @@
 
 import 'dart:ffi';
 
-import 'package:ffi/ffi.dart';
 import 'package:jni/src/third_party/generated_bindings.dart';
 
 import 'errors.dart';
@@ -16,7 +15,7 @@
       throw DoubleReleaseError();
     }
     _released = true;
-    JReference._finalizer.detach(this);
+    JGlobalReference._finalizer.detach(this);
   }
 
   void ensureNotNull() {
@@ -25,34 +24,38 @@
     }
   }
 
-  /// Similar to [reference].
+  /// Similar to [pointer].
   ///
   /// Detaches the finalizer so the underlying pointer will not be deleted.
   JObjectPtr toPointer() {
     setAsReleased();
-    return _reference;
+    return _pointer;
   }
 }
 
-/// A managed JNI global reference.
-///
-/// Uses a [NativeFinalizer] to delete the JNI global reference when finalized.
-abstract class JReference implements Finalizable {
-  static final _finalizer =
-      NativeFinalizer(Jni.env.ptr.ref.DeleteGlobalRef.cast());
-
-  JReference.fromRef(this._reference) {
-    _finalizer.attach(this, _reference, detach: this);
-  }
-
+sealed class JReference {
+  final JObjectPtr _pointer;
   bool _released = false;
 
-  /// Whether the underlying JNI reference is `null` or not.
-  bool get isNull => reference == nullptr;
+  JReference(this._pointer);
+
+  /// The underlying JNI reference.
+  ///
+  /// Throws [UseAfterReleaseError] if the object is previously released.
+  ///
+  /// Be careful when storing this in a variable since it might have gotten
+  /// released upon use.
+  JObjectPtr get pointer {
+    if (_released) throw UseAfterReleaseError();
+    return _pointer;
+  }
 
   /// Whether the underlying JNI reference is deleted or not.
   bool get isReleased => _released;
 
+  /// Whether the underlying JNI reference is `null` or not.
+  bool get isNull;
+
   /// Deletes the underlying JNI reference and marks this as released.
   ///
   /// Throws [DoubleReleaseError] if this is already released.
@@ -60,35 +63,28 @@
   /// Further uses of this object will throw [UseAfterReleaseError].
   void release() {
     setAsReleased();
-    Jni.env.DeleteGlobalRef(_reference);
+    _deleteReference();
   }
 
-  /// The underlying JNI global object reference.
-  ///
-  /// Throws [UseAfterReleaseError] if the object is previously released.
-  ///
-  /// Be careful when storing this in a variable since it might have gotten
-  /// released upon use.
-  JObjectPtr get reference {
-    if (_released) throw UseAfterReleaseError();
-    return _reference;
-  }
-
-  final JObjectPtr _reference;
-
-  /// Registers this object to be released at the end of [arena]'s lifetime.
-  void releasedBy(Arena arena) => arena.onReleaseAll(release);
+  void _deleteReference();
 }
 
-extension JReferenceUseExtension<T extends JReference> on T {
-  /// Applies [callback] on [this] object and then delete the underlying JNI
-  /// reference, returning the result of [callback].
-  R use<R>(R Function(T) callback) {
-    try {
-      final result = callback(this);
-      return result;
-    } finally {
-      release();
-    }
+/// A managed JNI global reference.
+///
+/// Uses a [NativeFinalizer] to delete the JNI global reference when finalized.
+class JGlobalReference extends JReference implements Finalizable {
+  static final _finalizer =
+      NativeFinalizer(Jni.env.ptr.ref.DeleteGlobalRef.cast());
+
+  JGlobalReference(super._reference) {
+    _finalizer.attach(this, _pointer, detach: this);
+  }
+
+  @override
+  bool get isNull => pointer == nullptr;
+
+  @override
+  void _deleteReference() {
+    Jni.env.DeleteGlobalRef(_pointer);
   }
 }
diff --git a/pkgs/jni/lib/src/jvalues.dart b/pkgs/jni/lib/src/jvalues.dart
index ce8f273..f21382c 100644
--- a/pkgs/jni/lib/src/jvalues.dart
+++ b/pkgs/jni/lib/src/jvalues.dart
@@ -11,7 +11,7 @@
 
 void _fillJValue(Pointer<JValue> pos, dynamic arg) {
   if (arg is JObject) {
-    pos.ref.l = arg.reference;
+    pos.ref.l = arg.reference.pointer;
     return;
   }
 
diff --git a/pkgs/jni/lib/src/lang/jboolean.dart b/pkgs/jni/lib/src/lang/jboolean.dart
index 9ea92b4..8072329 100644
--- a/pkgs/jni/lib/src/lang/jboolean.dart
+++ b/pkgs/jni/lib/src/lang/jboolean.dart
@@ -48,18 +48,18 @@
   static final _class = Jni.findJClass(r"java/lang/Boolean");
 
   static final _ctorId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"(Z)V");
+      Jni.accessors.getMethodIDOf(_class.reference.pointer, r"<init>", r"(Z)V");
   JBoolean(bool boolean)
       : super.fromRef(Jni.accessors.newObjectWithArgs(
-            _class.reference, _ctorId, [boolean ? 1 : 0]).object);
+            _class.reference.pointer, _ctorId, [boolean ? 1 : 0]).object);
 
-  static final _booleanValueId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"booleanValue", r"()Z");
+  static final _booleanValueId = Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"booleanValue", r"()Z");
 
   bool booleanValue({bool releaseOriginal = false}) {
-    ensureNotNull();
-    final ret = Jni.accessors.callMethodWithArgs(
-        reference, _booleanValueId, JniCallType.booleanType, []).boolean;
+    reference.ensureNotNull();
+    final ret = Jni.accessors.callMethodWithArgs(reference.pointer,
+        _booleanValueId, JniCallType.booleanType, []).boolean;
     if (releaseOriginal) {
       release();
     }
diff --git a/pkgs/jni/lib/src/lang/jbyte.dart b/pkgs/jni/lib/src/lang/jbyte.dart
index 6b5aa98..b560c92 100644
--- a/pkgs/jni/lib/src/lang/jbyte.dart
+++ b/pkgs/jni/lib/src/lang/jbyte.dart
@@ -48,8 +48,8 @@
   static final _class = Jni.findJClass(r"java/lang/Byte");
 
   static final _ctorId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"(B)V");
+      Jni.accessors.getMethodIDOf(_class.reference.pointer, r"<init>", r"(B)V");
   JByte(int num)
       : super.fromRef(Jni.accessors.newObjectWithArgs(
-            _class.reference, _ctorId, [JValueByte(num)]).object);
+            _class.reference.pointer, _ctorId, [JValueByte(num)]).object);
 }
diff --git a/pkgs/jni/lib/src/lang/jcharacter.dart b/pkgs/jni/lib/src/lang/jcharacter.dart
index b50f67f..9ba7fac 100644
--- a/pkgs/jni/lib/src/lang/jcharacter.dart
+++ b/pkgs/jni/lib/src/lang/jcharacter.dart
@@ -45,19 +45,19 @@
   static final _class = Jni.findJClass(r"java/lang/Character");
 
   static final _ctorId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"(C)V");
+      Jni.accessors.getMethodIDOf(_class.reference.pointer, r"<init>", r"(C)V");
 
   JCharacter(int c)
       : super.fromRef(Jni.accessors.newObjectWithArgs(
-            _class.reference, _ctorId, [JValueChar(c)]).object);
+            _class.reference.pointer, _ctorId, [JValueChar(c)]).object);
 
-  static final _charValueId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"charValue", r"()C");
+  static final _charValueId = Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"charValue", r"()C");
 
   int charValue({bool releaseOriginal = false}) {
-    ensureNotNull();
+    reference.ensureNotNull();
     final ret = Jni.accessors.callMethodWithArgs(
-        reference, _charValueId, JniCallType.charType, []).char;
+        reference.pointer, _charValueId, JniCallType.charType, []).char;
     if (releaseOriginal) {
       release();
     }
diff --git a/pkgs/jni/lib/src/lang/jdouble.dart b/pkgs/jni/lib/src/lang/jdouble.dart
index 6db163e..ef74762 100644
--- a/pkgs/jni/lib/src/lang/jdouble.dart
+++ b/pkgs/jni/lib/src/lang/jdouble.dart
@@ -47,8 +47,8 @@
   static final _class = Jni.findJClass(r"java/lang/Double");
 
   static final _ctorId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"(D)V");
+      Jni.accessors.getMethodIDOf(_class.reference.pointer, r"<init>", r"(D)V");
   JDouble(double num)
-      : super.fromRef(Jni.accessors
-            .newObjectWithArgs(_class.reference, _ctorId, [num]).object);
+      : super.fromRef(Jni.accessors.newObjectWithArgs(
+            _class.reference.pointer, _ctorId, [num]).object);
 }
diff --git a/pkgs/jni/lib/src/lang/jfloat.dart b/pkgs/jni/lib/src/lang/jfloat.dart
index a352659..a4389fb 100644
--- a/pkgs/jni/lib/src/lang/jfloat.dart
+++ b/pkgs/jni/lib/src/lang/jfloat.dart
@@ -48,9 +48,9 @@
   static final _class = Jni.findJClass(r"java/lang/Float");
 
   static final _ctorId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"(F)V");
+      Jni.accessors.getMethodIDOf(_class.reference.pointer, r"<init>", r"(F)V");
 
   JFloat(double num)
       : super.fromRef(Jni.accessors.newObjectWithArgs(
-            _class.reference, _ctorId, [JValueFloat(num)]).object);
+            _class.reference.pointer, _ctorId, [JValueFloat(num)]).object);
 }
diff --git a/pkgs/jni/lib/src/lang/jinteger.dart b/pkgs/jni/lib/src/lang/jinteger.dart
index 8ece466..834ed25 100644
--- a/pkgs/jni/lib/src/lang/jinteger.dart
+++ b/pkgs/jni/lib/src/lang/jinteger.dart
@@ -48,9 +48,9 @@
   static final _class = Jni.findJClass(r"java/lang/Integer");
 
   static final _ctorId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"(I)V");
+      Jni.accessors.getMethodIDOf(_class.reference.pointer, r"<init>", r"(I)V");
 
   JInteger(int num)
       : super.fromRef(Jni.accessors.newObjectWithArgs(
-            _class.reference, _ctorId, [JValueInt(num)]).object);
+            _class.reference.pointer, _ctorId, [JValueInt(num)]).object);
 }
diff --git a/pkgs/jni/lib/src/lang/jlong.dart b/pkgs/jni/lib/src/lang/jlong.dart
index 66d054b..4014675 100644
--- a/pkgs/jni/lib/src/lang/jlong.dart
+++ b/pkgs/jni/lib/src/lang/jlong.dart
@@ -47,9 +47,9 @@
   static final _class = Jni.findJClass(r"java/lang/Long");
 
   static final _ctorId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"(J)V");
+      Jni.accessors.getMethodIDOf(_class.reference.pointer, r"<init>", r"(J)V");
 
   JLong(int num)
-      : super.fromRef(Jni.accessors
-            .newObjectWithArgs(_class.reference, _ctorId, [num]).object);
+      : super.fromRef(Jni.accessors.newObjectWithArgs(
+            _class.reference.pointer, _ctorId, [num]).object);
 }
diff --git a/pkgs/jni/lib/src/lang/jnumber.dart b/pkgs/jni/lib/src/lang/jnumber.dart
index 45d86dc..98fa98b 100644
--- a/pkgs/jni/lib/src/lang/jnumber.dart
+++ b/pkgs/jni/lib/src/lang/jnumber.dart
@@ -55,84 +55,84 @@
   /// The type which includes information such as the signature of this class.
   static const type = JNumberType();
   static final _ctorId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"()V");
+      Jni.accessors.getMethodIDOf(_class.reference.pointer, r"<init>", r"()V");
 
   JNumber()
       : super.fromRef(Jni.accessors
-            .newObjectWithArgs(_class.reference, _ctorId, []).object);
+            .newObjectWithArgs(_class.reference.pointer, _ctorId, []).object);
 
-  static final _intValueId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"intValue", r"()I");
+  static final _intValueId = Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"intValue", r"()I");
 
   int intValue({bool releaseOriginal = false}) {
-    ensureNotNull();
+    reference.ensureNotNull();
     final ret = Jni.accessors.callMethodWithArgs(
-        reference, _intValueId, JniCallType.intType, []).integer;
+        reference.pointer, _intValueId, JniCallType.intType, []).integer;
     if (releaseOriginal) {
       release();
     }
     return ret;
   }
 
-  static final _longValueId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"longValue", r"()J");
+  static final _longValueId = Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"longValue", r"()J");
 
   int longValue({bool releaseOriginal = false}) {
-    ensureNotNull();
+    reference.ensureNotNull();
     final ret = Jni.accessors.callMethodWithArgs(
-        reference, _longValueId, JniCallType.longType, []).long;
+        reference.pointer, _longValueId, JniCallType.longType, []).long;
     if (releaseOriginal) {
       release();
     }
     return ret;
   }
 
-  static final _floatValueId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"floatValue", r"()F");
+  static final _floatValueId = Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"floatValue", r"()F");
 
   double floatValue({bool releaseOriginal = false}) {
-    ensureNotNull();
+    reference.ensureNotNull();
     final ret = Jni.accessors.callMethodWithArgs(
-        reference, _floatValueId, JniCallType.floatType, []).float;
+        reference.pointer, _floatValueId, JniCallType.floatType, []).float;
     if (releaseOriginal) {
       release();
     }
     return ret;
   }
 
-  static final _doubleValueId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"doubleValue", r"()D");
+  static final _doubleValueId = Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"doubleValue", r"()D");
 
   double doubleValue({bool releaseOriginal = false}) {
-    ensureNotNull();
-    final ret = Jni.accessors.callMethodWithArgs(
-        reference, _doubleValueId, JniCallType.doubleType, []).doubleFloat;
+    reference.ensureNotNull();
+    final ret = Jni.accessors.callMethodWithArgs(reference.pointer,
+        _doubleValueId, JniCallType.doubleType, []).doubleFloat;
     if (releaseOriginal) {
       release();
     }
     return ret;
   }
 
-  static final _byteValueId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"byteValue", r"()B");
+  static final _byteValueId = Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"byteValue", r"()B");
 
   int byteValue({bool releaseOriginal = false}) {
-    ensureNotNull();
+    reference.ensureNotNull();
     final ret = Jni.accessors.callMethodWithArgs(
-        reference, _byteValueId, JniCallType.byteType, []).byte;
+        reference.pointer, _byteValueId, JniCallType.byteType, []).byte;
     if (releaseOriginal) {
       release();
     }
     return ret;
   }
 
-  static final _shortValueId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"shortValue", r"()S");
+  static final _shortValueId = Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"shortValue", r"()S");
 
   int shortValue({bool releaseOriginal = false}) {
-    ensureNotNull();
+    reference.ensureNotNull();
     final ret = Jni.accessors.callMethodWithArgs(
-        reference, _shortValueId, JniCallType.shortType, []).short;
+        reference.pointer, _shortValueId, JniCallType.shortType, []).short;
     if (releaseOriginal) {
       release();
     }
diff --git a/pkgs/jni/lib/src/lang/jshort.dart b/pkgs/jni/lib/src/lang/jshort.dart
index 39d3c1d..dbaf0a4 100644
--- a/pkgs/jni/lib/src/lang/jshort.dart
+++ b/pkgs/jni/lib/src/lang/jshort.dart
@@ -48,9 +48,9 @@
   static final _class = Jni.findJClass(r"java/lang/Short");
 
   static final _ctorId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"(S)V");
+      Jni.accessors.getMethodIDOf(_class.reference.pointer, r"<init>", r"(S)V");
 
   JShort(int num)
       : super.fromRef(Jni.accessors.newObjectWithArgs(
-            _class.reference, _ctorId, [JValueShort(num)]).object);
+            _class.reference.pointer, _ctorId, [JValueShort(num)]).object);
 }
diff --git a/pkgs/jni/lib/src/lang/jstring.dart b/pkgs/jni/lib/src/lang/jstring.dart
index 9b8fbbb..aa7a165 100644
--- a/pkgs/jni/lib/src/lang/jstring.dart
+++ b/pkgs/jni/lib/src/lang/jstring.dart
@@ -47,7 +47,7 @@
   JString.fromRef(JStringPtr reference) : super.fromRef(reference);
 
   /// The number of Unicode characters in this Java string.
-  int get length => Jni.env.GetStringLength(reference);
+  int get length => Jni.env.GetStringLength(reference.pointer);
 
   /// Construct a [JString] from the contents of Dart string [s].
   JString.fromString(String s) : super.fromRef(Jni.env.toJStringPtr(s));
@@ -57,8 +57,8 @@
   /// If [releaseOriginal] is true, the underlying reference is deleted
   /// after conversion and this object will be marked as released.
   String toDartString({bool releaseOriginal = false}) {
-    ensureNotNull();
-    final result = Jni.env.toDartString(reference);
+    reference.ensureNotNull();
+    final result = Jni.env.toDartString(reference.pointer);
     if (releaseOriginal) {
       release();
     }
diff --git a/pkgs/jni/lib/src/nio/jbuffer.dart b/pkgs/jni/lib/src/nio/jbuffer.dart
index cae6bc9..e665465 100644
--- a/pkgs/jni/lib/src/nio/jbuffer.dart
+++ b/pkgs/jni/lib/src/nio/jbuffer.dart
@@ -58,63 +58,63 @@
   /// The type which includes information such as the signature of this class.
   static const type = JBufferType();
 
-  static final _capacityId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"capacity", r"()I");
+  static final _capacityId = Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"capacity", r"()I");
 
   /// The number of elements this buffer contains.
   ///
   /// It is never negative and never changes.
   int get capacity {
     return Jni.accessors.callMethodWithArgs(
-        reference, _capacityId, JniCallType.intType, []).integer;
+        reference.pointer, _capacityId, JniCallType.intType, []).integer;
   }
 
-  static final _positionId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"position", r"()I");
+  static final _positionId = Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"position", r"()I");
 
   /// The index of the next element to be read or written.
   ///
   /// It is never negative and is never greater than its [limit].
   int get position {
     return Jni.accessors.callMethodWithArgs(
-        reference, _positionId, JniCallType.intType, []).integer;
+        reference.pointer, _positionId, JniCallType.intType, []).integer;
   }
 
-  static final _setPositionId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"position", r"(I)Ljava/nio/Buffer;");
+  static final _setPositionId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"position", r"(I)Ljava/nio/Buffer;");
 
   /// Throws:
   /// * [IllegalArgumentException] - If the preconditions on [newPosition] do
   ///   not hold.
   set position(int position) {
-    Jni.env.DeleteGlobalRef(Jni.accessors.callMethodWithArgs(reference,
+    Jni.env.DeleteGlobalRef(Jni.accessors.callMethodWithArgs(reference.pointer,
         _setPositionId, JniCallType.objectType, [JValueInt(position)]).object);
   }
 
   static final _limitId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"limit", r"()I");
+      Jni.accessors.getMethodIDOf(_class.reference.pointer, r"limit", r"()I");
 
   /// The index of the first element that should not be read or written.
   ///
   /// It is never negative and is never greater than its [capacity].
   int get limit {
     return Jni.accessors.callMethodWithArgs(
-        reference, _limitId, JniCallType.intType, []).integer;
+        reference.pointer, _limitId, JniCallType.intType, []).integer;
   }
 
-  static final _setLimitId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"limit", r"(I)Ljava/nio/Buffer;");
+  static final _setLimitId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"limit", r"(I)Ljava/nio/Buffer;");
 
   /// Throws:
   /// * [IllegalArgumentException] - If the preconditions on [newLimit] do not
   ///   hold.
   set limit(int newLimit) {
-    Jni.env.DeleteGlobalRef(Jni.accessors.callMethodWithArgs(reference,
+    Jni.env.DeleteGlobalRef(Jni.accessors.callMethodWithArgs(reference.pointer,
         _setLimitId, JniCallType.objectType, [JValueInt(newLimit)]).object);
   }
 
   static final _markId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"mark", r"()Ljava/nio/Buffer;");
+      .getMethodIDOf(_class.reference.pointer, r"mark", r"()Ljava/nio/Buffer;");
 
   /// Sets this buffer's mark at its [position].
   ///
@@ -122,11 +122,11 @@
   /// method is invoked.
   void mark() {
     Jni.env.DeleteGlobalRef(Jni.accessors.callMethodWithArgs(
-        reference, _markId, JniCallType.objectType, []).object);
+        reference.pointer, _markId, JniCallType.objectType, []).object);
   }
 
-  static final _resetId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"reset", r"()Ljava/nio/Buffer;");
+  static final _resetId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"reset", r"()Ljava/nio/Buffer;");
 
   /// Resets this buffer's [position] to the previously-marked position.
   ///
@@ -134,11 +134,11 @@
   /// * [InvalidMarkException] - If the mark has not been set
   void reset() {
     Jni.env.DeleteGlobalRef(Jni.accessors.callMethodWithArgs(
-        reference, _resetId, JniCallType.objectType, []).object);
+        reference.pointer, _resetId, JniCallType.objectType, []).object);
   }
 
-  static final _clearId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"clear", r"()Ljava/nio/Buffer;");
+  static final _clearId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"clear", r"()Ljava/nio/Buffer;");
 
   /// Clears this buffer.
   ///
@@ -146,11 +146,11 @@
   /// the [capacity], and the mark is discarded.
   void clear() {
     Jni.env.DeleteGlobalRef(Jni.accessors.callMethodWithArgs(
-        reference, _clearId, JniCallType.objectType, []).object);
+        reference.pointer, _clearId, JniCallType.objectType, []).object);
   }
 
   static final _flipId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"flip", r"()Ljava/nio/Buffer;");
+      .getMethodIDOf(_class.reference.pointer, r"flip", r"()Ljava/nio/Buffer;");
 
   /// Flips this buffer.
   ///
@@ -158,60 +158,60 @@
   /// to zero. If the mark is defined then it is discarded.
   void flip() {
     Jni.env.DeleteGlobalRef(Jni.accessors.callMethodWithArgs(
-        reference, _flipId, JniCallType.objectType, []).object);
+        reference.pointer, _flipId, JniCallType.objectType, []).object);
   }
 
-  static final _rewindId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"rewind", r"()Ljava/nio/Buffer;");
+  static final _rewindId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"rewind", r"()Ljava/nio/Buffer;");
 
   /// Rewinds this buffer.
   ///
   /// The [position] is set to zero and the mark is discarded.
   void rewind() {
     Jni.env.DeleteGlobalRef(Jni.accessors.callMethodWithArgs(
-        reference, _rewindId, JniCallType.objectType, []).object);
+        reference.pointer, _rewindId, JniCallType.objectType, []).object);
   }
 
-  static final _remainingId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"remaining", r"()I");
+  static final _remainingId = Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"remaining", r"()I");
 
   /// The number of elements between the current [position] and the
   /// [limit].
   int get remaining {
     return Jni.accessors.callMethodWithArgs(
-        reference, _remainingId, JniCallType.intType, []).integer;
+        reference.pointer, _remainingId, JniCallType.intType, []).integer;
   }
 
-  static final _hasRemainingId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"hasRemaining", r"()Z");
+  static final _hasRemainingId = Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"hasRemaining", r"()Z");
 
   /// Whether there are any elements between the current [position] and
   /// the [limit].
   bool get hasRemaining {
-    return Jni.accessors.callMethodWithArgs(
-        reference, _hasRemainingId, JniCallType.booleanType, []).boolean;
+    return Jni.accessors.callMethodWithArgs(reference.pointer, _hasRemainingId,
+        JniCallType.booleanType, []).boolean;
   }
 
-  static final _isReadOnlyId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"isReadOnly", r"()Z");
+  static final _isReadOnlyId = Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"isReadOnly", r"()Z");
 
   /// Whether or not this buffer is read-only.
   bool get isReadOnly {
     return Jni.accessors.callMethodWithArgs(
-        reference, _isReadOnlyId, JniCallType.booleanType, []).boolean;
+        reference.pointer, _isReadOnlyId, JniCallType.booleanType, []).boolean;
   }
 
-  static final _hasArrayId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"hasArray", r"()Z");
+  static final _hasArrayId = Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"hasArray", r"()Z");
 
   /// Whether or not this buffer is backed by an accessible array.
   bool get hasArray {
     return Jni.accessors.callMethodWithArgs(
-        reference, _hasArrayId, JniCallType.booleanType, []).boolean;
+        reference.pointer, _hasArrayId, JniCallType.booleanType, []).boolean;
   }
 
-  static final _arrayId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"array", r"()Ljava/lang/Object;");
+  static final _arrayId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"array", r"()Ljava/lang/Object;");
 
   /// The array that backs this buffer.
   ///
@@ -225,11 +225,11 @@
   ///   accessible array
   JObject get array {
     return const JObjectType().fromRef(Jni.accessors.callMethodWithArgs(
-        reference, _arrayId, JniCallType.objectType, []).object);
+        reference.pointer, _arrayId, JniCallType.objectType, []).object);
   }
 
-  static final _arrayOffsetId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"arrayOffset", r"()I");
+  static final _arrayOffsetId = Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"arrayOffset", r"()I");
 
   /// The offset within this buffer's backing array of the first element
   /// of the buffer.
@@ -241,15 +241,15 @@
   ///   accessible array
   int get arrayOffset {
     return Jni.accessors.callMethodWithArgs(
-        reference, _arrayOffsetId, JniCallType.intType, []).integer;
+        reference.pointer, _arrayOffsetId, JniCallType.intType, []).integer;
   }
 
-  static final _isDirectId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"isDirect", r"()Z");
+  static final _isDirectId = Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"isDirect", r"()Z");
 
   /// Whether or not this buffer is direct.
   bool get isDirect {
     return Jni.accessors.callMethodWithArgs(
-        reference, _isDirectId, JniCallType.booleanType, []).boolean;
+        reference.pointer, _isDirectId, JniCallType.booleanType, []).boolean;
   }
 }
diff --git a/pkgs/jni/lib/src/nio/jbyte_buffer.dart b/pkgs/jni/lib/src/nio/jbyte_buffer.dart
index d5f5488..d100039 100644
--- a/pkgs/jni/lib/src/nio/jbyte_buffer.dart
+++ b/pkgs/jni/lib/src/nio/jbyte_buffer.dart
@@ -102,7 +102,7 @@
   static const type = JByteBufferType();
 
   static final _allocateDirectId = Jni.accessors.getStaticMethodIDOf(
-      _class.reference, r"allocateDirect", r"(I)Ljava/nio/ByteBuffer;");
+      _class.reference.pointer, r"allocateDirect", r"(I)Ljava/nio/ByteBuffer;");
 
   /// Allocates a new direct byte buffer.
   ///
@@ -111,7 +111,7 @@
   factory JByteBuffer.allocateDirect(int capacity) {
     return JByteBuffer.fromRef(
       Jni.accessors.callStaticMethodWithArgs(
-          _class.reference,
+          _class.reference.pointer,
           _allocateDirectId,
           JniCallType.objectType,
           [JValueInt(capacity)]).object,
@@ -119,7 +119,7 @@
   }
 
   static final _allocateId = Jni.accessors.getStaticMethodIDOf(
-      _class.reference, r"allocate", r"(I)Ljava/nio/ByteBuffer;");
+      _class.reference.pointer, r"allocate", r"(I)Ljava/nio/ByteBuffer;");
 
   /// Allocates a new byte buffer.
   ///
@@ -127,14 +127,14 @@
   /// * [IllegalArgumentException] - If the capacity is a negative integer
   factory JByteBuffer.allocate(int capacity) {
     return const JByteBufferType().fromRef(Jni.accessors
-        .callStaticMethodWithArgs(_class.reference, _allocateId,
+        .callStaticMethodWithArgs(_class.reference.pointer, _allocateId,
             JniCallType.objectType, [JValueInt(capacity)]).object);
   }
 
   static final _wrapWholeId = Jni.accessors.getStaticMethodIDOf(
-      _class.reference, r"wrap", r"([B)Ljava/nio/ByteBuffer;");
+      _class.reference.pointer, r"wrap", r"([B)Ljava/nio/ByteBuffer;");
   static final _wrapId = Jni.accessors.getStaticMethodIDOf(
-      _class.reference, r"wrap", r"([BII)Ljava/nio/ByteBuffer;");
+      _class.reference.pointer, r"wrap", r"([BII)Ljava/nio/ByteBuffer;");
 
   /// Wraps a byte array into a buffer.
   ///
@@ -149,10 +149,10 @@
     if (offset == null && length == null) {
       return const JByteBufferType().fromRef(
         Jni.accessors.callStaticMethodWithArgs(
-          _class.reference,
+          _class.reference.pointer,
           _wrapWholeId,
           JniCallType.objectType,
-          [array.reference],
+          [array.reference.pointer],
         ).object,
       );
     }
@@ -160,10 +160,10 @@
     length ??= array.length - offset;
     return const JByteBufferType().fromRef(
       Jni.accessors.callStaticMethodWithArgs(
-        _class.reference,
+        _class.reference.pointer,
         _wrapId,
         JniCallType.objectType,
-        [array.reference, JValueInt(offset), JValueInt(length)],
+        [array.reference.pointer, JValueInt(offset), JValueInt(length)],
       ).object,
     );
   }
@@ -177,36 +177,40 @@
     return buffer;
   }
 
-  static final _sliceId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"slice", r"()Ljava/nio/ByteBuffer;");
+  static final _sliceId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"slice", r"()Ljava/nio/ByteBuffer;");
 
   /// Creates a new byte buffer whose content is a shared subsequence of this
   /// buffer's content.
   JByteBuffer slice() {
     return const JByteBufferType().fromRef(Jni.accessors.callMethodWithArgs(
-        reference, _sliceId, JniCallType.objectType, []).object);
+        reference.pointer, _sliceId, JniCallType.objectType, []).object);
   }
 
   static final _duplicateId = Jni.accessors.getMethodIDOf(
-      _class.reference, r"duplicate", r"()Ljava/nio/ByteBuffer;");
+      _class.reference.pointer, r"duplicate", r"()Ljava/nio/ByteBuffer;");
 
   /// Creates a new byte buffer that shares this buffer's content.
   JByteBuffer duplicate() {
     return const JByteBufferType().fromRef(Jni.accessors.callMethodWithArgs(
-        reference, _duplicateId, JniCallType.objectType, []).object);
+        reference.pointer, _duplicateId, JniCallType.objectType, []).object);
   }
 
   static final _asReadOnlyBufferId = Jni.accessors.getMethodIDOf(
-      _class.reference, r"asReadOnlyBuffer", r"()Ljava/nio/ByteBuffer;");
+      _class.reference.pointer,
+      r"asReadOnlyBuffer",
+      r"()Ljava/nio/ByteBuffer;");
 
   /// Creates a new, read-only byte buffer that shares this buffer's content.
   JByteBuffer asReadOnlyBuffer() {
     return const JByteBufferType().fromRef(Jni.accessors.callMethodWithArgs(
-        reference, _asReadOnlyBufferId, JniCallType.objectType, []).object);
+        reference.pointer,
+        _asReadOnlyBufferId,
+        JniCallType.objectType, []).object);
   }
 
   static final _getId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"get", r"()B");
+      Jni.accessors.getMethodIDOf(_class.reference.pointer, r"get", r"()B");
 
   /// Reads the byte at this buffer's current [position], and then increments the
   /// [position].
@@ -215,12 +219,12 @@
   ///  * [BufferOverflowException] - If the buffer's current [position] is not
   ///    smaller than its [limit]
   int get nextByte {
-    return Jni.accessors
-        .callMethodWithArgs(reference, _getId, JniCallType.byteType, []).byte;
+    return Jni.accessors.callMethodWithArgs(
+        reference.pointer, _getId, JniCallType.byteType, []).byte;
   }
 
-  static final _putId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"put", r"(B)Ljava/nio/ByteBuffer;");
+  static final _putId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"put", r"(B)Ljava/nio/ByteBuffer;");
 
   /// Writes the given byte into this buffer at the current [position], and then
   /// increments the [position].
@@ -230,18 +234,18 @@
   ///   smaller than its [limit]
   /// * [ReadOnlyBufferException] - If this buffer is read-only
   set nextByte(int b) {
-    Jni.env.DeleteGlobalRef(Jni.accessors.callMethodWithArgs(
-        reference, _putId, JniCallType.objectType, [JValueByte(b)]).object);
+    Jni.env.DeleteGlobalRef(Jni.accessors.callMethodWithArgs(reference.pointer,
+        _putId, JniCallType.objectType, [JValueByte(b)]).object);
   }
 
   static final _arrayId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"array", r"()[B");
+      Jni.accessors.getMethodIDOf(_class.reference.pointer, r"array", r"()[B");
 
   @override
   JArray<jbyte> get array {
     return const JArrayType(jbyteType()).fromRef(Jni.accessors
         .callMethodWithArgs(
-            reference, _arrayId, JniCallType.objectType, []).object);
+            reference.pointer, _arrayId, JniCallType.objectType, []).object);
   }
 
   void _ensureIsDirect() {
@@ -253,7 +257,7 @@
   }
 
   Pointer<Void> _directBufferAddress() {
-    final address = Jni.env.GetDirectBufferAddress(reference);
+    final address = Jni.env.GetDirectBufferAddress(reference.pointer);
     if (address == nullptr) {
       throw StateError(
         'The memory region is undefined or '
@@ -264,7 +268,7 @@
   }
 
   int _directBufferCapacity() {
-    final capacity = Jni.env.GetDirectBufferCapacity(reference);
+    final capacity = Jni.env.GetDirectBufferCapacity(reference.pointer);
     if (capacity == -1) {
       throw StateError(
         'The object is an unaligned view buffer and the processor '
@@ -293,9 +297,11 @@
     _ensureIsDirect();
     final address = _directBufferAddress();
     final capacity = _directBufferCapacity();
-    final token = releaseOriginal ? reference : Jni.env.NewGlobalRef(reference);
+    final token = releaseOriginal
+        ? reference.pointer
+        : Jni.env.NewGlobalRef(reference.pointer);
     if (releaseOriginal) {
-      setAsReleased();
+      reference.setAsReleased();
     }
     return address.cast<Uint8>().asTypedList(
           capacity,
diff --git a/pkgs/jni/lib/src/util/jiterator.dart b/pkgs/jni/lib/src/util/jiterator.dart
index 0d0122f..c9861af 100644
--- a/pkgs/jni/lib/src/util/jiterator.dart
+++ b/pkgs/jni/lib/src/util/jiterator.dart
@@ -67,17 +67,17 @@
   $E get current => _current as $E;
 
   static final _hasNextId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"hasNext", r"()Z");
+      Jni.accessors.getMethodIDOf(_class.reference.pointer, r"hasNext", r"()Z");
   bool _hasNext() {
     return Jni.accessors.callMethodWithArgs(
-        reference, _hasNextId, JniCallType.booleanType, []).boolean;
+        reference.pointer, _hasNextId, JniCallType.booleanType, []).boolean;
   }
 
-  static final _nextId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"next", r"()Ljava/lang/Object;");
+  static final _nextId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"next", r"()Ljava/lang/Object;");
   $E _next() {
     return E.fromRef(Jni.accessors.callMethodWithArgs(
-        reference, _nextId, JniCallType.objectType, []).object);
+        reference.pointer, _nextId, JniCallType.objectType, []).object);
   }
 
   @override
diff --git a/pkgs/jni/lib/src/util/jlist.dart b/pkgs/jni/lib/src/util/jlist.dart
index 9779032..bb99c1c 100644
--- a/pkgs/jni/lib/src/util/jlist.dart
+++ b/pkgs/jni/lib/src/util/jlist.dart
@@ -68,16 +68,16 @@
 
   static final _arrayListClassRef = Jni.findJClass(r"java/util/ArrayList");
   static final _ctorId = Jni.accessors
-      .getMethodIDOf(_arrayListClassRef.reference, r"<init>", r"()V");
+      .getMethodIDOf(_arrayListClassRef.reference.pointer, r"<init>", r"()V");
   JList.array(this.E)
       : super.fromRef(Jni.accessors.newObjectWithArgs(
-            _arrayListClassRef.reference, _ctorId, []).object);
+            _arrayListClassRef.reference.pointer, _ctorId, []).object);
 
   static final _sizeId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"size", r"()I");
+      Jni.accessors.getMethodIDOf(_class.reference.pointer, r"size", r"()I");
   @override
-  int get length => Jni.accessors
-      .callMethodWithArgs(reference, _sizeId, JniCallType.intType, []).integer;
+  int get length => Jni.accessors.callMethodWithArgs(
+      reference.pointer, _sizeId, JniCallType.intType, []).integer;
 
   @override
   set length(int newLength) {
@@ -90,113 +90,122 @@
     }
   }
 
-  static final _getId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"get", r"(I)Ljava/lang/Object;");
+  static final _getId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"get", r"(I)Ljava/lang/Object;");
   @override
   $E operator [](int index) {
     RangeError.checkValidIndex(index, this);
-    return E.fromRef(Jni.accessors.callMethodWithArgs(
-        reference, _getId, JniCallType.objectType, [JValueInt(index)]).object);
+    return E.fromRef(Jni.accessors.callMethodWithArgs(reference.pointer, _getId,
+        JniCallType.objectType, [JValueInt(index)]).object);
   }
 
-  static final _setId = Jni.accessors.getMethodIDOf(
-      _class.reference, r"set", r"(ILjava/lang/Object;)Ljava/lang/Object;");
+  static final _setId = Jni.accessors.getMethodIDOf(_class.reference.pointer,
+      r"set", r"(ILjava/lang/Object;)Ljava/lang/Object;");
   @override
   void operator []=(int index, $E value) {
     RangeError.checkValidIndex(index, this);
-    E.fromRef(Jni.accessors.callMethodWithArgs(reference, _setId,
-        JniCallType.objectType, [JValueInt(index), value.reference]).object);
+    E.fromRef(Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _setId,
+        JniCallType.objectType,
+        [JValueInt(index), value.reference.pointer]).object);
   }
 
-  static final _addId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"add", r"(Ljava/lang/Object;)Z");
+  static final _addId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"add", r"(Ljava/lang/Object;)Z");
   @override
   void add($E element) {
-    Jni.accessors.callMethodWithArgs(reference, _addId, JniCallType.booleanType,
-        [element.reference]).check();
+    Jni.accessors.callMethodWithArgs(reference.pointer, _addId,
+        JniCallType.booleanType, [element.reference.pointer]).check();
   }
 
   static final _collectionClass = Jni.findJClass("java/util/Collection");
-  static final _addAllId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"addAll", r"(Ljava/util/Collection;)Z");
+  static final _addAllId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"addAll", r"(Ljava/util/Collection;)Z");
   @override
   void addAll(Iterable<$E> iterable) {
     if (iterable is JObject &&
-        Jni.env.IsInstanceOf(
-            (iterable as JObject).reference, _collectionClass.reference)) {
-      Jni.accessors.callMethodWithArgs(reference, _addAllId,
-          JniCallType.booleanType, [(iterable as JObject).reference]).boolean;
+        Jni.env.IsInstanceOf((iterable as JObject).reference.pointer,
+            _collectionClass.reference.pointer)) {
+      Jni.accessors.callMethodWithArgs(
+          reference.pointer,
+          _addAllId,
+          JniCallType.booleanType,
+          [(iterable as JObject).reference.pointer]).boolean;
       return;
     }
     return super.addAll(iterable);
   }
 
   static final _clearId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"clear", r"()V");
+      Jni.accessors.getMethodIDOf(_class.reference.pointer, r"clear", r"()V");
   @override
   void clear() {
     Jni.accessors.callMethodWithArgs(
-        reference, _clearId, JniCallType.voidType, []).check();
+        reference.pointer, _clearId, JniCallType.voidType, []).check();
   }
 
-  static final _containsId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"contains", r"(Ljava/lang/Object;)Z");
+  static final _containsId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"contains", r"(Ljava/lang/Object;)Z");
   @override
   bool contains(Object? element) {
     if (element is! JObject) return false;
-    return Jni.accessors.callMethodWithArgs(reference, _containsId,
-        JniCallType.booleanType, [element.reference]).boolean;
+    return Jni.accessors.callMethodWithArgs(reference.pointer, _containsId,
+        JniCallType.booleanType, [element.reference.pointer]).boolean;
   }
 
-  static final _getRangeId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"subList", r"(II)Ljava/util/List;");
+  static final _getRangeId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"subList", r"(II)Ljava/util/List;");
   @override
   JList<$E> getRange(int start, int end) {
     RangeError.checkValidRange(start, end, this.length);
     return JListType(E).fromRef(
-      Jni.accessors.callMethodWithArgs(reference, _getRangeId,
+      Jni.accessors.callMethodWithArgs(reference.pointer, _getRangeId,
           JniCallType.objectType, [JValueInt(start), JValueInt(end)]).object,
     );
   }
 
-  static final _indexOfId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"indexOf", r"(Ljava/lang/Object;)I");
+  static final _indexOfId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"indexOf", r"(Ljava/lang/Object;)I");
   @override
   int indexOf(Object? element, [int start = 0]) {
     if (element is! JObject) return -1;
     if (start < 0) start = 0;
     if (start == 0) {
-      return Jni.accessors.callMethodWithArgs(reference, _indexOfId,
-          JniCallType.intType, [element.reference]).integer;
+      return Jni.accessors.callMethodWithArgs(reference.pointer, _indexOfId,
+          JniCallType.intType, [element.reference.pointer]).integer;
     }
     return Jni.accessors.callMethodWithArgs(
-      getRange(start, length).reference,
+      getRange(start, length).reference.pointer,
       _indexOfId,
       JniCallType.intType,
-      [element.reference],
+      [element.reference.pointer],
     ).integer;
   }
 
-  static final _insertId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"add", r"(ILjava/lang/Object;)V");
+  static final _insertId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"add", r"(ILjava/lang/Object;)V");
   @override
   void insert(int index, $E element) {
-    Jni.accessors.callMethodWithArgs(reference, _insertId, JniCallType.voidType,
-        [JValueInt(index), element.reference]).check();
+    Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _insertId,
+        JniCallType.voidType,
+        [JValueInt(index), element.reference.pointer]).check();
   }
 
   static final _insertAllId = Jni.accessors.getMethodIDOf(
-      _class.reference, r"addAll", r"(ILjava/util/Collection;)Z");
+      _class.reference.pointer, r"addAll", r"(ILjava/util/Collection;)Z");
   @override
   void insertAll(int index, Iterable<$E> iterable) {
     if (iterable is JObject &&
-        Jni.env.IsInstanceOf(
-            (iterable as JObject).reference, _collectionClass.reference)) {
+        Jni.env.IsInstanceOf((iterable as JObject).reference.pointer,
+            _collectionClass.reference.pointer)) {
       Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _insertAllId,
         JniCallType.booleanType,
-        [JValueInt(index), (iterable as JObject).reference],
+        [JValueInt(index), (iterable as JObject).reference.pointer],
       ).boolean;
       return;
     }
@@ -204,57 +213,57 @@
   }
 
   static final _isEmptyId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"isEmpty", r"()Z");
+      Jni.accessors.getMethodIDOf(_class.reference.pointer, r"isEmpty", r"()Z");
   @override
   bool get isEmpty => Jni.accessors.callMethodWithArgs(
-      reference, _isEmptyId, JniCallType.booleanType, []).boolean;
+      reference.pointer, _isEmptyId, JniCallType.booleanType, []).boolean;
 
   @override
   bool get isNotEmpty => !isEmpty;
 
-  static final _iteratorId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"iterator", r"()Ljava/util/Iterator;");
+  static final _iteratorId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"iterator", r"()Ljava/util/Iterator;");
   @override
   JIterator<$E> get iterator =>
       JIteratorType(E).fromRef(Jni.accessors.callMethodWithArgs(
-          reference, _iteratorId, JniCallType.objectType, []).object);
+          reference.pointer, _iteratorId, JniCallType.objectType, []).object);
 
   static final _lastIndexOfId = Jni.accessors.getMethodIDOf(
-      _class.reference, r"lastIndexOf", r"(Ljava/lang/Object;)I");
+      _class.reference.pointer, r"lastIndexOf", r"(Ljava/lang/Object;)I");
   @override
   int lastIndexOf(Object? element, [int? start]) {
     if (element is! JObject) return -1;
     if (start == null || start >= this.length) start = this.length - 1;
     if (start == this.length - 1) {
-      return Jni.accessors.callMethodWithArgs(reference, _lastIndexOfId,
-          JniCallType.intType, [element.reference]).integer;
+      return Jni.accessors.callMethodWithArgs(reference.pointer, _lastIndexOfId,
+          JniCallType.intType, [element.reference.pointer]).integer;
     }
     final range = getRange(start, length);
     final res = Jni.accessors.callMethodWithArgs(
-      range.reference,
+      range.reference.pointer,
       _lastIndexOfId,
       JniCallType.intType,
-      [element.reference],
+      [element.reference.pointer],
     ).integer;
     range.release();
     return res;
   }
 
-  static final _removeId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"remove", r"(Ljava/lang/Object;)Z");
+  static final _removeId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"remove", r"(Ljava/lang/Object;)Z");
   @override
   bool remove(Object? element) {
     if (element is! JObject) return false;
-    return Jni.accessors.callMethodWithArgs(reference, _removeId,
-        JniCallType.booleanType, [element.reference]).boolean;
+    return Jni.accessors.callMethodWithArgs(reference.pointer, _removeId,
+        JniCallType.booleanType, [element.reference.pointer]).boolean;
   }
 
-  static final _removeAtId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"remove", r"(I)Ljava/lang/Object;");
+  static final _removeAtId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"remove", r"(I)Ljava/lang/Object;");
   @override
   $E removeAt(int index) {
-    return E.fromRef(Jni.accessors.callMethodWithArgs(reference, _removeAtId,
-        JniCallType.objectType, [JValueInt(index)]).object);
+    return E.fromRef(Jni.accessors.callMethodWithArgs(reference.pointer,
+        _removeAtId, JniCallType.objectType, [JValueInt(index)]).object);
   }
 
   @override
diff --git a/pkgs/jni/lib/src/util/jmap.dart b/pkgs/jni/lib/src/util/jmap.dart
index 73a6d62..cc95b31 100644
--- a/pkgs/jni/lib/src/util/jmap.dart
+++ b/pkgs/jni/lib/src/util/jmap.dart
@@ -74,104 +74,107 @@
   }
 
   static final _hashMapClass = Jni.findJClass(r"java/util/HashMap");
-  static final _ctorId =
-      Jni.accessors.getMethodIDOf(_hashMapClass.reference, r"<init>", r"()V");
+  static final _ctorId = Jni.accessors
+      .getMethodIDOf(_hashMapClass.reference.pointer, r"<init>", r"()V");
   JMap.hash(this.K, this.V)
-      : super.fromRef(Jni.accessors
-            .newObjectWithArgs(_hashMapClass.reference, _ctorId, []).object);
+      : super.fromRef(Jni.accessors.newObjectWithArgs(
+            _hashMapClass.reference.pointer, _ctorId, []).object);
 
-  static final _getId = Jni.accessors.getMethodIDOf(
-      _class.reference, r"get", r"(Ljava/lang/Object;)Ljava/lang/Object;");
+  static final _getId = Jni.accessors.getMethodIDOf(_class.reference.pointer,
+      r"get", r"(Ljava/lang/Object;)Ljava/lang/Object;");
   @override
   $V? operator [](Object? key) {
     if (key is! JObject) {
       return null;
     }
-    final value = V.fromRef(Jni.accessors.callMethodWithArgs(
-        reference, _getId, JniCallType.objectType, [key.reference]).object);
+    final value = V.fromRef(Jni.accessors.callMethodWithArgs(reference.pointer,
+        _getId, JniCallType.objectType, [key.reference.pointer]).object);
     return value.isNull ? null : value;
   }
 
-  static final _putId = Jni.accessors.getMethodIDOf(_class.reference, r"put",
-      r"(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
+  static final _putId = Jni.accessors.getMethodIDOf(_class.reference.pointer,
+      r"put", r"(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
   @override
   void operator []=($K key, $V value) {
-    Jni.accessors.callMethodWithArgs(reference, _putId, JniCallType.objectType,
-        [key.reference, value.reference]).object;
+    Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _putId,
+        JniCallType.objectType,
+        [key.reference.pointer, value.reference.pointer]).object;
   }
 
-  static final _addAllId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"putAll", r"(Ljava/util/Map;)V");
+  static final _addAllId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"putAll", r"(Ljava/util/Map;)V");
   @override
   void addAll(Map<$K, $V> other) {
     if (other is JMap<$K, $V>) {
-      Jni.accessors.callMethodWithArgs(reference, _addAllId,
-          JniCallType.voidType, [other.reference]).check();
+      Jni.accessors.callMethodWithArgs(reference.pointer, _addAllId,
+          JniCallType.voidType, [other.reference.pointer]).check();
       return;
     }
     super.addAll(other);
   }
 
   static final _clearId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"clear", r"()V");
+      Jni.accessors.getMethodIDOf(_class.reference.pointer, r"clear", r"()V");
   @override
   void clear() {
     Jni.accessors.callMethodWithArgs(
-        reference, _clearId, JniCallType.voidType, []).check();
+        reference.pointer, _clearId, JniCallType.voidType, []).check();
   }
 
   static final _containsKeyId = Jni.accessors.getMethodIDOf(
-      _class.reference, r"containsKey", r"(Ljava/lang/Object;)Z");
+      _class.reference.pointer, r"containsKey", r"(Ljava/lang/Object;)Z");
   @override
   bool containsKey(Object? key) {
     if (key is! JObject) {
       return false;
     }
-    return Jni.accessors.callMethodWithArgs(reference, _containsKeyId,
-        JniCallType.booleanType, [key.reference]).boolean;
+    return Jni.accessors.callMethodWithArgs(reference.pointer, _containsKeyId,
+        JniCallType.booleanType, [key.reference.pointer]).boolean;
   }
 
   static final _containsValueId = Jni.accessors.getMethodIDOf(
-      _class.reference, r"containsValue", r"(Ljava/lang/Object;)Z");
+      _class.reference.pointer, r"containsValue", r"(Ljava/lang/Object;)Z");
   @override
   bool containsValue(Object? value) {
     if (value is! JObject) {
       return false;
     }
-    return Jni.accessors.callMethodWithArgs(reference, _containsValueId,
-        JniCallType.booleanType, [value.reference]).boolean;
+    return Jni.accessors.callMethodWithArgs(reference.pointer, _containsValueId,
+        JniCallType.booleanType, [value.reference.pointer]).boolean;
   }
 
   static final isEmptyId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"isEmpty", r"()Z");
+      Jni.accessors.getMethodIDOf(_class.reference.pointer, r"isEmpty", r"()Z");
   @override
   bool get isEmpty => Jni.accessors.callMethodWithArgs(
-      reference, isEmptyId, JniCallType.booleanType, []).boolean;
+      reference.pointer, isEmptyId, JniCallType.booleanType, []).boolean;
 
   @override
   bool get isNotEmpty => !isEmpty;
 
   static final _keysId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"keySet", r"()Ljava/util/Set;");
+      .getMethodIDOf(_class.reference.pointer, r"keySet", r"()Ljava/util/Set;");
   @override
   JSet<$K> get keys => JSetType(K).fromRef(Jni.accessors.callMethodWithArgs(
-      reference, _keysId, JniCallType.objectType, []).object);
+      reference.pointer, _keysId, JniCallType.objectType, []).object);
 
   static final _sizeId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"size", r"()I");
+      Jni.accessors.getMethodIDOf(_class.reference.pointer, r"size", r"()I");
   @override
-  int get length => Jni.accessors
-      .callMethodWithArgs(reference, _sizeId, JniCallType.intType, []).integer;
+  int get length => Jni.accessors.callMethodWithArgs(
+      reference.pointer, _sizeId, JniCallType.intType, []).integer;
 
-  static final _removeId = Jni.accessors.getMethodIDOf(
-      _class.reference, r"remove", r"(Ljava/lang/Object;)Ljava/lang/Object;");
+  static final _removeId = Jni.accessors.getMethodIDOf(_class.reference.pointer,
+      r"remove", r"(Ljava/lang/Object;)Ljava/lang/Object;");
   @override
   $V? remove(Object? key) {
     if (key is! JObject) {
       return null;
     }
-    final value = V.fromRef(Jni.accessors.callMethodWithArgs(
-        reference, _removeId, JniCallType.objectType, [key.reference]).object);
+    final value = V.fromRef(Jni.accessors.callMethodWithArgs(reference.pointer,
+        _removeId, JniCallType.objectType, [key.reference.pointer]).object);
     return value.isNull ? null : value;
   }
 }
diff --git a/pkgs/jni/lib/src/util/jset.dart b/pkgs/jni/lib/src/util/jset.dart
index df51003..021de60 100644
--- a/pkgs/jni/lib/src/util/jset.dart
+++ b/pkgs/jni/lib/src/util/jset.dart
@@ -66,32 +66,32 @@
   }
 
   static final _hashSetClass = Jni.findJClass(r"java/util/HashSet");
-  static final _ctorId =
-      Jni.accessors.getMethodIDOf(_hashSetClass.reference, r"<init>", r"()V");
+  static final _ctorId = Jni.accessors
+      .getMethodIDOf(_hashSetClass.reference.pointer, r"<init>", r"()V");
   JSet.hash(this.E)
-      : super.fromRef(Jni.accessors
-            .newObjectWithArgs(_hashSetClass.reference, _ctorId, []).object);
+      : super.fromRef(Jni.accessors.newObjectWithArgs(
+            _hashSetClass.reference.pointer, _ctorId, []).object);
 
-  static final _addId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"add", r"(Ljava/lang/Object;)Z");
+  static final _addId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"add", r"(Ljava/lang/Object;)Z");
   @override
   bool add($E value) {
-    return Jni.accessors.callMethodWithArgs(
-        reference, _addId, JniCallType.booleanType, [value.reference]).boolean;
+    return Jni.accessors.callMethodWithArgs(reference.pointer, _addId,
+        JniCallType.booleanType, [value.reference.pointer]).boolean;
   }
 
-  static final _addAllId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"addAll", r"(Ljava/util/Collection;)Z");
+  static final _addAllId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"addAll", r"(Ljava/util/Collection;)Z");
   @override
   void addAll(Iterable<$E> elements) {
     if (elements is JObject &&
-        Jni.env.IsInstanceOf(
-            (elements as JObject).reference, _collectionClass.reference)) {
+        Jni.env.IsInstanceOf((elements as JObject).reference.pointer,
+            _collectionClass.reference.pointer)) {
       Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _addAllId,
         JniCallType.booleanType,
-        [(elements as JObject).reference],
+        [(elements as JObject).reference.pointer],
       ).boolean;
       return;
     }
@@ -99,95 +99,104 @@
   }
 
   static final _clearId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"clear", r"()V");
+      Jni.accessors.getMethodIDOf(_class.reference.pointer, r"clear", r"()V");
   @override
   void clear() {
     return Jni.accessors.callMethodWithArgs(
-        reference, _clearId, JniCallType.voidType, []).check();
+        reference.pointer, _clearId, JniCallType.voidType, []).check();
   }
 
-  static final _containsId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"contains", r"(Ljava/lang/Object;)Z");
+  static final _containsId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"contains", r"(Ljava/lang/Object;)Z");
 
   @override
   bool contains(Object? element) {
     if (element is! JObject) {
       return false;
     }
-    return Jni.accessors.callMethodWithArgs(reference, _containsId,
-        JniCallType.booleanType, [element.reference]).boolean;
+    return Jni.accessors.callMethodWithArgs(reference.pointer, _containsId,
+        JniCallType.booleanType, [element.reference.pointer]).boolean;
   }
 
   static final _containsAllId = Jni.accessors.getMethodIDOf(
-      _class.reference, r"containsAll", r"(Ljava/util/Collection;)Z");
+      _class.reference.pointer, r"containsAll", r"(Ljava/util/Collection;)Z");
   static final _collectionClass = Jni.findJClass("java/util/Collection");
   @override
   bool containsAll(Iterable<Object?> other) {
     if (other is JObject &&
-        Jni.env.IsInstanceOf(
-            (other as JObject).reference, _collectionClass.reference)) {
-      return Jni.accessors.callMethodWithArgs(reference, _containsAllId,
-          JniCallType.booleanType, [(other as JObject).reference]).boolean;
+        Jni.env.IsInstanceOf((other as JObject).reference.pointer,
+            _collectionClass.reference.pointer)) {
+      return Jni.accessors.callMethodWithArgs(
+          reference.pointer,
+          _containsAllId,
+          JniCallType.booleanType,
+          [(other as JObject).reference.pointer]).boolean;
     }
     return super.containsAll(other);
   }
 
   static final _isEmptyId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"isEmpty", r"()Z");
+      Jni.accessors.getMethodIDOf(_class.reference.pointer, r"isEmpty", r"()Z");
   @override
   bool get isEmpty => Jni.accessors.callMethodWithArgs(
-      reference, _isEmptyId, JniCallType.booleanType, []).boolean;
+      reference.pointer, _isEmptyId, JniCallType.booleanType, []).boolean;
 
   @override
   bool get isNotEmpty => !isEmpty;
 
-  static final _iteratorId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"iterator", r"()Ljava/util/Iterator;");
+  static final _iteratorId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"iterator", r"()Ljava/util/Iterator;");
   @override
   JIterator<$E> get iterator =>
       JIteratorType(E).fromRef(Jni.accessors.callMethodWithArgs(
-          reference, _iteratorId, JniCallType.objectType, []).object);
+          reference.pointer, _iteratorId, JniCallType.objectType, []).object);
 
   static final _sizeId =
-      Jni.accessors.getMethodIDOf(_class.reference, r"size", r"()I");
+      Jni.accessors.getMethodIDOf(_class.reference.pointer, r"size", r"()I");
   @override
-  int get length => Jni.accessors
-      .callMethodWithArgs(reference, _sizeId, JniCallType.intType, []).integer;
+  int get length => Jni.accessors.callMethodWithArgs(
+      reference.pointer, _sizeId, JniCallType.intType, []).integer;
 
-  static final _removeId = Jni.accessors
-      .getMethodIDOf(_class.reference, r"remove", r"(Ljava/lang/Object;)Z");
+  static final _removeId = Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"remove", r"(Ljava/lang/Object;)Z");
   @override
   bool remove(Object? value) {
     if (value is! $E) {
       return false;
     }
-    return Jni.accessors.callMethodWithArgs(reference, _removeId,
-        JniCallType.booleanType, [value.reference]).boolean;
+    return Jni.accessors.callMethodWithArgs(reference.pointer, _removeId,
+        JniCallType.booleanType, [value.reference.pointer]).boolean;
   }
 
   static final _removeAllId = Jni.accessors.getMethodIDOf(
-      _class.reference, r"removeAll", r"(Ljava/util/Collection;)Z");
+      _class.reference.pointer, r"removeAll", r"(Ljava/util/Collection;)Z");
   @override
   void removeAll(Iterable<Object?> elements) {
     if (elements is JObject &&
-        Jni.env.IsInstanceOf(
-            (elements as JObject).reference, _collectionClass.reference)) {
-      Jni.accessors.callMethodWithArgs(reference, _removeAllId,
-          JniCallType.booleanType, [(elements as JObject).reference]).boolean;
+        Jni.env.IsInstanceOf((elements as JObject).reference.pointer,
+            _collectionClass.reference.pointer)) {
+      Jni.accessors.callMethodWithArgs(
+          reference.pointer,
+          _removeAllId,
+          JniCallType.booleanType,
+          [(elements as JObject).reference.pointer]).boolean;
       return;
     }
     return super.removeAll(elements);
   }
 
   static final _retainAllId = Jni.accessors.getMethodIDOf(
-      _class.reference, r"retainAll", r"(Ljava/util/Collection;)Z");
+      _class.reference.pointer, r"retainAll", r"(Ljava/util/Collection;)Z");
   @override
   void retainAll(Iterable<Object?> elements) {
     if (elements is JObject &&
-        Jni.env.IsInstanceOf(
-            (elements as JObject).reference, _collectionClass.reference)) {
-      Jni.accessors.callMethodWithArgs(reference, _retainAllId,
-          JniCallType.booleanType, [(elements as JObject).reference]).boolean;
+        Jni.env.IsInstanceOf((elements as JObject).reference.pointer,
+            _collectionClass.reference.pointer)) {
+      Jni.accessors.callMethodWithArgs(
+          reference.pointer,
+          _retainAllId,
+          JniCallType.booleanType,
+          [(elements as JObject).reference.pointer]).boolean;
       return;
     }
     return super.retainAll(elements);
diff --git a/pkgs/jni/test/jarray_test.dart b/pkgs/jni/test/jarray_test.dart
index 064bc84..43d6e5d 100644
--- a/pkgs/jni/test/jarray_test.dart
+++ b/pkgs/jni/test/jarray_test.dart
@@ -259,9 +259,9 @@
     using((arena) {
       final array = JArray(JObject.type, 3)..releasedBy(arena);
       expect(array.length, 3);
-      expect(array[0].reference, nullptr);
-      expect(array[1].reference, nullptr);
-      expect(array[2].reference, nullptr);
+      expect(array[0].reference.pointer, nullptr);
+      expect(array[1].reference.pointer, nullptr);
+      expect(array[2].reference.pointer, nullptr);
     });
   });
   testRunner("Java 2d array", () {
diff --git a/pkgs/jni/test/load_test.dart b/pkgs/jni/test/load_test.dart
index d74a5fc..ff25bc3 100644
--- a/pkgs/jni/test/load_test.dart
+++ b/pkgs/jni/test/load_test.dart
@@ -121,7 +121,7 @@
         isA<int>(),
       );
       expect(
-        Jni.env.GetObjectRefType(random.reference),
+        Jni.env.GetObjectRefType(random.reference.pointer),
         equals(JObjectRefType.JNIGlobalRefType),
       );
     });
diff --git a/pkgs/jnigen/example/in_app_java/lib/android_utils.dart b/pkgs/jnigen/example/in_app_java/lib/android_utils.dart
index 0be99f7..d47f3a1 100644
--- a/pkgs/jnigen/example/in_app_java/lib/android_utils.dart
+++ b/pkgs/jnigen/example/in_app_java/lib/android_utils.dart
@@ -99,7 +99,8 @@
   factory EmojiCompat_Config(
     EmojiCompat_MetadataRepoLoader metadataLoader,
   ) {
-    return EmojiCompat_Config.fromRef(_new0(metadataLoader.reference).object);
+    return EmojiCompat_Config.fromRef(
+        _new0(metadataLoader.reference.pointer).object);
   }
 
   static final _registerInitCallback = jniLookup<
@@ -121,7 +122,8 @@
     EmojiCompat_InitCallback initCallback,
   ) {
     return const $EmojiCompat_ConfigType().fromRef(
-        _registerInitCallback(reference, initCallback.reference).object);
+        _registerInitCallback(reference.pointer, initCallback.reference.pointer)
+            .object);
   }
 
   static final _unregisterInitCallback = jniLookup<
@@ -142,8 +144,9 @@
   EmojiCompat_Config unregisterInitCallback(
     EmojiCompat_InitCallback initCallback,
   ) {
-    return const $EmojiCompat_ConfigType().fromRef(
-        _unregisterInitCallback(reference, initCallback.reference).object);
+    return const $EmojiCompat_ConfigType().fromRef(_unregisterInitCallback(
+            reference.pointer, initCallback.reference.pointer)
+        .object);
   }
 
   static final _setReplaceAll = jniLookup<
@@ -164,7 +167,7 @@
     bool replaceAll,
   ) {
     return const $EmojiCompat_ConfigType()
-        .fromRef(_setReplaceAll(reference, replaceAll ? 1 : 0).object);
+        .fromRef(_setReplaceAll(reference.pointer, replaceAll ? 1 : 0).object);
   }
 
   static final _setUseEmojiAsDefaultStyle = jniLookup<
@@ -191,9 +194,9 @@
   EmojiCompat_Config setUseEmojiAsDefaultStyle(
     bool useEmojiAsDefaultStyle,
   ) {
-    return const $EmojiCompat_ConfigType().fromRef(
-        _setUseEmojiAsDefaultStyle(reference, useEmojiAsDefaultStyle ? 1 : 0)
-            .object);
+    return const $EmojiCompat_ConfigType().fromRef(_setUseEmojiAsDefaultStyle(
+            reference.pointer, useEmojiAsDefaultStyle ? 1 : 0)
+        .object);
   }
 
   static final _setUseEmojiAsDefaultStyle1 = jniLookup<
@@ -225,9 +228,9 @@
     jni.JList<jni.JInteger> emojiAsDefaultStyleExceptions,
   ) {
     return const $EmojiCompat_ConfigType().fromRef(_setUseEmojiAsDefaultStyle1(
-            reference,
+            reference.pointer,
             useEmojiAsDefaultStyle ? 1 : 0,
-            emojiAsDefaultStyleExceptions.reference)
+            emojiAsDefaultStyleExceptions.reference.pointer)
         .object);
   }
 
@@ -250,7 +253,7 @@
   ) {
     return const $EmojiCompat_ConfigType().fromRef(
         _setEmojiSpanIndicatorEnabled(
-                reference, emojiSpanIndicatorEnabled ? 1 : 0)
+                reference.pointer, emojiSpanIndicatorEnabled ? 1 : 0)
             .object);
   }
 
@@ -270,7 +273,7 @@
     int color,
   ) {
     return const $EmojiCompat_ConfigType()
-        .fromRef(_setEmojiSpanIndicatorColor(reference, color).object);
+        .fromRef(_setEmojiSpanIndicatorColor(reference.pointer, color).object);
   }
 
   static final _setMetadataLoadStrategy = jniLookup<
@@ -318,7 +321,7 @@
     int strategy,
   ) {
     return const $EmojiCompat_ConfigType()
-        .fromRef(_setMetadataLoadStrategy(reference, strategy).object);
+        .fromRef(_setMetadataLoadStrategy(reference.pointer, strategy).object);
   }
 
   static final _setSpanFactory = jniLookup<
@@ -338,8 +341,8 @@
   EmojiCompat_Config setSpanFactory(
     EmojiCompat_SpanFactory factory0,
   ) {
-    return const $EmojiCompat_ConfigType()
-        .fromRef(_setSpanFactory(reference, factory0.reference).object);
+    return const $EmojiCompat_ConfigType().fromRef(
+        _setSpanFactory(reference.pointer, factory0.reference.pointer).object);
   }
 
   static final _setGlyphChecker = jniLookup<
@@ -360,8 +363,9 @@
   EmojiCompat_Config setGlyphChecker(
     EmojiCompat_GlyphChecker glyphChecker,
   ) {
-    return const $EmojiCompat_ConfigType()
-        .fromRef(_setGlyphChecker(reference, glyphChecker.reference).object);
+    return const $EmojiCompat_ConfigType().fromRef(
+        _setGlyphChecker(reference.pointer, glyphChecker.reference.pointer)
+            .object);
   }
 
   static final _getMetadataRepoLoader = jniLookup<
@@ -376,7 +380,7 @@
   /// Returns the MetadataRepoLoader.
   EmojiCompat_MetadataRepoLoader getMetadataRepoLoader() {
     return const $EmojiCompat_MetadataRepoLoaderType()
-        .fromRef(_getMetadataRepoLoader(reference).object);
+        .fromRef(_getMetadataRepoLoader(reference.pointer).object);
   }
 }
 
@@ -448,8 +452,8 @@
   jni.JObject createSpan(
     jni.JObject rasterizer,
   ) {
-    return const jni.JObjectType()
-        .fromRef(_createSpan(reference, rasterizer.reference).object);
+    return const jni.JObjectType().fromRef(
+        _createSpan(reference.pointer, rasterizer.reference.pointer).object);
   }
 }
 
@@ -549,7 +553,8 @@
     int end,
     int sdkAdded,
   ) {
-    return _hasGlyph(reference, charSequence.reference, start, end, sdkAdded)
+    return _hasGlyph(reference.pointer, charSequence.reference.pointer, start,
+            end, sdkAdded)
         .boolean;
   }
 }
@@ -615,7 +620,7 @@
   /// Called when EmojiCompat is initialized and the emoji data is loaded. When used on devices
   /// running API 18 or below, this function is always called.
   void onInitialized() {
-    return _onInitialized(reference).check();
+    return _onInitialized(reference.pointer).check();
   }
 
   static final _onFailed = jniLookup<
@@ -633,7 +638,7 @@
   void onFailed(
     jni.JObject throwable,
   ) {
-    return _onFailed(reference, throwable.reference).check();
+    return _onFailed(reference.pointer, throwable.reference.pointer).check();
   }
 }
 
@@ -735,7 +740,7 @@
   void load(
     EmojiCompat_MetadataRepoLoaderCallback loaderCallback,
   ) {
-    return _load(reference, loaderCallback.reference).check();
+    return _load(reference.pointer, loaderCallback.reference.pointer).check();
   }
 }
 
@@ -807,7 +812,7 @@
   void onLoaded(
     jni.JObject metadataRepo,
   ) {
-    return _onLoaded(reference, metadataRepo.reference).check();
+    return _onLoaded(reference.pointer, metadataRepo.reference.pointer).check();
   }
 
   static final _onFailed = jniLookup<
@@ -826,7 +831,7 @@
   void onFailed(
     jni.JObject throwable,
   ) {
-    return _onFailed(reference, throwable.reference).check();
+    return _onFailed(reference.pointer, throwable.reference.pointer).check();
   }
 }
 
@@ -935,8 +940,8 @@
   jni.JObject createSpan(
     jni.JObject rasterizer,
   ) {
-    return const jni.JObjectType()
-        .fromRef(_createSpan(reference, rasterizer.reference).object);
+    return const jni.JObjectType().fromRef(
+        _createSpan(reference.pointer, rasterizer.reference.pointer).object);
   }
 }
 
@@ -1247,7 +1252,8 @@
   static EmojiCompat init(
     jni.JObject context,
   ) {
-    return const $EmojiCompatType().fromRef(_init(context.reference).object);
+    return const $EmojiCompatType()
+        .fromRef(_init(context.reference.pointer).object);
   }
 
   static final _init1 = jniLookup<
@@ -1266,8 +1272,9 @@
     jni.JObject context,
     DefaultEmojiCompatConfig_DefaultEmojiCompatConfigFactory defaultFactory,
   ) {
-    return const $EmojiCompatType()
-        .fromRef(_init1(context.reference, defaultFactory.reference).object);
+    return const $EmojiCompatType().fromRef(
+        _init1(context.reference.pointer, defaultFactory.reference.pointer)
+            .object);
   }
 
   static final _init2 = jniLookup<
@@ -1288,7 +1295,8 @@
   static EmojiCompat init2(
     EmojiCompat_Config config,
   ) {
-    return const $EmojiCompatType().fromRef(_init2(config.reference).object);
+    return const $EmojiCompatType()
+        .fromRef(_init2(config.reference.pointer).object);
   }
 
   static final _isConfigured =
@@ -1326,7 +1334,8 @@
   static EmojiCompat reset(
     EmojiCompat_Config config,
   ) {
-    return const $EmojiCompatType().fromRef(_reset(config.reference).object);
+    return const $EmojiCompatType()
+        .fromRef(_reset(config.reference.pointer).object);
   }
 
   static final _reset1 = jniLookup<
@@ -1344,7 +1353,7 @@
     EmojiCompat emojiCompat,
   ) {
     return const $EmojiCompatType()
-        .fromRef(_reset1(emojiCompat.reference).object);
+        .fromRef(_reset1(emojiCompat.reference.pointer).object);
   }
 
   static final _skipDefaultConfigurationLookup =
@@ -1399,7 +1408,7 @@
   ///@throws IllegalStateException when Config\#setMetadataLoadStrategy(int) is not set
   /// to \#LOAD_STRATEGY_MANUAL
   void load() {
-    return _load(reference).check();
+    return _load(reference.pointer).check();
   }
 
   static final _registerInitCallback = jniLookup<
@@ -1424,7 +1433,9 @@
   void registerInitCallback(
     EmojiCompat_InitCallback initCallback,
   ) {
-    return _registerInitCallback(reference, initCallback.reference).check();
+    return _registerInitCallback(
+            reference.pointer, initCallback.reference.pointer)
+        .check();
   }
 
   static final _unregisterInitCallback = jniLookup<
@@ -1443,7 +1454,9 @@
   void unregisterInitCallback(
     EmojiCompat_InitCallback initCallback,
   ) {
-    return _unregisterInitCallback(reference, initCallback.reference).check();
+    return _unregisterInitCallback(
+            reference.pointer, initCallback.reference.pointer)
+        .check();
   }
 
   static final _getLoadState = jniLookup<
@@ -1459,7 +1472,7 @@
   ///@return one of \#LOAD_STATE_DEFAULT, \#LOAD_STATE_LOADING,
   /// \#LOAD_STATE_SUCCEEDED, \#LOAD_STATE_FAILED
   int getLoadState() {
-    return _getLoadState(reference).integer;
+    return _getLoadState(reference.pointer).integer;
   }
 
   static final _isEmojiSpanIndicatorEnabled = jniLookup<
@@ -1473,7 +1486,7 @@
   /// @return whether a background should be drawn for the emoji for debugging
   ///@hide
   bool isEmojiSpanIndicatorEnabled() {
-    return _isEmojiSpanIndicatorEnabled(reference).boolean;
+    return _isEmojiSpanIndicatorEnabled(reference.pointer).boolean;
   }
 
   static final _getEmojiSpanIndicatorColor = jniLookup<
@@ -1487,7 +1500,7 @@
   /// @return color of background drawn if EmojiCompat\#isEmojiSpanIndicatorEnabled is true
   ///@hide
   int getEmojiSpanIndicatorColor() {
-    return _getEmojiSpanIndicatorColor(reference).integer;
+    return _getEmojiSpanIndicatorColor(reference.pointer).integer;
   }
 
   static final _getEmojiStart = jniLookup<
@@ -1515,7 +1528,9 @@
     jni.JObject charSequence,
     int offset,
   ) {
-    return _getEmojiStart(reference, charSequence.reference, offset).integer;
+    return _getEmojiStart(
+            reference.pointer, charSequence.reference.pointer, offset)
+        .integer;
   }
 
   static final _getEmojiEnd = jniLookup<
@@ -1535,7 +1550,9 @@
     jni.JObject charSequence,
     int offset,
   ) {
-    return _getEmojiEnd(reference, charSequence.reference, offset).integer;
+    return _getEmojiEnd(
+            reference.pointer, charSequence.reference.pointer, offset)
+        .integer;
   }
 
   static final _handleOnKeyDown = jniLookup<
@@ -1569,7 +1586,8 @@
     int keyCode,
     jni.JObject event,
   ) {
-    return _handleOnKeyDown(editable.reference, keyCode, event.reference)
+    return _handleOnKeyDown(
+            editable.reference.pointer, keyCode, event.reference.pointer)
         .boolean;
   }
 
@@ -1608,8 +1626,12 @@
     int afterLength,
     bool inCodePoints,
   ) {
-    return _handleDeleteSurroundingText(inputConnection.reference,
-            editable.reference, beforeLength, afterLength, inCodePoints ? 1 : 0)
+    return _handleDeleteSurroundingText(
+            inputConnection.reference.pointer,
+            editable.reference.pointer,
+            beforeLength,
+            afterLength,
+            inCodePoints ? 1 : 0)
         .boolean;
   }
 
@@ -1632,7 +1654,8 @@
   bool hasEmojiGlyph(
     jni.JObject sequence,
   ) {
-    return _hasEmojiGlyph(reference, sequence.reference).boolean;
+    return _hasEmojiGlyph(reference.pointer, sequence.reference.pointer)
+        .boolean;
   }
 
   static final _hasEmojiGlyph1 = jniLookup<
@@ -1659,7 +1682,8 @@
     jni.JObject sequence,
     int metadataVersion,
   ) {
-    return _hasEmojiGlyph1(reference, sequence.reference, metadataVersion)
+    return _hasEmojiGlyph1(
+            reference.pointer, sequence.reference.pointer, metadataVersion)
         .boolean;
   }
 
@@ -1690,7 +1714,8 @@
     jni.JObject sequence,
     int metadataVersion,
   ) {
-    return _getEmojiMatch(reference, sequence.reference, metadataVersion)
+    return _getEmojiMatch(
+            reference.pointer, sequence.reference.pointer, metadataVersion)
         .integer;
   }
 
@@ -1714,8 +1739,8 @@
   jni.JObject process(
     jni.JObject charSequence,
   ) {
-    return const jni.JObjectType()
-        .fromRef(_process(reference, charSequence.reference).object);
+    return const jni.JObjectType().fromRef(
+        _process(reference.pointer, charSequence.reference.pointer).object);
   }
 
   static final _process1 = jniLookup<
@@ -1761,7 +1786,8 @@
     int end,
   ) {
     return const jni.JObjectType().fromRef(
-        _process1(reference, charSequence.reference, start, end).object);
+        _process1(reference.pointer, charSequence.reference.pointer, start, end)
+            .object);
   }
 
   static final _process2 = jniLookup<
@@ -1811,9 +1837,9 @@
     int end,
     int maxEmojiCount,
   ) {
-    return const jni.JObjectType().fromRef(
-        _process2(reference, charSequence.reference, start, end, maxEmojiCount)
-            .object);
+    return const jni.JObjectType().fromRef(_process2(reference.pointer,
+            charSequence.reference.pointer, start, end, maxEmojiCount)
+        .object);
   }
 
   static final _process3 = jniLookup<
@@ -1869,8 +1895,13 @@
     int maxEmojiCount,
     int replaceStrategy,
   ) {
-    return const jni.JObjectType().fromRef(_process3(reference,
-            charSequence.reference, start, end, maxEmojiCount, replaceStrategy)
+    return const jni.JObjectType().fromRef(_process3(
+            reference.pointer,
+            charSequence.reference.pointer,
+            start,
+            end,
+            maxEmojiCount,
+            replaceStrategy)
         .object);
   }
 
@@ -1889,7 +1920,7 @@
   ///@throws IllegalStateException if not initialized yet
   jni.JString getAssetSignature() {
     return const jni.JStringType()
-        .fromRef(_getAssetSignature(reference).object);
+        .fromRef(_getAssetSignature(reference.pointer).object);
   }
 
   static final _updateEditorInfo = jniLookup<
@@ -1920,7 +1951,8 @@
   void updateEditorInfo(
     jni.JObject outAttrs,
   ) {
-    return _updateEditorInfo(reference, outAttrs.reference).check();
+    return _updateEditorInfo(reference.pointer, outAttrs.reference.pointer)
+        .check();
   }
 }
 
@@ -1981,7 +2013,7 @@
     DefaultEmojiCompatConfig_DefaultEmojiCompatConfigHelper helper,
   ) {
     return DefaultEmojiCompatConfig_DefaultEmojiCompatConfigFactory.fromRef(
-        _new0(helper.reference).object);
+        _new0(helper.reference.pointer).object);
   }
 
   static final _create = jniLookup<
@@ -2002,7 +2034,7 @@
     jni.JObject context,
   ) {
     return const $EmojiCompat_ConfigType()
-        .fromRef(_create(reference, context.reference).object);
+        .fromRef(_create(reference.pointer, context.reference.pointer).object);
   }
 }
 
@@ -2086,7 +2118,9 @@
   ) {
     return const jni.JArrayType(jni.JObjectType()).fromRef(
         _getSigningSignatures(
-                reference, packageManager.reference, providerPackage.reference)
+                reference.pointer,
+                packageManager.reference.pointer,
+                providerPackage.reference.pointer)
             .object);
   }
 
@@ -2113,7 +2147,10 @@
   ) {
     return const jni.JListType(jni.JObjectType()).fromRef(
         _queryIntentContentProviders(
-                reference, packageManager.reference, intent.reference, flags)
+                reference.pointer,
+                packageManager.reference.pointer,
+                intent.reference.pointer,
+                flags)
             .object);
   }
 
@@ -2135,8 +2172,9 @@
   jni.JObject getProviderInfo(
     jni.JObject resolveInfo,
   ) {
-    return const jni.JObjectType()
-        .fromRef(_getProviderInfo(reference, resolveInfo.reference).object);
+    return const jni.JObjectType().fromRef(
+        _getProviderInfo(reference.pointer, resolveInfo.reference.pointer)
+            .object);
   }
 }
 
@@ -2222,7 +2260,10 @@
   ) {
     return const jni.JListType(jni.JObjectType()).fromRef(
         _queryIntentContentProviders(
-                reference, packageManager.reference, intent.reference, flags)
+                reference.pointer,
+                packageManager.reference.pointer,
+                intent.reference.pointer,
+                flags)
             .object);
   }
 
@@ -2240,8 +2281,9 @@
   jni.JObject getProviderInfo(
     jni.JObject resolveInfo,
   ) {
-    return const jni.JObjectType()
-        .fromRef(_getProviderInfo(reference, resolveInfo.reference).object);
+    return const jni.JObjectType().fromRef(
+        _getProviderInfo(reference.pointer, resolveInfo.reference.pointer)
+            .object);
   }
 }
 
@@ -2327,7 +2369,9 @@
   ) {
     return const jni.JArrayType(jni.JObjectType()).fromRef(
         _getSigningSignatures1(
-                reference, packageManager.reference, providerPackage.reference)
+                reference.pointer,
+                packageManager.reference.pointer,
+                providerPackage.reference.pointer)
             .object);
   }
 }
@@ -2435,7 +2479,8 @@
   static jni.JObject create(
     jni.JObject context,
   ) {
-    return const jni.JObjectType().fromRef(_create(context.reference).object);
+    return const jni.JObjectType()
+        .fromRef(_create(context.reference.pointer).object);
   }
 }
 
@@ -2496,7 +2541,7 @@
   /// from: public java.lang.String getName()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JString getName() {
-    return const jni.JStringType().fromRef(_getName(reference).object);
+    return const jni.JStringType().fromRef(_getName(reference.pointer).object);
   }
 
   static final _getFingerprint = jniLookup<
@@ -2508,7 +2553,8 @@
   /// from: public java.lang.String getFingerprint()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JString getFingerprint() {
-    return const jni.JStringType().fromRef(_getFingerprint(reference).object);
+    return const jni.JStringType()
+        .fromRef(_getFingerprint(reference.pointer).object);
   }
 
   static final _getBuildTimeMillis = jniLookup<
@@ -2519,7 +2565,7 @@
 
   /// from: public long getBuildTimeMillis()
   int getBuildTimeMillis() {
-    return _getBuildTimeMillis(reference).long;
+    return _getBuildTimeMillis(reference.pointer).long;
   }
 
   static final _equals1 = jniLookup<
@@ -2534,7 +2580,7 @@
   bool equals1(
     jni.JObject object,
   ) {
-    return _equals1(reference, object.reference).boolean;
+    return _equals1(reference.pointer, object.reference.pointer).boolean;
   }
 
   static final _hashCode1 = jniLookup<
@@ -2545,7 +2591,7 @@
 
   /// from: public int hashCode()
   int hashCode1() {
-    return _hashCode1(reference).integer;
+    return _hashCode1(reference.pointer).integer;
   }
 }
 
@@ -3319,7 +3365,7 @@
     V ??= jni.lowestCommonSuperType([
       (map.$type as jni.JMapType).V,
     ]) as jni.JObjType<$V>;
-    return HashMap.fromRef(K, V, _new3(map.reference).object);
+    return HashMap.fromRef(K, V, _new3(map.reference.pointer).object);
   }
 
   static final _size = jniLookup<
@@ -3329,7 +3375,7 @@
 
   /// from: public int size()
   int size() {
-    return _size(reference).integer;
+    return _size(reference.pointer).integer;
   }
 
   static final _isEmpty = jniLookup<
@@ -3340,7 +3386,7 @@
 
   /// from: public boolean isEmpty()
   bool isEmpty() {
-    return _isEmpty(reference).boolean;
+    return _isEmpty(reference.pointer).boolean;
   }
 
   static final _get0 = jniLookup<
@@ -3356,7 +3402,7 @@
   $V get0(
     jni.JObject object,
   ) {
-    return V.fromRef(_get0(reference, object.reference).object);
+    return V.fromRef(_get0(reference.pointer, object.reference.pointer).object);
   }
 
   static final _containsKey = jniLookup<
@@ -3371,7 +3417,7 @@
   bool containsKey(
     jni.JObject object,
   ) {
-    return _containsKey(reference, object.reference).boolean;
+    return _containsKey(reference.pointer, object.reference.pointer).boolean;
   }
 
   static final _put = jniLookup<
@@ -3390,8 +3436,9 @@
     $K object,
     $V object1,
   ) {
-    return V
-        .fromRef(_put(reference, object.reference, object1.reference).object);
+    return V.fromRef(_put(reference.pointer, object.reference.pointer,
+            object1.reference.pointer)
+        .object);
   }
 
   static final _putAll = jniLookup<
@@ -3406,7 +3453,7 @@
   void putAll(
     jni.JMap<$K, $V> map,
   ) {
-    return _putAll(reference, map.reference).check();
+    return _putAll(reference.pointer, map.reference.pointer).check();
   }
 
   static final _remove = jniLookup<
@@ -3422,7 +3469,8 @@
   $V remove(
     jni.JObject object,
   ) {
-    return V.fromRef(_remove(reference, object.reference).object);
+    return V
+        .fromRef(_remove(reference.pointer, object.reference.pointer).object);
   }
 
   static final _clear = jniLookup<
@@ -3432,7 +3480,7 @@
 
   /// from: public void clear()
   void clear() {
-    return _clear(reference).check();
+    return _clear(reference.pointer).check();
   }
 
   static final _containsValue = jniLookup<
@@ -3447,7 +3495,7 @@
   bool containsValue(
     jni.JObject object,
   ) {
-    return _containsValue(reference, object.reference).boolean;
+    return _containsValue(reference.pointer, object.reference.pointer).boolean;
   }
 
   static final _keySet = jniLookup<
@@ -3458,7 +3506,7 @@
   /// from: public java.util.Set keySet()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JSet<$K> keySet() {
-    return jni.JSetType(K).fromRef(_keySet(reference).object);
+    return jni.JSetType(K).fromRef(_keySet(reference.pointer).object);
   }
 
   static final _values = jniLookup<
@@ -3469,7 +3517,7 @@
   /// from: public java.util.Collection values()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject values() {
-    return const jni.JObjectType().fromRef(_values(reference).object);
+    return const jni.JObjectType().fromRef(_values(reference.pointer).object);
   }
 
   static final _entrySet = jniLookup<
@@ -3482,7 +3530,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni.JSet<jni.JObject> entrySet() {
     return const jni.JSetType(jni.JObjectType())
-        .fromRef(_entrySet(reference).object);
+        .fromRef(_entrySet(reference.pointer).object);
   }
 
   static final _getOrDefault = jniLookup<
@@ -3501,8 +3549,9 @@
     jni.JObject object,
     $V object1,
   ) {
-    return V.fromRef(
-        _getOrDefault(reference, object.reference, object1.reference).object);
+    return V.fromRef(_getOrDefault(reference.pointer, object.reference.pointer,
+            object1.reference.pointer)
+        .object);
   }
 
   static final _putIfAbsent = jniLookup<
@@ -3521,8 +3570,9 @@
     $K object,
     $V object1,
   ) {
-    return V.fromRef(
-        _putIfAbsent(reference, object.reference, object1.reference).object);
+    return V.fromRef(_putIfAbsent(reference.pointer, object.reference.pointer,
+            object1.reference.pointer)
+        .object);
   }
 
   static final _remove1 = jniLookup<
@@ -3540,7 +3590,9 @@
     jni.JObject object,
     jni.JObject object1,
   ) {
-    return _remove1(reference, object.reference, object1.reference).boolean;
+    return _remove1(reference.pointer, object.reference.pointer,
+            object1.reference.pointer)
+        .boolean;
   }
 
   static final _replace = jniLookup<
@@ -3560,8 +3612,8 @@
     $V object1,
     $V object2,
   ) {
-    return _replace(
-            reference, object.reference, object1.reference, object2.reference)
+    return _replace(reference.pointer, object.reference.pointer,
+            object1.reference.pointer, object2.reference.pointer)
         .boolean;
   }
 
@@ -3581,8 +3633,9 @@
     $K object,
     $V object1,
   ) {
-    return V.fromRef(
-        _replace1(reference, object.reference, object1.reference).object);
+    return V.fromRef(_replace1(reference.pointer, object.reference.pointer,
+            object1.reference.pointer)
+        .object);
   }
 
   static final _computeIfAbsent = jniLookup<
@@ -3601,9 +3654,9 @@
     $K object,
     jni.JObject function,
   ) {
-    return V.fromRef(
-        _computeIfAbsent(reference, object.reference, function.reference)
-            .object);
+    return V.fromRef(_computeIfAbsent(reference.pointer,
+            object.reference.pointer, function.reference.pointer)
+        .object);
   }
 
   static final _computeIfPresent = jniLookup<
@@ -3622,9 +3675,9 @@
     $K object,
     jni.JObject biFunction,
   ) {
-    return V.fromRef(
-        _computeIfPresent(reference, object.reference, biFunction.reference)
-            .object);
+    return V.fromRef(_computeIfPresent(reference.pointer,
+            object.reference.pointer, biFunction.reference.pointer)
+        .object);
   }
 
   static final _compute = jniLookup<
@@ -3643,8 +3696,9 @@
     $K object,
     jni.JObject biFunction,
   ) {
-    return V.fromRef(
-        _compute(reference, object.reference, biFunction.reference).object);
+    return V.fromRef(_compute(reference.pointer, object.reference.pointer,
+            biFunction.reference.pointer)
+        .object);
   }
 
   static final _merge = jniLookup<
@@ -3665,8 +3719,8 @@
     $V object1,
     jni.JObject biFunction,
   ) {
-    return V.fromRef(_merge(reference, object.reference, object1.reference,
-            biFunction.reference)
+    return V.fromRef(_merge(reference.pointer, object.reference.pointer,
+            object1.reference.pointer, biFunction.reference.pointer)
         .object);
   }
 
@@ -3682,7 +3736,7 @@
   void forEach(
     jni.JObject biConsumer,
   ) {
-    return _forEach(reference, biConsumer.reference).check();
+    return _forEach(reference.pointer, biConsumer.reference.pointer).check();
   }
 
   static final _replaceAll = jniLookup<
@@ -3697,7 +3751,7 @@
   void replaceAll(
     jni.JObject biFunction,
   ) {
-    return _replaceAll(reference, biFunction.reference).check();
+    return _replaceAll(reference.pointer, biFunction.reference.pointer).check();
   }
 
   static final _clone = jniLookup<
@@ -3708,7 +3762,7 @@
   /// from: public java.lang.Object clone()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject clone() {
-    return const jni.JObjectType().fromRef(_clone(reference).object);
+    return const jni.JObjectType().fromRef(_clone(reference.pointer).object);
   }
 }
 
@@ -3771,7 +3825,9 @@
     jni.JObject text,
     int duration,
   ) {
-    return _showToast(mainActivity.reference, text.reference, duration).check();
+    return _showToast(
+            mainActivity.reference.pointer, text.reference.pointer, duration)
+        .check();
   }
 }
 
diff --git a/pkgs/jnigen/example/kotlin_plugin/lib/kotlin_bindings.dart b/pkgs/jnigen/example/kotlin_plugin/lib/kotlin_bindings.dart
index e1e7abb..10652ae 100644
--- a/pkgs/jnigen/example/kotlin_plugin/lib/kotlin_bindings.dart
+++ b/pkgs/jnigen/example/kotlin_plugin/lib/kotlin_bindings.dart
@@ -62,9 +62,9 @@
     final $p = ReceivePort();
     final $c =
         jni.JObject.fromRef(ProtectedJniExtensions.newPortContinuation($p));
-    _thinkBeforeAnswering(reference, $c.reference).object;
+    _thinkBeforeAnswering(reference.pointer, $c.reference.pointer).object;
     final $o = jni.JObjectPtr.fromAddress(await $p.first);
-    final $k = const jni.JStringType().getClass().reference;
+    final $k = const jni.JStringType().getClass().reference.pointer;
     if (!jni.Jni.env.IsInstanceOf($o, $k)) {
       throw "Failed";
     }
diff --git a/pkgs/jnigen/example/notification_plugin/lib/notifications.dart b/pkgs/jnigen/example/notification_plugin/lib/notifications.dart
index d91a2f5..0b5e313 100644
--- a/pkgs/jnigen/example/notification_plugin/lib/notifications.dart
+++ b/pkgs/jnigen/example/notification_plugin/lib/notifications.dart
@@ -70,8 +70,8 @@
     jni.JString title,
     jni.JString text,
   ) {
-    return _showNotification(
-            context.reference, notificationID, title.reference, text.reference)
+    return _showNotification(context.reference.pointer, notificationID,
+            title.reference.pointer, text.reference.pointer)
         .check();
   }
 }
diff --git a/pkgs/jnigen/example/pdfbox_plugin/example/lib/main.dart b/pkgs/jnigen/example/pdfbox_plugin/example/lib/main.dart
index ccc6563..51d0bbb 100644
--- a/pkgs/jnigen/example/pdfbox_plugin/example/lib/main.dart
+++ b/pkgs/jnigen/example/pdfbox_plugin/example/lib/main.dart
@@ -158,7 +158,7 @@
   /// Converts JString to dart string and deletes the original.
   /// Also handles the case where the underlying string is Null.
   String _fromJavaStr(JString jstr) {
-    if (jstr.reference == nullptr) {
+    if (jstr.reference.pointer == nullptr) {
       return '(null)';
     }
     return jstr.toDartString(releaseOriginal: true);
diff --git a/pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/pdmodel/PDDocument.dart b/pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/pdmodel/PDDocument.dart
index e8777cb..ca2d148 100644
--- a/pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/pdmodel/PDDocument.dart
+++ b/pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/pdmodel/PDDocument.dart
@@ -86,7 +86,7 @@
   factory PDDocument.new1(
     jni.JObject memUsageSetting,
   ) {
-    return PDDocument.fromRef(_new1(memUsageSetting.reference).object);
+    return PDDocument.fromRef(_new1(memUsageSetting.reference.pointer).object);
   }
 
   static final _new2 = jniLookup<
@@ -103,7 +103,7 @@
   factory PDDocument.new2(
     jni.JObject doc,
   ) {
-    return PDDocument.fromRef(_new2(doc.reference).object);
+    return PDDocument.fromRef(_new2(doc.reference.pointer).object);
   }
 
   static final _new3 = jniLookup<
@@ -124,7 +124,8 @@
     jni.JObject doc,
     jni.JObject source,
   ) {
-    return PDDocument.fromRef(_new3(doc.reference, source.reference).object);
+    return PDDocument.fromRef(
+        _new3(doc.reference.pointer, source.reference.pointer).object);
   }
 
   static final _new4 = jniLookup<
@@ -149,8 +150,9 @@
     jni.JObject source,
     jni.JObject permission,
   ) {
-    return PDDocument.fromRef(
-        _new4(doc.reference, source.reference, permission.reference).object);
+    return PDDocument.fromRef(_new4(doc.reference.pointer,
+            source.reference.pointer, permission.reference.pointer)
+        .object);
   }
 
   static final _addPage = jniLookup<
@@ -169,7 +171,7 @@
   void addPage(
     jni.JObject page,
   ) {
-    return _addPage(reference, page.reference).check();
+    return _addPage(reference.pointer, page.reference.pointer).check();
   }
 
   static final _addSignature = jniLookup<
@@ -195,7 +197,8 @@
   void addSignature(
     jni.JObject sigObject,
   ) {
-    return _addSignature(reference, sigObject.reference).check();
+    return _addSignature(reference.pointer, sigObject.reference.pointer)
+        .check();
   }
 
   static final _addSignature1 = jniLookup<
@@ -225,7 +228,8 @@
     jni.JObject sigObject,
     jni.JObject options,
   ) {
-    return _addSignature1(reference, sigObject.reference, options.reference)
+    return _addSignature1(reference.pointer, sigObject.reference.pointer,
+            options.reference.pointer)
         .check();
   }
 
@@ -255,8 +259,8 @@
     jni.JObject sigObject,
     jni.JObject signatureInterface,
   ) {
-    return _addSignature2(
-            reference, sigObject.reference, signatureInterface.reference)
+    return _addSignature2(reference.pointer, sigObject.reference.pointer,
+            signatureInterface.reference.pointer)
         .check();
   }
 
@@ -291,8 +295,8 @@
     jni.JObject signatureInterface,
     jni.JObject options,
   ) {
-    return _addSignature3(reference, sigObject.reference,
-            signatureInterface.reference, options.reference)
+    return _addSignature3(reference.pointer, sigObject.reference.pointer,
+            signatureInterface.reference.pointer, options.reference.pointer)
         .check();
   }
 
@@ -322,8 +326,8 @@
     jni.JObject signatureInterface,
     jni.JObject options,
   ) {
-    return _addSignatureField(reference, sigFields.reference,
-            signatureInterface.reference, options.reference)
+    return _addSignatureField(reference.pointer, sigFields.reference.pointer,
+            signatureInterface.reference.pointer, options.reference.pointer)
         .check();
   }
 
@@ -342,7 +346,7 @@
   void removePage(
     jni.JObject page,
   ) {
-    return _removePage(reference, page.reference).check();
+    return _removePage(reference.pointer, page.reference.pointer).check();
   }
 
   static final _removePage1 = jniLookup<
@@ -358,7 +362,7 @@
   void removePage1(
     int pageNumber,
   ) {
-    return _removePage1(reference, pageNumber).check();
+    return _removePage1(reference.pointer, pageNumber).check();
   }
 
   static final _importPage = jniLookup<
@@ -397,7 +401,7 @@
     jni.JObject page,
   ) {
     return const jni.JObjectType()
-        .fromRef(_importPage(reference, page.reference).object);
+        .fromRef(_importPage(reference.pointer, page.reference.pointer).object);
   }
 
   static final _getDocument = jniLookup<
@@ -412,7 +416,8 @@
   /// This will get the low level document.
   ///@return The document that this layer sits on top of.
   jni.JObject getDocument() {
-    return const jni.JObjectType().fromRef(_getDocument(reference).object);
+    return const jni.JObjectType()
+        .fromRef(_getDocument(reference.pointer).object);
   }
 
   static final _getDocumentInformation = jniLookup<
@@ -433,7 +438,7 @@
   ///@return The documents /Info dictionary, never null.
   pddocumentinformation_.PDDocumentInformation getDocumentInformation() {
     return const pddocumentinformation_.$PDDocumentInformationType()
-        .fromRef(_getDocumentInformation(reference).object);
+        .fromRef(_getDocumentInformation(reference.pointer).object);
   }
 
   static final _setDocumentInformation = jniLookup<
@@ -455,7 +460,8 @@
   void setDocumentInformation(
     pddocumentinformation_.PDDocumentInformation info,
   ) {
-    return _setDocumentInformation(reference, info.reference).check();
+    return _setDocumentInformation(reference.pointer, info.reference.pointer)
+        .check();
   }
 
   static final _getDocumentCatalog = jniLookup<
@@ -471,7 +477,7 @@
   ///@return The documents /Root dictionary
   jni.JObject getDocumentCatalog() {
     return const jni.JObjectType()
-        .fromRef(_getDocumentCatalog(reference).object);
+        .fromRef(_getDocumentCatalog(reference.pointer).object);
   }
 
   static final _isEncrypted = jniLookup<
@@ -485,7 +491,7 @@
   /// This will tell if this document is encrypted or not.
   ///@return true If this document is encrypted.
   bool isEncrypted() {
-    return _isEncrypted(reference).boolean;
+    return _isEncrypted(reference.pointer).boolean;
   }
 
   static final _getEncryption = jniLookup<
@@ -503,7 +509,8 @@
   /// PDStandardEncryption object.
   ///@return The encryption dictionary(most likely a PDStandardEncryption object)
   jni.JObject getEncryption() {
-    return const jni.JObjectType().fromRef(_getEncryption(reference).object);
+    return const jni.JObjectType()
+        .fromRef(_getEncryption(reference.pointer).object);
   }
 
   static final _setEncryptionDictionary = jniLookup<
@@ -523,7 +530,9 @@
   void setEncryptionDictionary(
     jni.JObject encryption,
   ) {
-    return _setEncryptionDictionary(reference, encryption.reference).check();
+    return _setEncryptionDictionary(
+            reference.pointer, encryption.reference.pointer)
+        .check();
   }
 
   static final _getLastSignatureDictionary = jniLookup<
@@ -541,7 +550,7 @@
   ///@throws IOException if no document catalog can be found.
   jni.JObject getLastSignatureDictionary() {
     return const jni.JObjectType()
-        .fromRef(_getLastSignatureDictionary(reference).object);
+        .fromRef(_getLastSignatureDictionary(reference.pointer).object);
   }
 
   static final _getSignatureFields = jniLookup<
@@ -558,7 +567,7 @@
   ///@throws IOException if no document catalog can be found.
   jni.JList<jni.JObject> getSignatureFields() {
     return const jni.JListType(jni.JObjectType())
-        .fromRef(_getSignatureFields(reference).object);
+        .fromRef(_getSignatureFields(reference.pointer).object);
   }
 
   static final _getSignatureDictionaries = jniLookup<
@@ -575,7 +584,7 @@
   ///@throws IOException if no document catalog can be found.
   jni.JList<jni.JObject> getSignatureDictionaries() {
     return const jni.JListType(jni.JObjectType())
-        .fromRef(_getSignatureDictionaries(reference).object);
+        .fromRef(_getSignatureDictionaries(reference.pointer).object);
   }
 
   static final _registerTrueTypeFontForClosing = jniLookup<
@@ -596,7 +605,9 @@
   void registerTrueTypeFontForClosing(
     jni.JObject ttf,
   ) {
-    return _registerTrueTypeFontForClosing(reference, ttf.reference).check();
+    return _registerTrueTypeFontForClosing(
+            reference.pointer, ttf.reference.pointer)
+        .check();
   }
 
   static final _load = jniLookup<
@@ -616,7 +627,8 @@
   static PDDocument load(
     jni.JObject file,
   ) {
-    return const $PDDocumentType().fromRef(_load(file.reference).object);
+    return const $PDDocumentType()
+        .fromRef(_load(file.reference.pointer).object);
   }
 
   static final _load1 = jniLookup<
@@ -640,8 +652,9 @@
     jni.JObject file,
     jni.JObject memUsageSetting,
   ) {
-    return const $PDDocumentType()
-        .fromRef(_load1(file.reference, memUsageSetting.reference).object);
+    return const $PDDocumentType().fromRef(
+        _load1(file.reference.pointer, memUsageSetting.reference.pointer)
+            .object);
   }
 
   static final _load2 = jniLookup<
@@ -665,8 +678,8 @@
     jni.JObject file,
     jni.JString password,
   ) {
-    return const $PDDocumentType()
-        .fromRef(_load2(file.reference, password.reference).object);
+    return const $PDDocumentType().fromRef(
+        _load2(file.reference.pointer, password.reference.pointer).object);
   }
 
   static final _load3 = jniLookup<
@@ -694,9 +707,9 @@
     jni.JString password,
     jni.JObject memUsageSetting,
   ) {
-    return const $PDDocumentType().fromRef(
-        _load3(file.reference, password.reference, memUsageSetting.reference)
-            .object);
+    return const $PDDocumentType().fromRef(_load3(file.reference.pointer,
+            password.reference.pointer, memUsageSetting.reference.pointer)
+        .object);
   }
 
   static final _load4 = jniLookup<
@@ -726,8 +739,11 @@
     jni.JObject keyStore,
     jni.JString alias,
   ) {
-    return const $PDDocumentType().fromRef(_load4(file.reference,
-            password.reference, keyStore.reference, alias.reference)
+    return const $PDDocumentType().fromRef(_load4(
+            file.reference.pointer,
+            password.reference.pointer,
+            keyStore.reference.pointer,
+            alias.reference.pointer)
         .object);
   }
 
@@ -766,11 +782,11 @@
     jni.JObject memUsageSetting,
   ) {
     return const $PDDocumentType().fromRef(_load5(
-            file.reference,
-            password.reference,
-            keyStore.reference,
-            alias.reference,
-            memUsageSetting.reference)
+            file.reference.pointer,
+            password.reference.pointer,
+            keyStore.reference.pointer,
+            alias.reference.pointer,
+            memUsageSetting.reference.pointer)
         .object);
   }
 
@@ -792,7 +808,8 @@
   static PDDocument load6(
     jni.JObject input,
   ) {
-    return const $PDDocumentType().fromRef(_load6(input.reference).object);
+    return const $PDDocumentType()
+        .fromRef(_load6(input.reference.pointer).object);
   }
 
   static final _load7 = jniLookup<
@@ -817,8 +834,9 @@
     jni.JObject input,
     jni.JObject memUsageSetting,
   ) {
-    return const $PDDocumentType()
-        .fromRef(_load7(input.reference, memUsageSetting.reference).object);
+    return const $PDDocumentType().fromRef(
+        _load7(input.reference.pointer, memUsageSetting.reference.pointer)
+            .object);
   }
 
   static final _load8 = jniLookup<
@@ -843,8 +861,8 @@
     jni.JObject input,
     jni.JString password,
   ) {
-    return const $PDDocumentType()
-        .fromRef(_load8(input.reference, password.reference).object);
+    return const $PDDocumentType().fromRef(
+        _load8(input.reference.pointer, password.reference.pointer).object);
   }
 
   static final _load9 = jniLookup<
@@ -875,8 +893,11 @@
     jni.JObject keyStore,
     jni.JString alias,
   ) {
-    return const $PDDocumentType().fromRef(_load9(input.reference,
-            password.reference, keyStore.reference, alias.reference)
+    return const $PDDocumentType().fromRef(_load9(
+            input.reference.pointer,
+            password.reference.pointer,
+            keyStore.reference.pointer,
+            alias.reference.pointer)
         .object);
   }
 
@@ -906,9 +927,9 @@
     jni.JString password,
     jni.JObject memUsageSetting,
   ) {
-    return const $PDDocumentType().fromRef(
-        _load10(input.reference, password.reference, memUsageSetting.reference)
-            .object);
+    return const $PDDocumentType().fromRef(_load10(input.reference.pointer,
+            password.reference.pointer, memUsageSetting.reference.pointer)
+        .object);
   }
 
   static final _load11 = jniLookup<
@@ -948,11 +969,11 @@
     jni.JObject memUsageSetting,
   ) {
     return const $PDDocumentType().fromRef(_load11(
-            input.reference,
-            password.reference,
-            keyStore.reference,
-            alias.reference,
-            memUsageSetting.reference)
+            input.reference.pointer,
+            password.reference.pointer,
+            keyStore.reference.pointer,
+            alias.reference.pointer,
+            memUsageSetting.reference.pointer)
         .object);
   }
 
@@ -973,7 +994,8 @@
   static PDDocument load12(
     jni.JArray<jni.jbyte> input,
   ) {
-    return const $PDDocumentType().fromRef(_load12(input.reference).object);
+    return const $PDDocumentType()
+        .fromRef(_load12(input.reference.pointer).object);
   }
 
   static final _load13 = jniLookup<
@@ -997,8 +1019,8 @@
     jni.JArray<jni.jbyte> input,
     jni.JString password,
   ) {
-    return const $PDDocumentType()
-        .fromRef(_load13(input.reference, password.reference).object);
+    return const $PDDocumentType().fromRef(
+        _load13(input.reference.pointer, password.reference.pointer).object);
   }
 
   static final _load14 = jniLookup<
@@ -1029,8 +1051,11 @@
     jni.JObject keyStore,
     jni.JString alias,
   ) {
-    return const $PDDocumentType().fromRef(_load14(input.reference,
-            password.reference, keyStore.reference, alias.reference)
+    return const $PDDocumentType().fromRef(_load14(
+            input.reference.pointer,
+            password.reference.pointer,
+            keyStore.reference.pointer,
+            alias.reference.pointer)
         .object);
   }
 
@@ -1070,11 +1095,11 @@
     jni.JObject memUsageSetting,
   ) {
     return const $PDDocumentType().fromRef(_load15(
-            input.reference,
-            password.reference,
-            keyStore.reference,
-            alias.reference,
-            memUsageSetting.reference)
+            input.reference.pointer,
+            password.reference.pointer,
+            keyStore.reference.pointer,
+            alias.reference.pointer,
+            memUsageSetting.reference.pointer)
         .object);
   }
 
@@ -1098,7 +1123,7 @@
   void save(
     jni.JString fileName,
   ) {
-    return _save(reference, fileName.reference).check();
+    return _save(reference.pointer, fileName.reference.pointer).check();
   }
 
   static final _save1 = jniLookup<
@@ -1121,7 +1146,7 @@
   void save1(
     jni.JObject file,
   ) {
-    return _save1(reference, file.reference).check();
+    return _save1(reference.pointer, file.reference.pointer).check();
   }
 
   static final _save2 = jniLookup<
@@ -1145,7 +1170,7 @@
   void save2(
     jni.JObject output,
   ) {
-    return _save2(reference, output.reference).check();
+    return _save2(reference.pointer, output.reference.pointer).check();
   }
 
   static final _saveIncremental = jniLookup<
@@ -1174,7 +1199,8 @@
   void saveIncremental(
     jni.JObject output,
   ) {
-    return _saveIncremental(reference, output.reference).check();
+    return _saveIncremental(reference.pointer, output.reference.pointer)
+        .check();
   }
 
   static final _saveIncremental1 = jniLookup<
@@ -1211,8 +1237,8 @@
     jni.JObject output,
     jni.JSet<jni.JObject> objectsToWrite,
   ) {
-    return _saveIncremental1(
-            reference, output.reference, objectsToWrite.reference)
+    return _saveIncremental1(reference.pointer, output.reference.pointer,
+            objectsToWrite.reference.pointer)
         .check();
   }
 
@@ -1268,8 +1294,9 @@
   jni.JObject saveIncrementalForExternalSigning(
     jni.JObject output,
   ) {
-    return const jni.JObjectType().fromRef(
-        _saveIncrementalForExternalSigning(reference, output.reference).object);
+    return const jni.JObjectType().fromRef(_saveIncrementalForExternalSigning(
+            reference.pointer, output.reference.pointer)
+        .object);
   }
 
   static final _getPage = jniLookup<
@@ -1292,7 +1319,7 @@
     int pageIndex,
   ) {
     return const jni.JObjectType()
-        .fromRef(_getPage(reference, pageIndex).object);
+        .fromRef(_getPage(reference.pointer, pageIndex).object);
   }
 
   static final _getPages = jniLookup<
@@ -1307,7 +1334,7 @@
   /// Returns the page tree.
   ///@return the page tree
   jni.JObject getPages() {
-    return const jni.JObjectType().fromRef(_getPages(reference).object);
+    return const jni.JObjectType().fromRef(_getPages(reference.pointer).object);
   }
 
   static final _getNumberOfPages = jniLookup<
@@ -1321,7 +1348,7 @@
   /// This will return the total page count of the PDF document.
   ///@return The total number of pages in the PDF document.
   int getNumberOfPages() {
-    return _getNumberOfPages(reference).integer;
+    return _getNumberOfPages(reference.pointer).integer;
   }
 
   static final _close = jniLookup<
@@ -1335,7 +1362,7 @@
   /// This will close the underlying COSDocument object.
   ///@throws IOException If there is an error releasing resources.
   void close() {
-    return _close(reference).check();
+    return _close(reference.pointer).check();
   }
 
   static final _protect = jniLookup<
@@ -1361,7 +1388,7 @@
   void protect(
     jni.JObject policy,
   ) {
-    return _protect(reference, policy.reference).check();
+    return _protect(reference.pointer, policy.reference.pointer).check();
   }
 
   static final _getCurrentAccessPermission = jniLookup<
@@ -1380,7 +1407,7 @@
   ///@return the access permissions for the current user on the document.
   jni.JObject getCurrentAccessPermission() {
     return const jni.JObjectType()
-        .fromRef(_getCurrentAccessPermission(reference).object);
+        .fromRef(_getCurrentAccessPermission(reference.pointer).object);
   }
 
   static final _isAllSecurityToBeRemoved = jniLookup<
@@ -1394,7 +1421,7 @@
   /// Indicates if all security is removed or not when writing the pdf.
   ///@return returns true if all security shall be removed otherwise false
   bool isAllSecurityToBeRemoved() {
-    return _isAllSecurityToBeRemoved(reference).boolean;
+    return _isAllSecurityToBeRemoved(reference.pointer).boolean;
   }
 
   static final _setAllSecurityToBeRemoved = jniLookup<
@@ -1410,7 +1437,8 @@
   void setAllSecurityToBeRemoved(
     bool removeAllSecurity,
   ) {
-    return _setAllSecurityToBeRemoved(reference, removeAllSecurity ? 1 : 0)
+    return _setAllSecurityToBeRemoved(
+            reference.pointer, removeAllSecurity ? 1 : 0)
         .check();
   }
 
@@ -1426,7 +1454,8 @@
   /// Provides the document ID.
   ///@return the document ID
   jni.JLong getDocumentId() {
-    return const jni.JLongType().fromRef(_getDocumentId(reference).object);
+    return const jni.JLongType()
+        .fromRef(_getDocumentId(reference.pointer).object);
   }
 
   static final _setDocumentId = jniLookup<
@@ -1444,7 +1473,7 @@
   void setDocumentId(
     jni.JLong docId,
   ) {
-    return _setDocumentId(reference, docId.reference).check();
+    return _setDocumentId(reference.pointer, docId.reference.pointer).check();
   }
 
   static final _getVersion = jniLookup<
@@ -1458,7 +1487,7 @@
   /// Returns the PDF specification version this document conforms to.
   ///@return the PDF version (e.g. 1.4f)
   double getVersion() {
-    return _getVersion(reference).float;
+    return _getVersion(reference.pointer).float;
   }
 
   static final _setVersion = jniLookup<
@@ -1474,7 +1503,7 @@
   void setVersion(
     double newVersion,
   ) {
-    return _setVersion(reference, newVersion).check();
+    return _setVersion(reference.pointer, newVersion).check();
   }
 
   static final _getResourceCache = jniLookup<
@@ -1489,7 +1518,8 @@
   /// Returns the resource cache associated with this document, or null if there is none.
   ///@return the resource cache or null.
   jni.JObject getResourceCache() {
-    return const jni.JObjectType().fromRef(_getResourceCache(reference).object);
+    return const jni.JObjectType()
+        .fromRef(_getResourceCache(reference.pointer).object);
   }
 
   static final _setResourceCache = jniLookup<
@@ -1507,7 +1537,8 @@
   void setResourceCache(
     jni.JObject resourceCache,
   ) {
-    return _setResourceCache(reference, resourceCache.reference).check();
+    return _setResourceCache(reference.pointer, resourceCache.reference.pointer)
+        .check();
   }
 }
 
diff --git a/pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/pdmodel/PDDocumentInformation.dart b/pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/pdmodel/PDDocumentInformation.dart
index b05c031..45e477d 100644
--- a/pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/pdmodel/PDDocumentInformation.dart
+++ b/pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/pdmodel/PDDocumentInformation.dart
@@ -85,7 +85,7 @@
   factory PDDocumentInformation.new1(
     jni.JObject dic,
   ) {
-    return PDDocumentInformation.fromRef(_new1(dic.reference).object);
+    return PDDocumentInformation.fromRef(_new1(dic.reference.pointer).object);
   }
 
   static final _getCOSObject = jniLookup<
@@ -100,7 +100,8 @@
   /// This will get the underlying dictionary that this object wraps.
   ///@return The underlying info dictionary.
   jni.JObject getCOSObject() {
-    return const jni.JObjectType().fromRef(_getCOSObject(reference).object);
+    return const jni.JObjectType()
+        .fromRef(_getCOSObject(reference.pointer).object);
   }
 
   static final _getPropertyStringValue = jniLookup<
@@ -126,8 +127,9 @@
   jni.JObject getPropertyStringValue(
     jni.JString propertyKey,
   ) {
-    return const jni.JObjectType().fromRef(
-        _getPropertyStringValue(reference, propertyKey.reference).object);
+    return const jni.JObjectType().fromRef(_getPropertyStringValue(
+            reference.pointer, propertyKey.reference.pointer)
+        .object);
   }
 
   static final _getTitle = jniLookup<
@@ -142,7 +144,7 @@
   /// This will get the title of the document.  This will return null if no title exists.
   ///@return The title of the document.
   jni.JString getTitle() {
-    return const jni.JStringType().fromRef(_getTitle(reference).object);
+    return const jni.JStringType().fromRef(_getTitle(reference.pointer).object);
   }
 
   static final _setTitle = jniLookup<
@@ -160,7 +162,7 @@
   void setTitle(
     jni.JString title,
   ) {
-    return _setTitle(reference, title.reference).check();
+    return _setTitle(reference.pointer, title.reference.pointer).check();
   }
 
   static final _getAuthor = jniLookup<
@@ -175,7 +177,8 @@
   /// This will get the author of the document.  This will return null if no author exists.
   ///@return The author of the document.
   jni.JString getAuthor() {
-    return const jni.JStringType().fromRef(_getAuthor(reference).object);
+    return const jni.JStringType()
+        .fromRef(_getAuthor(reference.pointer).object);
   }
 
   static final _setAuthor = jniLookup<
@@ -193,7 +196,7 @@
   void setAuthor(
     jni.JString author,
   ) {
-    return _setAuthor(reference, author.reference).check();
+    return _setAuthor(reference.pointer, author.reference.pointer).check();
   }
 
   static final _getSubject = jniLookup<
@@ -208,7 +211,8 @@
   /// This will get the subject of the document.  This will return null if no subject exists.
   ///@return The subject of the document.
   jni.JString getSubject() {
-    return const jni.JStringType().fromRef(_getSubject(reference).object);
+    return const jni.JStringType()
+        .fromRef(_getSubject(reference.pointer).object);
   }
 
   static final _setSubject = jniLookup<
@@ -226,7 +230,7 @@
   void setSubject(
     jni.JString subject,
   ) {
-    return _setSubject(reference, subject.reference).check();
+    return _setSubject(reference.pointer, subject.reference.pointer).check();
   }
 
   static final _getKeywords = jniLookup<
@@ -241,7 +245,8 @@
   /// This will get the keywords of the document.  This will return null if no keywords exists.
   ///@return The keywords of the document.
   jni.JString getKeywords() {
-    return const jni.JStringType().fromRef(_getKeywords(reference).object);
+    return const jni.JStringType()
+        .fromRef(_getKeywords(reference.pointer).object);
   }
 
   static final _setKeywords = jniLookup<
@@ -259,7 +264,7 @@
   void setKeywords(
     jni.JString keywords,
   ) {
-    return _setKeywords(reference, keywords.reference).check();
+    return _setKeywords(reference.pointer, keywords.reference.pointer).check();
   }
 
   static final _getCreator = jniLookup<
@@ -274,7 +279,8 @@
   /// This will get the creator of the document.  This will return null if no creator exists.
   ///@return The creator of the document.
   jni.JString getCreator() {
-    return const jni.JStringType().fromRef(_getCreator(reference).object);
+    return const jni.JStringType()
+        .fromRef(_getCreator(reference.pointer).object);
   }
 
   static final _setCreator = jniLookup<
@@ -292,7 +298,7 @@
   void setCreator(
     jni.JString creator,
   ) {
-    return _setCreator(reference, creator.reference).check();
+    return _setCreator(reference.pointer, creator.reference.pointer).check();
   }
 
   static final _getProducer = jniLookup<
@@ -307,7 +313,8 @@
   /// This will get the producer of the document.  This will return null if no producer exists.
   ///@return The producer of the document.
   jni.JString getProducer() {
-    return const jni.JStringType().fromRef(_getProducer(reference).object);
+    return const jni.JStringType()
+        .fromRef(_getProducer(reference.pointer).object);
   }
 
   static final _setProducer = jniLookup<
@@ -325,7 +332,7 @@
   void setProducer(
     jni.JString producer,
   ) {
-    return _setProducer(reference, producer.reference).check();
+    return _setProducer(reference.pointer, producer.reference.pointer).check();
   }
 
   static final _getCreationDate = jniLookup<
@@ -340,7 +347,8 @@
   /// This will get the creation date of the document.  This will return null if no creation date exists.
   ///@return The creation date of the document.
   jni.JObject getCreationDate() {
-    return const jni.JObjectType().fromRef(_getCreationDate(reference).object);
+    return const jni.JObjectType()
+        .fromRef(_getCreationDate(reference.pointer).object);
   }
 
   static final _setCreationDate = jniLookup<
@@ -359,7 +367,7 @@
   void setCreationDate(
     jni.JObject date,
   ) {
-    return _setCreationDate(reference, date.reference).check();
+    return _setCreationDate(reference.pointer, date.reference.pointer).check();
   }
 
   static final _getModificationDate = jniLookup<
@@ -375,7 +383,7 @@
   ///@return The modification date of the document.
   jni.JObject getModificationDate() {
     return const jni.JObjectType()
-        .fromRef(_getModificationDate(reference).object);
+        .fromRef(_getModificationDate(reference.pointer).object);
   }
 
   static final _setModificationDate = jniLookup<
@@ -394,7 +402,8 @@
   void setModificationDate(
     jni.JObject date,
   ) {
-    return _setModificationDate(reference, date.reference).check();
+    return _setModificationDate(reference.pointer, date.reference.pointer)
+        .check();
   }
 
   static final _getTrapped = jniLookup<
@@ -410,7 +419,8 @@
   /// This will return null if one is not found.
   ///@return The trapped value for the document.
   jni.JString getTrapped() {
-    return const jni.JStringType().fromRef(_getTrapped(reference).object);
+    return const jni.JStringType()
+        .fromRef(_getTrapped(reference.pointer).object);
   }
 
   static final _getMetadataKeys = jniLookup<
@@ -427,7 +437,7 @@
   ///@since Apache PDFBox 1.3.0
   jni.JSet<jni.JString> getMetadataKeys() {
     return const jni.JSetType(jni.JStringType())
-        .fromRef(_getMetadataKeys(reference).object);
+        .fromRef(_getMetadataKeys(reference.pointer).object);
   }
 
   static final _getCustomMetadataValue = jniLookup<
@@ -450,7 +460,8 @@
     jni.JString fieldName,
   ) {
     return const jni.JStringType().fromRef(
-        _getCustomMetadataValue(reference, fieldName.reference).object);
+        _getCustomMetadataValue(reference.pointer, fieldName.reference.pointer)
+            .object);
   }
 
   static final _setCustomMetadataValue = jniLookup<
@@ -471,8 +482,8 @@
     jni.JString fieldName,
     jni.JString fieldValue,
   ) {
-    return _setCustomMetadataValue(
-            reference, fieldName.reference, fieldValue.reference)
+    return _setCustomMetadataValue(reference.pointer,
+            fieldName.reference.pointer, fieldValue.reference.pointer)
         .check();
   }
 
@@ -493,7 +504,7 @@
   void setTrapped(
     jni.JString value,
   ) {
-    return _setTrapped(reference, value.reference).check();
+    return _setTrapped(reference.pointer, value.reference.pointer).check();
   }
 }
 
diff --git a/pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/text/PDFTextStripper.dart b/pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/text/PDFTextStripper.dart
index fcdfda2..1fc593f 100644
--- a/pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/text/PDFTextStripper.dart
+++ b/pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/text/PDFTextStripper.dart
@@ -76,8 +76,8 @@
   /// The returned object must be released after use, by calling the [release] method.
   ///
   /// The platform's line separator.
-  jni.JString get LINE_SEPARATOR =>
-      const jni.JStringType().fromRef(_get_LINE_SEPARATOR(reference).object);
+  jni.JString get LINE_SEPARATOR => const jni.JStringType()
+      .fromRef(_get_LINE_SEPARATOR(reference.pointer).object);
 
   static final _get_charactersByArticle = jniLookup<
           ffi.NativeFunction<
@@ -113,7 +113,7 @@
   ///
   /// Most PDFs won't have any beads, so charactersByArticle will contain a single entry.
   jni.JObject get charactersByArticle => const jni.JObjectType()
-      .fromRef(_get_charactersByArticle(reference).object);
+      .fromRef(_get_charactersByArticle(reference.pointer).object);
 
   /// from: protected java.util.ArrayList<java.util.List<org.apache.pdfbox.text.TextPosition>> charactersByArticle
   /// The returned object must be released after use, by calling the [release] method.
@@ -131,7 +131,8 @@
   ///
   /// Most PDFs won't have any beads, so charactersByArticle will contain a single entry.
   set charactersByArticle(jni.JObject value) =>
-      _set_charactersByArticle(reference, value.reference).check();
+      _set_charactersByArticle(reference.pointer, value.reference.pointer)
+          .check();
 
   static final _get_document = jniLookup<
           ffi.NativeFunction<
@@ -153,12 +154,12 @@
   /// from: protected org.apache.pdfbox.pdmodel.PDDocument document
   /// The returned object must be released after use, by calling the [release] method.
   pddocument_.PDDocument get document => const pddocument_.$PDDocumentType()
-      .fromRef(_get_document(reference).object);
+      .fromRef(_get_document(reference.pointer).object);
 
   /// from: protected org.apache.pdfbox.pdmodel.PDDocument document
   /// The returned object must be released after use, by calling the [release] method.
   set document(pddocument_.PDDocument value) =>
-      _set_document(reference, value.reference).check();
+      _set_document(reference.pointer, value.reference.pointer).check();
 
   static final _get_output = jniLookup<
           ffi.NativeFunction<
@@ -180,12 +181,12 @@
   /// from: protected java.io.Writer output
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject get output =>
-      const jni.JObjectType().fromRef(_get_output(reference).object);
+      const jni.JObjectType().fromRef(_get_output(reference.pointer).object);
 
   /// from: protected java.io.Writer output
   /// The returned object must be released after use, by calling the [release] method.
   set output(jni.JObject value) =>
-      _set_output(reference, value.reference).check();
+      _set_output(reference.pointer, value.reference.pointer).check();
 
   static final _new0 = jniLookup<ffi.NativeFunction<jni.JniResult Function()>>(
           "PDFTextStripper__new0")
@@ -225,7 +226,7 @@
     pddocument_.PDDocument doc,
   ) {
     return const jni.JStringType()
-        .fromRef(_getText(reference, doc.reference).object);
+        .fromRef(_getText(reference.pointer, doc.reference.pointer).object);
   }
 
   static final _writeText = jniLookup<
@@ -248,7 +249,9 @@
     pddocument_.PDDocument doc,
     jni.JObject outputStream,
   ) {
-    return _writeText(reference, doc.reference, outputStream.reference).check();
+    return _writeText(reference.pointer, doc.reference.pointer,
+            outputStream.reference.pointer)
+        .check();
   }
 
   static final _processPages = jniLookup<
@@ -267,7 +270,7 @@
   void processPages(
     jni.JObject pages,
   ) {
-    return _processPages(reference, pages.reference).check();
+    return _processPages(reference.pointer, pages.reference.pointer).check();
   }
 
   static final _startDocument = jniLookup<
@@ -286,7 +289,8 @@
   void startDocument(
     pddocument_.PDDocument document,
   ) {
-    return _startDocument(reference, document.reference).check();
+    return _startDocument(reference.pointer, document.reference.pointer)
+        .check();
   }
 
   static final _endDocument = jniLookup<
@@ -306,7 +310,7 @@
   void endDocument(
     pddocument_.PDDocument document,
   ) {
-    return _endDocument(reference, document.reference).check();
+    return _endDocument(reference.pointer, document.reference.pointer).check();
   }
 
   static final _processPage = jniLookup<
@@ -325,7 +329,7 @@
   void processPage(
     jni.JObject page,
   ) {
-    return _processPage(reference, page.reference).check();
+    return _processPage(reference.pointer, page.reference.pointer).check();
   }
 
   static final _startArticle = jniLookup<
@@ -341,7 +345,7 @@
   /// may provide additional information.
   ///@throws IOException If there is any error writing to the stream.
   void startArticle() {
-    return _startArticle(reference).check();
+    return _startArticle(reference.pointer).check();
   }
 
   static final _startArticle1 = jniLookup<
@@ -359,7 +363,7 @@
   void startArticle1(
     bool isLTR,
   ) {
-    return _startArticle1(reference, isLTR ? 1 : 0).check();
+    return _startArticle1(reference.pointer, isLTR ? 1 : 0).check();
   }
 
   static final _endArticle = jniLookup<
@@ -373,7 +377,7 @@
   /// End an article. Default implementation is to do nothing. Subclasses may provide additional information.
   ///@throws IOException If there is any error writing to the stream.
   void endArticle() {
-    return _endArticle(reference).check();
+    return _endArticle(reference.pointer).check();
   }
 
   static final _startPage = jniLookup<
@@ -392,7 +396,7 @@
   void startPage(
     jni.JObject page,
   ) {
-    return _startPage(reference, page.reference).check();
+    return _startPage(reference.pointer, page.reference.pointer).check();
   }
 
   static final _endPage = jniLookup<
@@ -411,7 +415,7 @@
   void endPage(
     jni.JObject page,
   ) {
-    return _endPage(reference, page.reference).check();
+    return _endPage(reference.pointer, page.reference.pointer).check();
   }
 
   static final _writePage = jniLookup<
@@ -427,7 +431,7 @@
   /// enabled.
   ///@throws IOException If there is an error writing the text.
   void writePage() {
-    return _writePage(reference).check();
+    return _writePage(reference.pointer).check();
   }
 
   static final _writeLineSeparator = jniLookup<
@@ -441,7 +445,7 @@
   /// Write the line separator value to the output stream.
   ///@throws IOException If there is a problem writing out the line separator to the document.
   void writeLineSeparator() {
-    return _writeLineSeparator(reference).check();
+    return _writeLineSeparator(reference.pointer).check();
   }
 
   static final _writeWordSeparator = jniLookup<
@@ -455,7 +459,7 @@
   /// Write the word separator value to the output stream.
   ///@throws IOException If there is a problem writing out the word separator to the document.
   void writeWordSeparator() {
-    return _writeWordSeparator(reference).check();
+    return _writeWordSeparator(reference.pointer).check();
   }
 
   static final _writeCharacters = jniLookup<
@@ -474,7 +478,7 @@
   void writeCharacters(
     jni.JObject text,
   ) {
-    return _writeCharacters(reference, text.reference).check();
+    return _writeCharacters(reference.pointer, text.reference.pointer).check();
   }
 
   static final _writeString = jniLookup<
@@ -498,7 +502,8 @@
     jni.JString text,
     jni.JList<jni.JObject> textPositions,
   ) {
-    return _writeString(reference, text.reference, textPositions.reference)
+    return _writeString(reference.pointer, text.reference.pointer,
+            textPositions.reference.pointer)
         .check();
   }
 
@@ -518,7 +523,7 @@
   void writeString1(
     jni.JString text,
   ) {
-    return _writeString1(reference, text.reference).check();
+    return _writeString1(reference.pointer, text.reference.pointer).check();
   }
 
   static final _processTextPosition = jniLookup<
@@ -538,7 +543,8 @@
   void processTextPosition(
     jni.JObject text,
   ) {
-    return _processTextPosition(reference, text.reference).check();
+    return _processTextPosition(reference.pointer, text.reference.pointer)
+        .check();
   }
 
   static final _getStartPage = jniLookup<
@@ -554,7 +560,7 @@
   /// be extracted. The default value is 1.
   ///@return Value of property startPage.
   int getStartPage() {
-    return _getStartPage(reference).integer;
+    return _getStartPage(reference.pointer).integer;
   }
 
   static final _setStartPage = jniLookup<
@@ -570,7 +576,7 @@
   void setStartPage(
     int startPageValue,
   ) {
-    return _setStartPage(reference, startPageValue).check();
+    return _setStartPage(reference.pointer, startPageValue).check();
   }
 
   static final _getEndPage = jniLookup<
@@ -586,7 +592,7 @@
   /// Integer.MAX_VALUE such that all pages of the pdf will be extracted.
   ///@return Value of property endPage.
   int getEndPage() {
-    return _getEndPage(reference).integer;
+    return _getEndPage(reference.pointer).integer;
   }
 
   static final _setEndPage = jniLookup<
@@ -602,7 +608,7 @@
   void setEndPage(
     int endPageValue,
   ) {
-    return _setEndPage(reference, endPageValue).check();
+    return _setEndPage(reference.pointer, endPageValue).check();
   }
 
   static final _setLineSeparator = jniLookup<
@@ -621,7 +627,8 @@
   void setLineSeparator(
     jni.JString separator,
   ) {
-    return _setLineSeparator(reference, separator.reference).check();
+    return _setLineSeparator(reference.pointer, separator.reference.pointer)
+        .check();
   }
 
   static final _getLineSeparator = jniLookup<
@@ -636,7 +643,8 @@
   /// This will get the line separator.
   ///@return The desired line separator string.
   jni.JString getLineSeparator() {
-    return const jni.JStringType().fromRef(_getLineSeparator(reference).object);
+    return const jni.JStringType()
+        .fromRef(_getLineSeparator(reference.pointer).object);
   }
 
   static final _getWordSeparator = jniLookup<
@@ -651,7 +659,8 @@
   /// This will get the word separator.
   ///@return The desired word separator string.
   jni.JString getWordSeparator() {
-    return const jni.JStringType().fromRef(_getWordSeparator(reference).object);
+    return const jni.JStringType()
+        .fromRef(_getWordSeparator(reference.pointer).object);
   }
 
   static final _setWordSeparator = jniLookup<
@@ -672,7 +681,8 @@
   void setWordSeparator(
     jni.JString separator,
   ) {
-    return _setWordSeparator(reference, separator.reference).check();
+    return _setWordSeparator(reference.pointer, separator.reference.pointer)
+        .check();
   }
 
   static final _getSuppressDuplicateOverlappingText = jniLookup<
@@ -685,7 +695,7 @@
   ///
   /// @return Returns the suppressDuplicateOverlappingText.
   bool getSuppressDuplicateOverlappingText() {
-    return _getSuppressDuplicateOverlappingText(reference).boolean;
+    return _getSuppressDuplicateOverlappingText(reference.pointer).boolean;
   }
 
   static final _getCurrentPageNo = jniLookup<
@@ -699,7 +709,7 @@
   /// Get the current page number that is being processed.
   ///@return A 1 based number representing the current page.
   int getCurrentPageNo() {
-    return _getCurrentPageNo(reference).integer;
+    return _getCurrentPageNo(reference.pointer).integer;
   }
 
   static final _getOutput = jniLookup<
@@ -714,7 +724,8 @@
   /// The output stream that is being written to.
   ///@return The stream that output is being written to.
   jni.JObject getOutput() {
-    return const jni.JObjectType().fromRef(_getOutput(reference).object);
+    return const jni.JObjectType()
+        .fromRef(_getOutput(reference.pointer).object);
   }
 
   static final _getCharactersByArticle = jniLookup<
@@ -731,7 +742,7 @@
   ///@return A double List of TextPositions for all text strings on the page.
   jni.JList<jni.JList<jni.JObject>> getCharactersByArticle() {
     return const jni.JListType(jni.JListType(jni.JObjectType()))
-        .fromRef(_getCharactersByArticle(reference).object);
+        .fromRef(_getCharactersByArticle(reference.pointer).object);
   }
 
   static final _setSuppressDuplicateOverlappingText = jniLookup<
@@ -750,7 +761,7 @@
     bool suppressDuplicateOverlappingTextValue,
   ) {
     return _setSuppressDuplicateOverlappingText(
-            reference, suppressDuplicateOverlappingTextValue ? 1 : 0)
+            reference.pointer, suppressDuplicateOverlappingTextValue ? 1 : 0)
         .check();
   }
 
@@ -765,7 +776,7 @@
   /// This will tell if the text stripper should separate by beads.
   ///@return If the text will be grouped by beads.
   bool getSeparateByBeads() {
-    return _getSeparateByBeads(reference).boolean;
+    return _getSeparateByBeads(reference.pointer).boolean;
   }
 
   static final _setShouldSeparateByBeads = jniLookup<
@@ -781,7 +792,8 @@
   void setShouldSeparateByBeads(
     bool aShouldSeparateByBeads,
   ) {
-    return _setShouldSeparateByBeads(reference, aShouldSeparateByBeads ? 1 : 0)
+    return _setShouldSeparateByBeads(
+            reference.pointer, aShouldSeparateByBeads ? 1 : 0)
         .check();
   }
 
@@ -797,7 +809,8 @@
   /// Get the bookmark where text extraction should end, inclusive. Default is null.
   ///@return The ending bookmark.
   jni.JObject getEndBookmark() {
-    return const jni.JObjectType().fromRef(_getEndBookmark(reference).object);
+    return const jni.JObjectType()
+        .fromRef(_getEndBookmark(reference.pointer).object);
   }
 
   static final _setEndBookmark = jniLookup<
@@ -815,7 +828,8 @@
   void setEndBookmark(
     jni.JObject aEndBookmark,
   ) {
-    return _setEndBookmark(reference, aEndBookmark.reference).check();
+    return _setEndBookmark(reference.pointer, aEndBookmark.reference.pointer)
+        .check();
   }
 
   static final _getStartBookmark = jniLookup<
@@ -830,7 +844,8 @@
   /// Get the bookmark where text extraction should start, inclusive. Default is null.
   ///@return The starting bookmark.
   jni.JObject getStartBookmark() {
-    return const jni.JObjectType().fromRef(_getStartBookmark(reference).object);
+    return const jni.JObjectType()
+        .fromRef(_getStartBookmark(reference.pointer).object);
   }
 
   static final _setStartBookmark = jniLookup<
@@ -848,7 +863,9 @@
   void setStartBookmark(
     jni.JObject aStartBookmark,
   ) {
-    return _setStartBookmark(reference, aStartBookmark.reference).check();
+    return _setStartBookmark(
+            reference.pointer, aStartBookmark.reference.pointer)
+        .check();
   }
 
   static final _getAddMoreFormatting = jniLookup<
@@ -862,7 +879,7 @@
   /// This will tell if the text stripper should add some more text formatting.
   ///@return true if some more text formatting will be added
   bool getAddMoreFormatting() {
-    return _getAddMoreFormatting(reference).boolean;
+    return _getAddMoreFormatting(reference.pointer).boolean;
   }
 
   static final _setAddMoreFormatting = jniLookup<
@@ -878,7 +895,8 @@
   void setAddMoreFormatting(
     bool newAddMoreFormatting,
   ) {
-    return _setAddMoreFormatting(reference, newAddMoreFormatting ? 1 : 0)
+    return _setAddMoreFormatting(
+            reference.pointer, newAddMoreFormatting ? 1 : 0)
         .check();
   }
 
@@ -893,7 +911,7 @@
   /// This will tell if the text stripper should sort the text tokens before writing to the stream.
   ///@return true If the text tokens will be sorted before being written.
   bool getSortByPosition() {
-    return _getSortByPosition(reference).boolean;
+    return _getSortByPosition(reference.pointer).boolean;
   }
 
   static final _setSortByPosition = jniLookup<
@@ -915,7 +933,8 @@
   void setSortByPosition(
     bool newSortByPosition,
   ) {
-    return _setSortByPosition(reference, newSortByPosition ? 1 : 0).check();
+    return _setSortByPosition(reference.pointer, newSortByPosition ? 1 : 0)
+        .check();
   }
 
   static final _getSpacingTolerance = jniLookup<
@@ -930,7 +949,7 @@
   /// added. Note that the default value for this has been determined from trial and error.
   ///@return The current tolerance / scaling factor
   double getSpacingTolerance() {
-    return _getSpacingTolerance(reference).float;
+    return _getSpacingTolerance(reference.pointer).float;
   }
 
   static final _setSpacingTolerance = jniLookup<
@@ -948,7 +967,8 @@
   void setSpacingTolerance(
     double spacingToleranceValue,
   ) {
-    return _setSpacingTolerance(reference, spacingToleranceValue).check();
+    return _setSpacingTolerance(reference.pointer, spacingToleranceValue)
+        .check();
   }
 
   static final _getAverageCharTolerance = jniLookup<
@@ -963,7 +983,7 @@
   /// be added. Note that the default value for this has been determined from trial and error.
   ///@return The current tolerance / scaling factor
   double getAverageCharTolerance() {
-    return _getAverageCharTolerance(reference).float;
+    return _getAverageCharTolerance(reference.pointer).float;
   }
 
   static final _setAverageCharTolerance = jniLookup<
@@ -981,7 +1001,8 @@
   void setAverageCharTolerance(
     double averageCharToleranceValue,
   ) {
-    return _setAverageCharTolerance(reference, averageCharToleranceValue)
+    return _setAverageCharTolerance(
+            reference.pointer, averageCharToleranceValue)
         .check();
   }
 
@@ -997,7 +1018,7 @@
   /// indented from the previous line start beyond which the current line start is considered to be a paragraph start.
   ///@return the number of whitespace character widths to use when detecting paragraph indents.
   double getIndentThreshold() {
-    return _getIndentThreshold(reference).float;
+    return _getIndentThreshold(reference.pointer).float;
   }
 
   static final _setIndentThreshold = jniLookup<
@@ -1015,7 +1036,7 @@
   void setIndentThreshold(
     double indentThresholdValue,
   ) {
-    return _setIndentThreshold(reference, indentThresholdValue).check();
+    return _setIndentThreshold(reference.pointer, indentThresholdValue).check();
   }
 
   static final _getDropThreshold = jniLookup<
@@ -1030,7 +1051,7 @@
   /// start is considered to be a paragraph start.
   ///@return the character height multiple for max allowed whitespace between lines in the same paragraph.
   double getDropThreshold() {
-    return _getDropThreshold(reference).float;
+    return _getDropThreshold(reference.pointer).float;
   }
 
   static final _setDropThreshold = jniLookup<
@@ -1048,7 +1069,7 @@
   void setDropThreshold(
     double dropThresholdValue,
   ) {
-    return _setDropThreshold(reference, dropThresholdValue).check();
+    return _setDropThreshold(reference.pointer, dropThresholdValue).check();
   }
 
   static final _getParagraphStart = jniLookup<
@@ -1064,7 +1085,7 @@
   ///@return the paragraph start string
   jni.JString getParagraphStart() {
     return const jni.JStringType()
-        .fromRef(_getParagraphStart(reference).object);
+        .fromRef(_getParagraphStart(reference.pointer).object);
   }
 
   static final _setParagraphStart = jniLookup<
@@ -1082,7 +1103,7 @@
   void setParagraphStart(
     jni.JString s,
   ) {
-    return _setParagraphStart(reference, s.reference).check();
+    return _setParagraphStart(reference.pointer, s.reference.pointer).check();
   }
 
   static final _getParagraphEnd = jniLookup<
@@ -1097,7 +1118,8 @@
   /// Returns the string which will be used at the end of a paragraph.
   ///@return the paragraph end string
   jni.JString getParagraphEnd() {
-    return const jni.JStringType().fromRef(_getParagraphEnd(reference).object);
+    return const jni.JStringType()
+        .fromRef(_getParagraphEnd(reference.pointer).object);
   }
 
   static final _setParagraphEnd = jniLookup<
@@ -1115,7 +1137,7 @@
   void setParagraphEnd(
     jni.JString s,
   ) {
-    return _setParagraphEnd(reference, s.reference).check();
+    return _setParagraphEnd(reference.pointer, s.reference.pointer).check();
   }
 
   static final _getPageStart = jniLookup<
@@ -1130,7 +1152,8 @@
   /// Returns the string which will be used at the beginning of a page.
   ///@return the page start string
   jni.JString getPageStart() {
-    return const jni.JStringType().fromRef(_getPageStart(reference).object);
+    return const jni.JStringType()
+        .fromRef(_getPageStart(reference.pointer).object);
   }
 
   static final _setPageStart = jniLookup<
@@ -1148,7 +1171,8 @@
   void setPageStart(
     jni.JString pageStartValue,
   ) {
-    return _setPageStart(reference, pageStartValue.reference).check();
+    return _setPageStart(reference.pointer, pageStartValue.reference.pointer)
+        .check();
   }
 
   static final _getPageEnd = jniLookup<
@@ -1163,7 +1187,8 @@
   /// Returns the string which will be used at the end of a page.
   ///@return the page end string
   jni.JString getPageEnd() {
-    return const jni.JStringType().fromRef(_getPageEnd(reference).object);
+    return const jni.JStringType()
+        .fromRef(_getPageEnd(reference.pointer).object);
   }
 
   static final _setPageEnd = jniLookup<
@@ -1181,7 +1206,8 @@
   void setPageEnd(
     jni.JString pageEndValue,
   ) {
-    return _setPageEnd(reference, pageEndValue.reference).check();
+    return _setPageEnd(reference.pointer, pageEndValue.reference.pointer)
+        .check();
   }
 
   static final _getArticleStart = jniLookup<
@@ -1196,7 +1222,8 @@
   /// Returns the string which will be used at the beginning of an article.
   ///@return the article start string
   jni.JString getArticleStart() {
-    return const jni.JStringType().fromRef(_getArticleStart(reference).object);
+    return const jni.JStringType()
+        .fromRef(_getArticleStart(reference.pointer).object);
   }
 
   static final _setArticleStart = jniLookup<
@@ -1214,7 +1241,9 @@
   void setArticleStart(
     jni.JString articleStartValue,
   ) {
-    return _setArticleStart(reference, articleStartValue.reference).check();
+    return _setArticleStart(
+            reference.pointer, articleStartValue.reference.pointer)
+        .check();
   }
 
   static final _getArticleEnd = jniLookup<
@@ -1229,7 +1258,8 @@
   /// Returns the string which will be used at the end of an article.
   ///@return the article end string
   jni.JString getArticleEnd() {
-    return const jni.JStringType().fromRef(_getArticleEnd(reference).object);
+    return const jni.JStringType()
+        .fromRef(_getArticleEnd(reference.pointer).object);
   }
 
   static final _setArticleEnd = jniLookup<
@@ -1247,7 +1277,8 @@
   void setArticleEnd(
     jni.JString articleEndValue,
   ) {
-    return _setArticleEnd(reference, articleEndValue.reference).check();
+    return _setArticleEnd(reference.pointer, articleEndValue.reference.pointer)
+        .check();
   }
 
   static final _writeParagraphSeparator = jniLookup<
@@ -1261,7 +1292,7 @@
   /// writes the paragraph separator string to the output.
   ///@throws IOException if something went wrong
   void writeParagraphSeparator() {
-    return _writeParagraphSeparator(reference).check();
+    return _writeParagraphSeparator(reference.pointer).check();
   }
 
   static final _writeParagraphStart = jniLookup<
@@ -1275,7 +1306,7 @@
   /// Write something (if defined) at the start of a paragraph.
   ///@throws IOException if something went wrong
   void writeParagraphStart() {
-    return _writeParagraphStart(reference).check();
+    return _writeParagraphStart(reference.pointer).check();
   }
 
   static final _writeParagraphEnd = jniLookup<
@@ -1289,7 +1320,7 @@
   /// Write something (if defined) at the end of a paragraph.
   ///@throws IOException if something went wrong
   void writeParagraphEnd() {
-    return _writeParagraphEnd(reference).check();
+    return _writeParagraphEnd(reference.pointer).check();
   }
 
   static final _writePageStart = jniLookup<
@@ -1303,7 +1334,7 @@
   /// Write something (if defined) at the start of a page.
   ///@throws IOException if something went wrong
   void writePageStart() {
-    return _writePageStart(reference).check();
+    return _writePageStart(reference.pointer).check();
   }
 
   static final _writePageEnd = jniLookup<
@@ -1317,7 +1348,7 @@
   /// Write something (if defined) at the end of a page.
   ///@throws IOException if something went wrong
   void writePageEnd() {
-    return _writePageEnd(reference).check();
+    return _writePageEnd(reference.pointer).check();
   }
 
   static final _setListItemPatterns = jniLookup<
@@ -1336,7 +1367,8 @@
   void setListItemPatterns(
     jni.JList<jni.JObject> patterns,
   ) {
-    return _setListItemPatterns(reference, patterns.reference).check();
+    return _setListItemPatterns(reference.pointer, patterns.reference.pointer)
+        .check();
   }
 
   static final _getListItemPatterns = jniLookup<
@@ -1366,7 +1398,7 @@
   ///@return a list of Pattern objects.
   jni.JList<jni.JObject> getListItemPatterns() {
     return const jni.JListType(jni.JObjectType())
-        .fromRef(_getListItemPatterns(reference).object);
+        .fromRef(_getListItemPatterns(reference.pointer).object);
   }
 
   static final _matchPattern = jniLookup<
@@ -1394,8 +1426,9 @@
     jni.JString string,
     jni.JList<jni.JObject> patterns,
   ) {
-    return const jni.JObjectType()
-        .fromRef(_matchPattern(string.reference, patterns.reference).object);
+    return const jni.JObjectType().fromRef(
+        _matchPattern(string.reference.pointer, patterns.reference.pointer)
+            .object);
   }
 }
 
diff --git a/pkgs/jnigen/lib/src/bindings/dart_generator.dart b/pkgs/jnigen/lib/src/bindings/dart_generator.dart
index fb76f15..843f684 100644
--- a/pkgs/jnigen/lib/src/bindings/dart_generator.dart
+++ b/pkgs/jnigen/lib/src/bindings/dart_generator.dart
@@ -35,11 +35,11 @@
 
 // Misc.
 const _protectedExtension = 'ProtectedJniExtensions';
-const _classRef = '_class.reference';
+const _classRef = '_class.reference.pointer';
 const _env = '$_jni.Jni.env';
 const _accessors = '$_jni.Jni.accessors';
 const _lookup = 'jniLookup';
-const _selfPointer = 'reference';
+const _selfPointer = 'reference.pointer';
 
 // Docs.
 const _releaseInstruction =
@@ -1307,7 +1307,7 @@
     final \$c = $_jObject.fromRef($_protectedExtension.newPortContinuation(\$p));
     $callExpr;
     final \$o = $_jPointer.fromAddress(await \$p.first);
-    final \$k = $returnTypeClass.getClass().reference;
+    final \$k = $returnTypeClass.getClass().reference.pointer;
     if (!$_jni.Jni.env.IsInstanceOf(\$o, \$k)) {
       throw "Failed";
     }
@@ -1385,9 +1385,9 @@
 
 /// Method parameter used in calling the native method.
 ///
-/// For example `foo.reference` in:
+/// For example `foo.reference.pointer` in:
 /// ```dart
-/// void bar(Foo foo) => _bar(foo.reference);
+/// void bar(Foo foo) => _bar(foo.reference.pointer);
 /// ```
 class _ParamCall extends Visitor<Param, String> {
   final bool isCBased;
@@ -1702,7 +1702,7 @@
 /// `toPointer` detaches the object from the [NativeFinalizer] and Java
 /// will clean up the global reference afterwards.
 ///
-/// For example `$r.toJInteger().toPointer()` when the return
+/// For example `$r.toJInteger().reference.toPointer()` when the return
 /// type is `integer`.
 class _InterfaceReturnBox extends TypeVisitor<String> {
   const _InterfaceReturnBox();
@@ -1712,7 +1712,7 @@
     // Casting is done to create a new global reference. The user might
     // use the original reference elsewhere and so the original object
     // should not be [setAsReleased].
-    return '(\$r as $_jObject).castTo(const ${_jObject}Type()).toPointer()';
+    return '(\$r as $_jObject).castTo(const ${_jObject}Type()).reference.toPointer()';
   }
 
   @override
@@ -1720,6 +1720,6 @@
     if (node.name == 'void') {
       return '$_jni.nullptr';
     }
-    return '$_jni.J${node.boxedName}(\$r).toPointer()';
+    return '$_jni.J${node.boxedName}(\$r).reference.toPointer()';
   }
 }
diff --git a/pkgs/jnigen/test/jackson_core_test/third_party/c_based/dart_bindings/com/fasterxml/jackson/core/JsonFactory.dart b/pkgs/jnigen/test/jackson_core_test/third_party/c_based/dart_bindings/com/fasterxml/jackson/core/JsonFactory.dart
index 6d5ff7a..5edb7b3 100644
--- a/pkgs/jnigen/test/jackson_core_test/third_party/c_based/dart_bindings/com/fasterxml/jackson/core/JsonFactory.dart
+++ b/pkgs/jnigen/test/jackson_core_test/third_party/c_based/dart_bindings/com/fasterxml/jackson/core/JsonFactory.dart
@@ -80,7 +80,7 @@
     jni.JString name,
   ) {
     return const $JsonFactory_FeatureType()
-        .fromRef(_valueOf(name.reference).object);
+        .fromRef(_valueOf(name.reference.pointer).object);
   }
 
   static final _collectDefaults =
@@ -105,7 +105,7 @@
 
   /// from: public boolean enabledByDefault()
   bool enabledByDefault() {
-    return _enabledByDefault(reference).boolean;
+    return _enabledByDefault(reference.pointer).boolean;
   }
 
   static final _enabledIn = jniLookup<
@@ -118,7 +118,7 @@
   bool enabledIn(
     int flags,
   ) {
-    return _enabledIn(reference, flags).boolean;
+    return _enabledIn(reference.pointer, flags).boolean;
   }
 
   static final _getMask = jniLookup<
@@ -129,7 +129,7 @@
 
   /// from: public int getMask()
   int getMask() {
-    return _getMask(reference).integer;
+    return _getMask(reference.pointer).integer;
   }
 }
 
@@ -276,7 +276,7 @@
   factory JsonFactory.new1(
     jni.JObject oc,
   ) {
-    return JsonFactory.fromRef(_new1(oc.reference).object);
+    return JsonFactory.fromRef(_new1(oc.reference.pointer).object);
   }
 
   static final _new2 = jniLookup<
@@ -298,7 +298,8 @@
     JsonFactory src,
     jni.JObject codec,
   ) {
-    return JsonFactory.fromRef(_new2(src.reference, codec.reference).object);
+    return JsonFactory.fromRef(
+        _new2(src.reference.pointer, codec.reference.pointer).object);
   }
 
   static final _new3 = jniLookup<
@@ -316,7 +317,7 @@
   factory JsonFactory.new3(
     jni.JObject b,
   ) {
-    return JsonFactory.fromRef(_new3(b.reference).object);
+    return JsonFactory.fromRef(_new3(b.reference.pointer).object);
   }
 
   static final _new4 = jniLookup<
@@ -337,7 +338,8 @@
     jni.JObject b,
     bool bogus,
   ) {
-    return JsonFactory.fromRef(_new4(b.reference, bogus ? 1 : 0).object);
+    return JsonFactory.fromRef(
+        _new4(b.reference.pointer, bogus ? 1 : 0).object);
   }
 
   static final _rebuild = jniLookup<
@@ -354,7 +356,7 @@
   ///@return Builder instance to use
   ///@since 2.10
   jni.JObject rebuild() {
-    return const jni.JObjectType().fromRef(_rebuild(reference).object);
+    return const jni.JObjectType().fromRef(_rebuild(reference.pointer).object);
   }
 
   static final _builder =
@@ -399,7 +401,7 @@
   ///@return Copy of this factory instance
   ///@since 2.1
   JsonFactory copy() {
-    return const $JsonFactoryType().fromRef(_copy(reference).object);
+    return const $JsonFactoryType().fromRef(_copy(reference.pointer).object);
   }
 
   static final _readResolve = jniLookup<
@@ -418,7 +420,8 @@
   /// Note: must be overridden by sub-classes as well.
   ///@return Newly constructed instance
   jni.JObject readResolve() {
-    return const jni.JObjectType().fromRef(_readResolve(reference).object);
+    return const jni.JObjectType()
+        .fromRef(_readResolve(reference.pointer).object);
   }
 
   static final _requiresPropertyOrdering = jniLookup<
@@ -444,7 +447,7 @@
   ///   requires Object properties to be ordered.
   ///@since 2.3
   bool requiresPropertyOrdering() {
-    return _requiresPropertyOrdering(reference).boolean;
+    return _requiresPropertyOrdering(reference.pointer).boolean;
   }
 
   static final _canHandleBinaryNatively = jniLookup<
@@ -467,7 +470,7 @@
   ///    supports native binary content
   ///@since 2.3
   bool canHandleBinaryNatively() {
-    return _canHandleBinaryNatively(reference).boolean;
+    return _canHandleBinaryNatively(reference.pointer).boolean;
   }
 
   static final _canUseCharArrays = jniLookup<
@@ -490,7 +493,7 @@
   ///   accessed using parser method {@code getTextCharacters()}.
   ///@since 2.4
   bool canUseCharArrays() {
-    return _canUseCharArrays(reference).boolean;
+    return _canUseCharArrays(reference.pointer).boolean;
   }
 
   static final _canParseAsync = jniLookup<
@@ -509,7 +512,7 @@
   ///    not (and consequently whether {@code createNonBlockingXxx()} method(s) work)
   ///@since 2.9
   bool canParseAsync() {
-    return _canParseAsync(reference).boolean;
+    return _canParseAsync(reference.pointer).boolean;
   }
 
   static final _getFormatReadFeatureType = jniLookup<
@@ -522,7 +525,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject getFormatReadFeatureType() {
     return const jni.JObjectType()
-        .fromRef(_getFormatReadFeatureType(reference).object);
+        .fromRef(_getFormatReadFeatureType(reference.pointer).object);
   }
 
   static final _getFormatWriteFeatureType = jniLookup<
@@ -535,7 +538,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject getFormatWriteFeatureType() {
     return const jni.JObjectType()
-        .fromRef(_getFormatWriteFeatureType(reference).object);
+        .fromRef(_getFormatWriteFeatureType(reference.pointer).object);
   }
 
   static final _canUseSchema = jniLookup<
@@ -560,7 +563,7 @@
   bool canUseSchema(
     jni.JObject schema,
   ) {
-    return _canUseSchema(reference, schema.reference).boolean;
+    return _canUseSchema(reference.pointer, schema.reference.pointer).boolean;
   }
 
   static final _getFormatName = jniLookup<
@@ -579,7 +582,8 @@
   /// implementation will return null for all sub-classes
   ///@return Name of the format handled by parsers, generators this factory creates
   jni.JString getFormatName() {
-    return const jni.JStringType().fromRef(_getFormatName(reference).object);
+    return const jni.JStringType()
+        .fromRef(_getFormatName(reference.pointer).object);
   }
 
   static final _hasFormat = jniLookup<
@@ -596,7 +600,7 @@
     jni.JObject acc,
   ) {
     return const jni.JObjectType()
-        .fromRef(_hasFormat(reference, acc.reference).object);
+        .fromRef(_hasFormat(reference.pointer, acc.reference.pointer).object);
   }
 
   static final _requiresCustomCodec = jniLookup<
@@ -617,7 +621,7 @@
   ///   ObjectCodec is enough
   ///@since 2.1
   bool requiresCustomCodec() {
-    return _requiresCustomCodec(reference).boolean;
+    return _requiresCustomCodec(reference.pointer).boolean;
   }
 
   static final _hasJSONFormat = jniLookup<
@@ -633,8 +637,8 @@
   jni.JObject hasJSONFormat(
     jni.JObject acc,
   ) {
-    return const jni.JObjectType()
-        .fromRef(_hasJSONFormat(reference, acc.reference).object);
+    return const jni.JObjectType().fromRef(
+        _hasJSONFormat(reference.pointer, acc.reference.pointer).object);
   }
 
   static final _version = jniLookup<
@@ -646,7 +650,7 @@
   /// from: public com.fasterxml.jackson.core.Version version()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject version() {
-    return const jni.JObjectType().fromRef(_version(reference).object);
+    return const jni.JObjectType().fromRef(_version(reference.pointer).object);
   }
 
   static final _configure = jniLookup<
@@ -670,8 +674,9 @@
     JsonFactory_Feature f,
     bool state,
   ) {
-    return const $JsonFactoryType()
-        .fromRef(_configure(reference, f.reference, state ? 1 : 0).object);
+    return const $JsonFactoryType().fromRef(
+        _configure(reference.pointer, f.reference.pointer, state ? 1 : 0)
+            .object);
   }
 
   static final _enable = jniLookup<
@@ -694,7 +699,7 @@
     JsonFactory_Feature f,
   ) {
     return const $JsonFactoryType()
-        .fromRef(_enable(reference, f.reference).object);
+        .fromRef(_enable(reference.pointer, f.reference.pointer).object);
   }
 
   static final _disable = jniLookup<
@@ -717,7 +722,7 @@
     JsonFactory_Feature f,
   ) {
     return const $JsonFactoryType()
-        .fromRef(_disable(reference, f.reference).object);
+        .fromRef(_disable(reference.pointer, f.reference.pointer).object);
   }
 
   static final _isEnabled = jniLookup<
@@ -736,7 +741,7 @@
   bool isEnabled(
     JsonFactory_Feature f,
   ) {
-    return _isEnabled(reference, f.reference).boolean;
+    return _isEnabled(reference.pointer, f.reference.pointer).boolean;
   }
 
   static final _getParserFeatures = jniLookup<
@@ -747,7 +752,7 @@
 
   /// from: public final int getParserFeatures()
   int getParserFeatures() {
-    return _getParserFeatures(reference).integer;
+    return _getParserFeatures(reference.pointer).integer;
   }
 
   static final _getGeneratorFeatures = jniLookup<
@@ -758,7 +763,7 @@
 
   /// from: public final int getGeneratorFeatures()
   int getGeneratorFeatures() {
-    return _getGeneratorFeatures(reference).integer;
+    return _getGeneratorFeatures(reference.pointer).integer;
   }
 
   static final _getFormatParserFeatures = jniLookup<
@@ -769,7 +774,7 @@
 
   /// from: public int getFormatParserFeatures()
   int getFormatParserFeatures() {
-    return _getFormatParserFeatures(reference).integer;
+    return _getFormatParserFeatures(reference.pointer).integer;
   }
 
   static final _getFormatGeneratorFeatures = jniLookup<
@@ -780,7 +785,7 @@
 
   /// from: public int getFormatGeneratorFeatures()
   int getFormatGeneratorFeatures() {
-    return _getFormatGeneratorFeatures(reference).integer;
+    return _getFormatGeneratorFeatures(reference.pointer).integer;
   }
 
   static final _configure1 = jniLookup<
@@ -803,8 +808,9 @@
     jsonparser_.JsonParser_Feature f,
     bool state,
   ) {
-    return const $JsonFactoryType()
-        .fromRef(_configure1(reference, f.reference, state ? 1 : 0).object);
+    return const $JsonFactoryType().fromRef(
+        _configure1(reference.pointer, f.reference.pointer, state ? 1 : 0)
+            .object);
   }
 
   static final _enable1 = jniLookup<
@@ -826,7 +832,7 @@
     jsonparser_.JsonParser_Feature f,
   ) {
     return const $JsonFactoryType()
-        .fromRef(_enable1(reference, f.reference).object);
+        .fromRef(_enable1(reference.pointer, f.reference.pointer).object);
   }
 
   static final _disable1 = jniLookup<
@@ -848,7 +854,7 @@
     jsonparser_.JsonParser_Feature f,
   ) {
     return const $JsonFactoryType()
-        .fromRef(_disable1(reference, f.reference).object);
+        .fromRef(_disable1(reference.pointer, f.reference.pointer).object);
   }
 
   static final _isEnabled1 = jniLookup<
@@ -867,7 +873,7 @@
   bool isEnabled1(
     jsonparser_.JsonParser_Feature f,
   ) {
-    return _isEnabled1(reference, f.reference).boolean;
+    return _isEnabled1(reference.pointer, f.reference.pointer).boolean;
   }
 
   static final _isEnabled2 = jniLookup<
@@ -887,7 +893,7 @@
   bool isEnabled2(
     jni.JObject f,
   ) {
-    return _isEnabled2(reference, f.reference).boolean;
+    return _isEnabled2(reference.pointer, f.reference.pointer).boolean;
   }
 
   static final _getInputDecorator = jniLookup<
@@ -904,7 +910,7 @@
   ///@return InputDecorator configured, if any
   jni.JObject getInputDecorator() {
     return const jni.JObjectType()
-        .fromRef(_getInputDecorator(reference).object);
+        .fromRef(_getInputDecorator(reference.pointer).object);
   }
 
   static final _setInputDecorator = jniLookup<
@@ -925,8 +931,8 @@
   JsonFactory setInputDecorator(
     jni.JObject d,
   ) {
-    return const $JsonFactoryType()
-        .fromRef(_setInputDecorator(reference, d.reference).object);
+    return const $JsonFactoryType().fromRef(
+        _setInputDecorator(reference.pointer, d.reference.pointer).object);
   }
 
   static final _configure2 = jniLookup<
@@ -949,8 +955,9 @@
     jni.JObject f,
     bool state,
   ) {
-    return const $JsonFactoryType()
-        .fromRef(_configure2(reference, f.reference, state ? 1 : 0).object);
+    return const $JsonFactoryType().fromRef(
+        _configure2(reference.pointer, f.reference.pointer, state ? 1 : 0)
+            .object);
   }
 
   static final _enable2 = jniLookup<
@@ -972,7 +979,7 @@
     jni.JObject f,
   ) {
     return const $JsonFactoryType()
-        .fromRef(_enable2(reference, f.reference).object);
+        .fromRef(_enable2(reference.pointer, f.reference.pointer).object);
   }
 
   static final _disable2 = jniLookup<
@@ -994,7 +1001,7 @@
     jni.JObject f,
   ) {
     return const $JsonFactoryType()
-        .fromRef(_disable2(reference, f.reference).object);
+        .fromRef(_disable2(reference.pointer, f.reference.pointer).object);
   }
 
   static final _isEnabled3 = jniLookup<
@@ -1013,7 +1020,7 @@
   bool isEnabled3(
     jni.JObject f,
   ) {
-    return _isEnabled3(reference, f.reference).boolean;
+    return _isEnabled3(reference.pointer, f.reference.pointer).boolean;
   }
 
   static final _isEnabled4 = jniLookup<
@@ -1033,7 +1040,7 @@
   bool isEnabled4(
     jni.JObject f,
   ) {
-    return _isEnabled4(reference, f.reference).boolean;
+    return _isEnabled4(reference.pointer, f.reference.pointer).boolean;
   }
 
   static final _getCharacterEscapes = jniLookup<
@@ -1050,7 +1057,7 @@
   ///@return Configured {@code CharacterEscapes}, if any; {@code null} if none
   jni.JObject getCharacterEscapes() {
     return const jni.JObjectType()
-        .fromRef(_getCharacterEscapes(reference).object);
+        .fromRef(_getCharacterEscapes(reference.pointer).object);
   }
 
   static final _setCharacterEscapes = jniLookup<
@@ -1071,8 +1078,8 @@
   JsonFactory setCharacterEscapes(
     jni.JObject esc,
   ) {
-    return const $JsonFactoryType()
-        .fromRef(_setCharacterEscapes(reference, esc.reference).object);
+    return const $JsonFactoryType().fromRef(
+        _setCharacterEscapes(reference.pointer, esc.reference.pointer).object);
   }
 
   static final _getOutputDecorator = jniLookup<
@@ -1090,7 +1097,7 @@
   ///    {@code null} if none.
   jni.JObject getOutputDecorator() {
     return const jni.JObjectType()
-        .fromRef(_getOutputDecorator(reference).object);
+        .fromRef(_getOutputDecorator(reference.pointer).object);
   }
 
   static final _setOutputDecorator = jniLookup<
@@ -1111,8 +1118,8 @@
   JsonFactory setOutputDecorator(
     jni.JObject d,
   ) {
-    return const $JsonFactoryType()
-        .fromRef(_setOutputDecorator(reference, d.reference).object);
+    return const $JsonFactoryType().fromRef(
+        _setOutputDecorator(reference.pointer, d.reference.pointer).object);
   }
 
   static final _setRootValueSeparator = jniLookup<
@@ -1134,8 +1141,9 @@
   JsonFactory setRootValueSeparator(
     jni.JString sep,
   ) {
-    return const $JsonFactoryType()
-        .fromRef(_setRootValueSeparator(reference, sep.reference).object);
+    return const $JsonFactoryType().fromRef(
+        _setRootValueSeparator(reference.pointer, sep.reference.pointer)
+            .object);
   }
 
   static final _getRootValueSeparator = jniLookup<
@@ -1150,7 +1158,7 @@
   /// @return Root value separator configured, if any
   jni.JString getRootValueSeparator() {
     return const jni.JStringType()
-        .fromRef(_getRootValueSeparator(reference).object);
+        .fromRef(_getRootValueSeparator(reference.pointer).object);
   }
 
   static final _setCodec = jniLookup<
@@ -1175,7 +1183,7 @@
     jni.JObject oc,
   ) {
     return const $JsonFactoryType()
-        .fromRef(_setCodec(reference, oc.reference).object);
+        .fromRef(_setCodec(reference.pointer, oc.reference.pointer).object);
   }
 
   static final _getCodec = jniLookup<
@@ -1187,7 +1195,7 @@
   /// from: public com.fasterxml.jackson.core.ObjectCodec getCodec()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject getCodec() {
-    return const jni.JObjectType().fromRef(_getCodec(reference).object);
+    return const jni.JObjectType().fromRef(_getCodec(reference.pointer).object);
   }
 
   static final _createParser = jniLookup<
@@ -1221,7 +1229,7 @@
     jni.JObject f,
   ) {
     return const jsonparser_.$JsonParserType()
-        .fromRef(_createParser(reference, f.reference).object);
+        .fromRef(_createParser(reference.pointer, f.reference.pointer).object);
   }
 
   static final _createParser1 = jniLookup<
@@ -1252,8 +1260,8 @@
   jsonparser_.JsonParser createParser1(
     jni.JObject url,
   ) {
-    return const jsonparser_.$JsonParserType()
-        .fromRef(_createParser1(reference, url.reference).object);
+    return const jsonparser_.$JsonParserType().fromRef(
+        _createParser1(reference.pointer, url.reference.pointer).object);
   }
 
   static final _createParser2 = jniLookup<
@@ -1287,8 +1295,8 @@
   jsonparser_.JsonParser createParser2(
     jni.JObject in0,
   ) {
-    return const jsonparser_.$JsonParserType()
-        .fromRef(_createParser2(reference, in0.reference).object);
+    return const jsonparser_.$JsonParserType().fromRef(
+        _createParser2(reference.pointer, in0.reference.pointer).object);
   }
 
   static final _createParser3 = jniLookup<
@@ -1316,7 +1324,7 @@
     jni.JObject r,
   ) {
     return const jsonparser_.$JsonParserType()
-        .fromRef(_createParser3(reference, r.reference).object);
+        .fromRef(_createParser3(reference.pointer, r.reference.pointer).object);
   }
 
   static final _createParser4 = jniLookup<
@@ -1336,8 +1344,8 @@
   jsonparser_.JsonParser createParser4(
     jni.JArray<jni.jbyte> data,
   ) {
-    return const jsonparser_.$JsonParserType()
-        .fromRef(_createParser4(reference, data.reference).object);
+    return const jsonparser_.$JsonParserType().fromRef(
+        _createParser4(reference.pointer, data.reference.pointer).object);
   }
 
   static final _createParser5 = jniLookup<
@@ -1365,8 +1373,9 @@
     int offset,
     int len,
   ) {
-    return const jsonparser_.$JsonParserType()
-        .fromRef(_createParser5(reference, data.reference, offset, len).object);
+    return const jsonparser_.$JsonParserType().fromRef(
+        _createParser5(reference.pointer, data.reference.pointer, offset, len)
+            .object);
   }
 
   static final _createParser6 = jniLookup<
@@ -1386,8 +1395,8 @@
   jsonparser_.JsonParser createParser6(
     jni.JString content,
   ) {
-    return const jsonparser_.$JsonParserType()
-        .fromRef(_createParser6(reference, content.reference).object);
+    return const jsonparser_.$JsonParserType().fromRef(
+        _createParser6(reference.pointer, content.reference.pointer).object);
   }
 
   static final _createParser7 = jniLookup<
@@ -1407,8 +1416,8 @@
   jsonparser_.JsonParser createParser7(
     jni.JArray<jni.jchar> content,
   ) {
-    return const jsonparser_.$JsonParserType()
-        .fromRef(_createParser7(reference, content.reference).object);
+    return const jsonparser_.$JsonParserType().fromRef(
+        _createParser7(reference.pointer, content.reference.pointer).object);
   }
 
   static final _createParser8 = jniLookup<
@@ -1432,8 +1441,9 @@
     int offset,
     int len,
   ) {
-    return const jsonparser_.$JsonParserType().fromRef(
-        _createParser8(reference, content.reference, offset, len).object);
+    return const jsonparser_.$JsonParserType().fromRef(_createParser8(
+            reference.pointer, content.reference.pointer, offset, len)
+        .object);
   }
 
   static final _createParser9 = jniLookup<
@@ -1456,8 +1466,8 @@
   jsonparser_.JsonParser createParser9(
     jni.JObject in0,
   ) {
-    return const jsonparser_.$JsonParserType()
-        .fromRef(_createParser9(reference, in0.reference).object);
+    return const jsonparser_.$JsonParserType().fromRef(
+        _createParser9(reference.pointer, in0.reference.pointer).object);
   }
 
   static final _createNonBlockingByteArrayParser = jniLookup<
@@ -1484,7 +1494,7 @@
   ///@since 2.9
   jsonparser_.JsonParser createNonBlockingByteArrayParser() {
     return const jsonparser_.$JsonParserType()
-        .fromRef(_createNonBlockingByteArrayParser(reference).object);
+        .fromRef(_createNonBlockingByteArrayParser(reference.pointer).object);
   }
 
   static final _createGenerator = jniLookup<
@@ -1522,8 +1532,9 @@
     jni.JObject out,
     jni.JObject enc,
   ) {
-    return const jni.JObjectType().fromRef(
-        _createGenerator(reference, out.reference, enc.reference).object);
+    return const jni.JObjectType().fromRef(_createGenerator(
+            reference.pointer, out.reference.pointer, enc.reference.pointer)
+        .object);
   }
 
   static final _createGenerator1 = jniLookup<
@@ -1545,8 +1556,8 @@
   jni.JObject createGenerator1(
     jni.JObject out,
   ) {
-    return const jni.JObjectType()
-        .fromRef(_createGenerator1(reference, out.reference).object);
+    return const jni.JObjectType().fromRef(
+        _createGenerator1(reference.pointer, out.reference.pointer).object);
   }
 
   static final _createGenerator2 = jniLookup<
@@ -1574,8 +1585,8 @@
   jni.JObject createGenerator2(
     jni.JObject w,
   ) {
-    return const jni.JObjectType()
-        .fromRef(_createGenerator2(reference, w.reference).object);
+    return const jni.JObjectType().fromRef(
+        _createGenerator2(reference.pointer, w.reference.pointer).object);
   }
 
   static final _createGenerator3 = jniLookup<
@@ -1607,8 +1618,9 @@
     jni.JObject f,
     jni.JObject enc,
   ) {
-    return const jni.JObjectType().fromRef(
-        _createGenerator3(reference, f.reference, enc.reference).object);
+    return const jni.JObjectType().fromRef(_createGenerator3(
+            reference.pointer, f.reference.pointer, enc.reference.pointer)
+        .object);
   }
 
   static final _createGenerator4 = jniLookup<
@@ -1631,8 +1643,9 @@
     jni.JObject out,
     jni.JObject enc,
   ) {
-    return const jni.JObjectType().fromRef(
-        _createGenerator4(reference, out.reference, enc.reference).object);
+    return const jni.JObjectType().fromRef(_createGenerator4(
+            reference.pointer, out.reference.pointer, enc.reference.pointer)
+        .object);
   }
 
   static final _createGenerator5 = jniLookup<
@@ -1654,8 +1667,8 @@
   jni.JObject createGenerator5(
     jni.JObject out,
   ) {
-    return const jni.JObjectType()
-        .fromRef(_createGenerator5(reference, out.reference).object);
+    return const jni.JObjectType().fromRef(
+        _createGenerator5(reference.pointer, out.reference.pointer).object);
   }
 
   static final _createJsonParser = jniLookup<
@@ -1690,8 +1703,8 @@
   jsonparser_.JsonParser createJsonParser(
     jni.JObject f,
   ) {
-    return const jsonparser_.$JsonParserType()
-        .fromRef(_createJsonParser(reference, f.reference).object);
+    return const jsonparser_.$JsonParserType().fromRef(
+        _createJsonParser(reference.pointer, f.reference.pointer).object);
   }
 
   static final _createJsonParser1 = jniLookup<
@@ -1725,8 +1738,8 @@
   jsonparser_.JsonParser createJsonParser1(
     jni.JObject url,
   ) {
-    return const jsonparser_.$JsonParserType()
-        .fromRef(_createJsonParser1(reference, url.reference).object);
+    return const jsonparser_.$JsonParserType().fromRef(
+        _createJsonParser1(reference.pointer, url.reference.pointer).object);
   }
 
   static final _createJsonParser2 = jniLookup<
@@ -1763,8 +1776,8 @@
   jsonparser_.JsonParser createJsonParser2(
     jni.JObject in0,
   ) {
-    return const jsonparser_.$JsonParserType()
-        .fromRef(_createJsonParser2(reference, in0.reference).object);
+    return const jsonparser_.$JsonParserType().fromRef(
+        _createJsonParser2(reference.pointer, in0.reference.pointer).object);
   }
 
   static final _createJsonParser3 = jniLookup<
@@ -1794,8 +1807,8 @@
   jsonparser_.JsonParser createJsonParser3(
     jni.JObject r,
   ) {
-    return const jsonparser_.$JsonParserType()
-        .fromRef(_createJsonParser3(reference, r.reference).object);
+    return const jsonparser_.$JsonParserType().fromRef(
+        _createJsonParser3(reference.pointer, r.reference.pointer).object);
   }
 
   static final _createJsonParser4 = jniLookup<
@@ -1818,8 +1831,8 @@
   jsonparser_.JsonParser createJsonParser4(
     jni.JArray<jni.jbyte> data,
   ) {
-    return const jsonparser_.$JsonParserType()
-        .fromRef(_createJsonParser4(reference, data.reference).object);
+    return const jsonparser_.$JsonParserType().fromRef(
+        _createJsonParser4(reference.pointer, data.reference.pointer).object);
   }
 
   static final _createJsonParser5 = jniLookup<
@@ -1850,8 +1863,9 @@
     int offset,
     int len,
   ) {
-    return const jsonparser_.$JsonParserType().fromRef(
-        _createJsonParser5(reference, data.reference, offset, len).object);
+    return const jsonparser_.$JsonParserType().fromRef(_createJsonParser5(
+            reference.pointer, data.reference.pointer, offset, len)
+        .object);
   }
 
   static final _createJsonParser6 = jniLookup<
@@ -1875,8 +1889,9 @@
   jsonparser_.JsonParser createJsonParser6(
     jni.JString content,
   ) {
-    return const jsonparser_.$JsonParserType()
-        .fromRef(_createJsonParser6(reference, content.reference).object);
+    return const jsonparser_.$JsonParserType().fromRef(
+        _createJsonParser6(reference.pointer, content.reference.pointer)
+            .object);
   }
 
   static final _createJsonGenerator = jniLookup<
@@ -1916,8 +1931,9 @@
     jni.JObject out,
     jni.JObject enc,
   ) {
-    return const jni.JObjectType().fromRef(
-        _createJsonGenerator(reference, out.reference, enc.reference).object);
+    return const jni.JObjectType().fromRef(_createJsonGenerator(
+            reference.pointer, out.reference.pointer, enc.reference.pointer)
+        .object);
   }
 
   static final _createJsonGenerator1 = jniLookup<
@@ -1947,8 +1963,8 @@
   jni.JObject createJsonGenerator1(
     jni.JObject out,
   ) {
-    return const jni.JObjectType()
-        .fromRef(_createJsonGenerator1(reference, out.reference).object);
+    return const jni.JObjectType().fromRef(
+        _createJsonGenerator1(reference.pointer, out.reference.pointer).object);
   }
 
   static final _createJsonGenerator2 = jniLookup<
@@ -1973,8 +1989,8 @@
   jni.JObject createJsonGenerator2(
     jni.JObject out,
   ) {
-    return const jni.JObjectType()
-        .fromRef(_createJsonGenerator2(reference, out.reference).object);
+    return const jni.JObjectType().fromRef(
+        _createJsonGenerator2(reference.pointer, out.reference.pointer).object);
   }
 }
 
diff --git a/pkgs/jnigen/test/jackson_core_test/third_party/c_based/dart_bindings/com/fasterxml/jackson/core/JsonParser.dart b/pkgs/jnigen/test/jackson_core_test/third_party/c_based/dart_bindings/com/fasterxml/jackson/core/JsonParser.dart
index ea47c4c..1459632 100644
--- a/pkgs/jnigen/test/jackson_core_test/third_party/c_based/dart_bindings/com/fasterxml/jackson/core/JsonParser.dart
+++ b/pkgs/jnigen/test/jackson_core_test/third_party/c_based/dart_bindings/com/fasterxml/jackson/core/JsonParser.dart
@@ -79,7 +79,7 @@
     jni.JString name,
   ) {
     return const $JsonParser_FeatureType()
-        .fromRef(_valueOf(name.reference).object);
+        .fromRef(_valueOf(name.reference.pointer).object);
   }
 
   static final _collectDefaults =
@@ -104,7 +104,7 @@
 
   /// from: public boolean enabledByDefault()
   bool enabledByDefault() {
-    return _enabledByDefault(reference).boolean;
+    return _enabledByDefault(reference.pointer).boolean;
   }
 
   static final _enabledIn = jniLookup<
@@ -117,7 +117,7 @@
   bool enabledIn(
     int flags,
   ) {
-    return _enabledIn(reference, flags).boolean;
+    return _enabledIn(reference.pointer, flags).boolean;
   }
 
   static final _getMask = jniLookup<
@@ -128,7 +128,7 @@
 
   /// from: public int getMask()
   int getMask() {
-    return _getMask(reference).integer;
+    return _getMask(reference.pointer).integer;
   }
 }
 
@@ -196,7 +196,7 @@
     jni.JString name,
   ) {
     return const $JsonParser_NumberTypeType()
-        .fromRef(_valueOf(name.reference).object);
+        .fromRef(_valueOf(name.reference.pointer).object);
   }
 }
 
@@ -295,7 +295,7 @@
   /// method (and its variants).
   ///@return Codec assigned to this parser, if any; {@code null} if none
   jni.JObject getCodec() {
-    return const jni.JObjectType().fromRef(_getCodec(reference).object);
+    return const jni.JObjectType().fromRef(_getCodec(reference.pointer).object);
   }
 
   static final _setCodec = jniLookup<
@@ -315,7 +315,7 @@
   void setCodec(
     jni.JObject oc,
   ) {
-    return _setCodec(reference, oc.reference).check();
+    return _setCodec(reference.pointer, oc.reference.pointer).check();
   }
 
   static final _getInputSource = jniLookup<
@@ -342,7 +342,8 @@
   /// "last effort", i.e. only used if no other mechanism is applicable.
   ///@return Input source this parser was configured with
   jni.JObject getInputSource() {
-    return const jni.JObjectType().fromRef(_getInputSource(reference).object);
+    return const jni.JObjectType()
+        .fromRef(_getInputSource(reference.pointer).object);
   }
 
   static final _setRequestPayloadOnError = jniLookup<
@@ -362,7 +363,9 @@
   void setRequestPayloadOnError(
     jni.JObject payload,
   ) {
-    return _setRequestPayloadOnError(reference, payload.reference).check();
+    return _setRequestPayloadOnError(
+            reference.pointer, payload.reference.pointer)
+        .check();
   }
 
   static final _setRequestPayloadOnError1 = jniLookup<
@@ -384,8 +387,8 @@
     jni.JArray<jni.jbyte> payload,
     jni.JString charset,
   ) {
-    return _setRequestPayloadOnError1(
-            reference, payload.reference, charset.reference)
+    return _setRequestPayloadOnError1(reference.pointer,
+            payload.reference.pointer, charset.reference.pointer)
         .check();
   }
 
@@ -406,7 +409,9 @@
   void setRequestPayloadOnError2(
     jni.JString payload,
   ) {
-    return _setRequestPayloadOnError2(reference, payload.reference).check();
+    return _setRequestPayloadOnError2(
+            reference.pointer, payload.reference.pointer)
+        .check();
   }
 
   static final _setSchema = jniLookup<
@@ -432,7 +437,7 @@
   void setSchema(
     jni.JObject schema,
   ) {
-    return _setSchema(reference, schema.reference).check();
+    return _setSchema(reference.pointer, schema.reference.pointer).check();
   }
 
   static final _getSchema = jniLookup<
@@ -449,7 +454,8 @@
   ///@return Schema in use by this parser, if any; {@code null} if none
   ///@since 2.1
   jni.JObject getSchema() {
-    return const jni.JObjectType().fromRef(_getSchema(reference).object);
+    return const jni.JObjectType()
+        .fromRef(_getSchema(reference.pointer).object);
   }
 
   static final _canUseSchema = jniLookup<
@@ -469,7 +475,7 @@
   bool canUseSchema(
     jni.JObject schema,
   ) {
-    return _canUseSchema(reference, schema.reference).boolean;
+    return _canUseSchema(reference.pointer, schema.reference.pointer).boolean;
   }
 
   static final _requiresCustomCodec = jniLookup<
@@ -489,7 +495,7 @@
   ///   ObjectCodec is enough
   ///@since 2.1
   bool requiresCustomCodec() {
-    return _requiresCustomCodec(reference).boolean;
+    return _requiresCustomCodec(reference.pointer).boolean;
   }
 
   static final _canParseAsync = jniLookup<
@@ -512,7 +518,7 @@
   ///@return True if this is a non-blocking ("asynchronous") parser
   ///@since 2.9
   bool canParseAsync() {
-    return _canParseAsync(reference).boolean;
+    return _canParseAsync(reference.pointer).boolean;
   }
 
   static final _getNonBlockingInputFeeder = jniLookup<
@@ -531,7 +537,7 @@
   ///@since 2.9
   jni.JObject getNonBlockingInputFeeder() {
     return const jni.JObjectType()
-        .fromRef(_getNonBlockingInputFeeder(reference).object);
+        .fromRef(_getNonBlockingInputFeeder(reference.pointer).object);
   }
 
   static final _getReadCapabilities = jniLookup<
@@ -549,7 +555,7 @@
   ///@since 2.12
   jni.JObject getReadCapabilities() {
     return const jni.JObjectType()
-        .fromRef(_getReadCapabilities(reference).object);
+        .fromRef(_getReadCapabilities(reference.pointer).object);
   }
 
   static final _version = jniLookup<
@@ -566,7 +572,7 @@
   ///@return Version of this generator (derived from version declared for
   ///   {@code jackson-core} jar that contains the class
   jni.JObject version() {
-    return const jni.JObjectType().fromRef(_version(reference).object);
+    return const jni.JObjectType().fromRef(_version(reference.pointer).object);
   }
 
   static final _close = jniLookup<
@@ -592,7 +598,7 @@
   /// stream or reader it does own them.
   ///@throws IOException if there is either an underlying I/O problem
   void close() {
-    return _close(reference).check();
+    return _close(reference.pointer).check();
   }
 
   static final _isClosed = jniLookup<
@@ -611,7 +617,7 @@
   /// end of input.
   ///@return {@code True} if this parser instance has been closed
   bool isClosed() {
-    return _isClosed(reference).boolean;
+    return _isClosed(reference.pointer).boolean;
   }
 
   static final _getParsingContext = jniLookup<
@@ -634,7 +640,7 @@
   ///@return Stream input context (JsonStreamContext) associated with this parser
   jni.JObject getParsingContext() {
     return const jni.JObjectType()
-        .fromRef(_getParsingContext(reference).object);
+        .fromRef(_getParsingContext(reference.pointer).object);
   }
 
   static final _currentLocation = jniLookup<
@@ -659,7 +665,8 @@
   ///@return Location of the last processed input unit (byte or character)
   ///@since 2.13
   jni.JObject currentLocation() {
-    return const jni.JObjectType().fromRef(_currentLocation(reference).object);
+    return const jni.JObjectType()
+        .fromRef(_currentLocation(reference.pointer).object);
   }
 
   static final _currentTokenLocation = jniLookup<
@@ -685,7 +692,7 @@
   ///@since 2.13 (will eventually replace \#getTokenLocation)
   jni.JObject currentTokenLocation() {
     return const jni.JObjectType()
-        .fromRef(_currentTokenLocation(reference).object);
+        .fromRef(_currentTokenLocation(reference.pointer).object);
   }
 
   static final _getCurrentLocation = jniLookup<
@@ -702,7 +709,7 @@
   ///@return Location of the last processed input unit (byte or character)
   jni.JObject getCurrentLocation() {
     return const jni.JObjectType()
-        .fromRef(_getCurrentLocation(reference).object);
+        .fromRef(_getCurrentLocation(reference.pointer).object);
   }
 
   static final _getTokenLocation = jniLookup<
@@ -718,7 +725,8 @@
   /// Jackson 2.x versions (and removed from Jackson 3.0).
   ///@return Starting location of the token parser currently points to
   jni.JObject getTokenLocation() {
-    return const jni.JObjectType().fromRef(_getTokenLocation(reference).object);
+    return const jni.JObjectType()
+        .fromRef(_getTokenLocation(reference.pointer).object);
   }
 
   static final _currentValue = jniLookup<
@@ -742,7 +750,8 @@
   ///@return "Current value" associated with the current input context (state) of this parser
   ///@since 2.13 (added as replacement for older \#getCurrentValue()
   jni.JObject currentValue() {
-    return const jni.JObjectType().fromRef(_currentValue(reference).object);
+    return const jni.JObjectType()
+        .fromRef(_currentValue(reference.pointer).object);
   }
 
   static final _assignCurrentValue = jniLookup<
@@ -764,7 +773,7 @@
   void assignCurrentValue(
     jni.JObject v,
   ) {
-    return _assignCurrentValue(reference, v.reference).check();
+    return _assignCurrentValue(reference.pointer, v.reference.pointer).check();
   }
 
   static final _getCurrentValue = jniLookup<
@@ -780,7 +789,8 @@
   /// Jackson 2.x versions (and removed from Jackson 3.0).
   ///@return Location of the last processed input unit (byte or character)
   jni.JObject getCurrentValue() {
-    return const jni.JObjectType().fromRef(_getCurrentValue(reference).object);
+    return const jni.JObjectType()
+        .fromRef(_getCurrentValue(reference.pointer).object);
   }
 
   static final _setCurrentValue = jniLookup<
@@ -799,7 +809,7 @@
   void setCurrentValue(
     jni.JObject v,
   ) {
-    return _setCurrentValue(reference, v.reference).check();
+    return _setCurrentValue(reference.pointer, v.reference.pointer).check();
   }
 
   static final _releaseBuffered = jniLookup<
@@ -826,7 +836,7 @@
   int releaseBuffered(
     jni.JObject out,
   ) {
-    return _releaseBuffered(reference, out.reference).integer;
+    return _releaseBuffered(reference.pointer, out.reference.pointer).integer;
   }
 
   static final _releaseBuffered1 = jniLookup<
@@ -854,7 +864,7 @@
   int releaseBuffered1(
     jni.JObject w,
   ) {
-    return _releaseBuffered1(reference, w.reference).integer;
+    return _releaseBuffered1(reference.pointer, w.reference.pointer).integer;
   }
 
   static final _enable = jniLookup<
@@ -876,7 +886,7 @@
     JsonParser_Feature f,
   ) {
     return const $JsonParserType()
-        .fromRef(_enable(reference, f.reference).object);
+        .fromRef(_enable(reference.pointer, f.reference.pointer).object);
   }
 
   static final _disable = jniLookup<
@@ -898,7 +908,7 @@
     JsonParser_Feature f,
   ) {
     return const $JsonParserType()
-        .fromRef(_disable(reference, f.reference).object);
+        .fromRef(_disable(reference.pointer, f.reference.pointer).object);
   }
 
   static final _configure = jniLookup<
@@ -921,8 +931,9 @@
     JsonParser_Feature f,
     bool state,
   ) {
-    return const $JsonParserType()
-        .fromRef(_configure(reference, f.reference, state ? 1 : 0).object);
+    return const $JsonParserType().fromRef(
+        _configure(reference.pointer, f.reference.pointer, state ? 1 : 0)
+            .object);
   }
 
   static final _isEnabled = jniLookup<
@@ -941,7 +952,7 @@
   bool isEnabled(
     JsonParser_Feature f,
   ) {
-    return _isEnabled(reference, f.reference).boolean;
+    return _isEnabled(reference.pointer, f.reference.pointer).boolean;
   }
 
   static final _isEnabled1 = jniLookup<
@@ -961,7 +972,7 @@
   bool isEnabled1(
     jni.JObject f,
   ) {
-    return _isEnabled1(reference, f.reference).boolean;
+    return _isEnabled1(reference.pointer, f.reference.pointer).boolean;
   }
 
   static final _getFeatureMask = jniLookup<
@@ -976,7 +987,7 @@
   ///@return Bit mask that defines current states of all standard Features.
   ///@since 2.3
   int getFeatureMask() {
-    return _getFeatureMask(reference).integer;
+    return _getFeatureMask(reference.pointer).integer;
   }
 
   static final _setFeatureMask = jniLookup<
@@ -997,7 +1008,7 @@
     int mask,
   ) {
     return const $JsonParserType()
-        .fromRef(_setFeatureMask(reference, mask).object);
+        .fromRef(_setFeatureMask(reference.pointer, mask).object);
   }
 
   static final _overrideStdFeatures = jniLookup<
@@ -1026,7 +1037,7 @@
     int mask,
   ) {
     return const $JsonParserType()
-        .fromRef(_overrideStdFeatures(reference, values, mask).object);
+        .fromRef(_overrideStdFeatures(reference.pointer, values, mask).object);
   }
 
   static final _getFormatFeatures = jniLookup<
@@ -1042,7 +1053,7 @@
   ///@return Bit mask that defines current states of all standard FormatFeatures.
   ///@since 2.6
   int getFormatFeatures() {
-    return _getFormatFeatures(reference).integer;
+    return _getFormatFeatures(reference.pointer).integer;
   }
 
   static final _overrideFormatFeatures = jniLookup<
@@ -1068,8 +1079,8 @@
     int values,
     int mask,
   ) {
-    return const $JsonParserType()
-        .fromRef(_overrideFormatFeatures(reference, values, mask).object);
+    return const $JsonParserType().fromRef(
+        _overrideFormatFeatures(reference.pointer, values, mask).object);
   }
 
   static final _nextToken = jniLookup<
@@ -1091,7 +1102,7 @@
   ///   JsonParseException for decoding problems
   jsontoken_.JsonToken nextToken() {
     return const jsontoken_.$JsonTokenType()
-        .fromRef(_nextToken(reference).object);
+        .fromRef(_nextToken(reference.pointer).object);
   }
 
   static final _nextValue = jniLookup<
@@ -1121,7 +1132,7 @@
   ///   JsonParseException for decoding problems
   jsontoken_.JsonToken nextValue() {
     return const jsontoken_.$JsonTokenType()
-        .fromRef(_nextValue(reference).object);
+        .fromRef(_nextValue(reference.pointer).object);
   }
 
   static final _nextFieldName = jniLookup<
@@ -1152,7 +1163,7 @@
   bool nextFieldName(
     jni.JObject str,
   ) {
-    return _nextFieldName(reference, str.reference).boolean;
+    return _nextFieldName(reference.pointer, str.reference.pointer).boolean;
   }
 
   static final _nextFieldName1 = jniLookup<
@@ -1173,7 +1184,8 @@
   ///   JsonParseException for decoding problems
   ///@since 2.5
   jni.JString nextFieldName1() {
-    return const jni.JStringType().fromRef(_nextFieldName1(reference).object);
+    return const jni.JStringType()
+        .fromRef(_nextFieldName1(reference.pointer).object);
   }
 
   static final _nextTextValue = jniLookup<
@@ -1199,7 +1211,8 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   jni.JString nextTextValue() {
-    return const jni.JStringType().fromRef(_nextTextValue(reference).object);
+    return const jni.JStringType()
+        .fromRef(_nextTextValue(reference.pointer).object);
   }
 
   static final _nextIntValue = jniLookup<
@@ -1230,7 +1243,7 @@
   int nextIntValue(
     int defaultValue,
   ) {
-    return _nextIntValue(reference, defaultValue).integer;
+    return _nextIntValue(reference.pointer, defaultValue).integer;
   }
 
   static final _nextLongValue = jniLookup<
@@ -1261,7 +1274,7 @@
   int nextLongValue(
     int defaultValue,
   ) {
-    return _nextLongValue(reference, defaultValue).long;
+    return _nextLongValue(reference.pointer, defaultValue).long;
   }
 
   static final _nextBooleanValue = jniLookup<
@@ -1291,7 +1304,7 @@
   ///   JsonParseException for decoding problems
   jni.JBoolean nextBooleanValue() {
     return const jni.JBooleanType()
-        .fromRef(_nextBooleanValue(reference).object);
+        .fromRef(_nextBooleanValue(reference.pointer).object);
   }
 
   static final _skipChildren = jniLookup<
@@ -1319,7 +1332,8 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   JsonParser skipChildren() {
-    return const $JsonParserType().fromRef(_skipChildren(reference).object);
+    return const $JsonParserType()
+        .fromRef(_skipChildren(reference.pointer).object);
   }
 
   static final _finishToken = jniLookup<
@@ -1344,7 +1358,7 @@
   ///   JsonParseException for decoding problems
   ///@since 2.8
   void finishToken() {
-    return _finishToken(reference).check();
+    return _finishToken(reference.pointer).check();
   }
 
   static final _currentToken = jniLookup<
@@ -1367,7 +1381,7 @@
   ///@since 2.8
   jsontoken_.JsonToken currentToken() {
     return const jsontoken_.$JsonTokenType()
-        .fromRef(_currentToken(reference).object);
+        .fromRef(_currentToken(reference.pointer).object);
   }
 
   static final _currentTokenId = jniLookup<
@@ -1388,7 +1402,7 @@
   ///@since 2.8
   ///@return {@code int} matching one of constants from JsonTokenId.
   int currentTokenId() {
-    return _currentTokenId(reference).integer;
+    return _currentTokenId(reference.pointer).integer;
   }
 
   static final _getCurrentToken = jniLookup<
@@ -1406,7 +1420,7 @@
   ///   if any: null before any tokens have been read, and
   jsontoken_.JsonToken getCurrentToken() {
     return const jsontoken_.$JsonTokenType()
-        .fromRef(_getCurrentToken(reference).object);
+        .fromRef(_getCurrentToken(reference.pointer).object);
   }
 
   static final _getCurrentTokenId = jniLookup<
@@ -1421,7 +1435,7 @@
   ///@return {@code int} matching one of constants from JsonTokenId.
   ///@deprecated Since 2.12 use \#currentTokenId instead
   int getCurrentTokenId() {
-    return _getCurrentTokenId(reference).integer;
+    return _getCurrentTokenId(reference.pointer).integer;
   }
 
   static final _hasCurrentToken = jniLookup<
@@ -1441,7 +1455,7 @@
   ///   and returned null from \#nextToken, or the token
   ///   has been consumed)
   bool hasCurrentToken() {
-    return _hasCurrentToken(reference).boolean;
+    return _hasCurrentToken(reference.pointer).boolean;
   }
 
   static final _hasTokenId = jniLookup<
@@ -1467,7 +1481,7 @@
   bool hasTokenId(
     int id,
   ) {
-    return _hasTokenId(reference, id).boolean;
+    return _hasTokenId(reference.pointer, id).boolean;
   }
 
   static final _hasToken = jniLookup<
@@ -1495,7 +1509,7 @@
   bool hasToken(
     jsontoken_.JsonToken t,
   ) {
-    return _hasToken(reference, t.reference).boolean;
+    return _hasToken(reference.pointer, t.reference.pointer).boolean;
   }
 
   static final _isExpectedStartArrayToken = jniLookup<
@@ -1523,7 +1537,7 @@
   ///   start-array marker (such JsonToken\#START_ARRAY);
   ///   {@code false} if not
   bool isExpectedStartArrayToken() {
-    return _isExpectedStartArrayToken(reference).boolean;
+    return _isExpectedStartArrayToken(reference.pointer).boolean;
   }
 
   static final _isExpectedStartObjectToken = jniLookup<
@@ -1541,7 +1555,7 @@
   ///   {@code false} if not
   ///@since 2.5
   bool isExpectedStartObjectToken() {
-    return _isExpectedStartObjectToken(reference).boolean;
+    return _isExpectedStartObjectToken(reference.pointer).boolean;
   }
 
   static final _isExpectedNumberIntToken = jniLookup<
@@ -1562,7 +1576,7 @@
   ///   {@code false} if not
   ///@since 2.12
   bool isExpectedNumberIntToken() {
-    return _isExpectedNumberIntToken(reference).boolean;
+    return _isExpectedNumberIntToken(reference.pointer).boolean;
   }
 
   static final _isNaN = jniLookup<
@@ -1586,7 +1600,7 @@
   ///   JsonParseException for decoding problems
   ///@since 2.9
   bool isNaN() {
-    return _isNaN(reference).boolean;
+    return _isNaN(reference.pointer).boolean;
   }
 
   static final _clearCurrentToken = jniLookup<
@@ -1608,7 +1622,7 @@
   /// it has to be able to consume last token used for binding (so that
   /// it will not be used again).
   void clearCurrentToken() {
-    return _clearCurrentToken(reference).check();
+    return _clearCurrentToken(reference.pointer).check();
   }
 
   static final _getLastClearedToken = jniLookup<
@@ -1628,7 +1642,7 @@
   ///@return Last cleared token, if any; {@code null} otherwise
   jsontoken_.JsonToken getLastClearedToken() {
     return const jsontoken_.$JsonTokenType()
-        .fromRef(_getLastClearedToken(reference).object);
+        .fromRef(_getLastClearedToken(reference.pointer).object);
   }
 
   static final _overrideCurrentName = jniLookup<
@@ -1652,7 +1666,8 @@
   void overrideCurrentName(
     jni.JString name,
   ) {
-    return _overrideCurrentName(reference, name.reference).check();
+    return _overrideCurrentName(reference.pointer, name.reference.pointer)
+        .check();
   }
 
   static final _getCurrentName = jniLookup<
@@ -1669,7 +1684,8 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   jni.JString getCurrentName() {
-    return const jni.JStringType().fromRef(_getCurrentName(reference).object);
+    return const jni.JStringType()
+        .fromRef(_getCurrentName(reference.pointer).object);
   }
 
   static final _currentName = jniLookup<
@@ -1691,7 +1707,8 @@
   ///   JsonParseException for decoding problems
   ///@since 2.10
   jni.JString currentName() {
-    return const jni.JStringType().fromRef(_currentName(reference).object);
+    return const jni.JStringType()
+        .fromRef(_currentName(reference.pointer).object);
   }
 
   static final _getText = jniLookup<
@@ -1712,7 +1729,7 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   jni.JString getText() {
-    return const jni.JStringType().fromRef(_getText(reference).object);
+    return const jni.JStringType().fromRef(_getText(reference.pointer).object);
   }
 
   static final _getText1 = jniLookup<
@@ -1743,7 +1760,7 @@
   int getText1(
     jni.JObject writer,
   ) {
-    return _getText1(reference, writer.reference).integer;
+    return _getText1(reference.pointer, writer.reference.pointer).integer;
   }
 
   static final _getTextCharacters = jniLookup<
@@ -1784,7 +1801,7 @@
   ///   JsonParseException for decoding problems
   jni.JArray<jni.jchar> getTextCharacters() {
     return const jni.JArrayType(jni.jcharType())
-        .fromRef(_getTextCharacters(reference).object);
+        .fromRef(_getTextCharacters(reference.pointer).object);
   }
 
   static final _getTextLength = jniLookup<
@@ -1803,7 +1820,7 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   int getTextLength() {
-    return _getTextLength(reference).integer;
+    return _getTextLength(reference.pointer).integer;
   }
 
   static final _getTextOffset = jniLookup<
@@ -1822,7 +1839,7 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   int getTextOffset() {
-    return _getTextOffset(reference).integer;
+    return _getTextOffset(reference.pointer).integer;
   }
 
   static final _hasTextCharacters = jniLookup<
@@ -1848,7 +1865,7 @@
   ///   be efficiently returned via \#getTextCharacters; false
   ///   means that it may or may not exist
   bool hasTextCharacters() {
-    return _hasTextCharacters(reference).boolean;
+    return _hasTextCharacters(reference.pointer).boolean;
   }
 
   static final _getNumberValue = jniLookup<
@@ -1871,7 +1888,8 @@
   ///    (invalid format for numbers); plain IOException if underlying
   ///    content read fails (possible if values are extracted lazily)
   jni.JNumber getNumberValue() {
-    return const jni.JNumberType().fromRef(_getNumberValue(reference).object);
+    return const jni.JNumberType()
+        .fromRef(_getNumberValue(reference.pointer).object);
   }
 
   static final _getNumberValueExact = jniLookup<
@@ -1899,7 +1917,7 @@
   ///@since 2.12
   jni.JNumber getNumberValueExact() {
     return const jni.JNumberType()
-        .fromRef(_getNumberValueExact(reference).object);
+        .fromRef(_getNumberValueExact(reference.pointer).object);
   }
 
   static final _getNumberType = jniLookup<
@@ -1920,7 +1938,7 @@
   ///   JsonParseException for decoding problems
   JsonParser_NumberType getNumberType() {
     return const $JsonParser_NumberTypeType()
-        .fromRef(_getNumberType(reference).object);
+        .fromRef(_getNumberType(reference.pointer).object);
   }
 
   static final _getByteValue = jniLookup<
@@ -1953,7 +1971,7 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   int getByteValue() {
-    return _getByteValue(reference).byte;
+    return _getByteValue(reference.pointer).byte;
   }
 
   static final _getShortValue = jniLookup<
@@ -1980,7 +1998,7 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   int getShortValue() {
-    return _getShortValue(reference).short;
+    return _getShortValue(reference.pointer).short;
   }
 
   static final _getIntValue = jniLookup<
@@ -2007,7 +2025,7 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   int getIntValue() {
-    return _getIntValue(reference).integer;
+    return _getIntValue(reference.pointer).integer;
   }
 
   static final _getLongValue = jniLookup<
@@ -2034,7 +2052,7 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   int getLongValue() {
-    return _getLongValue(reference).long;
+    return _getLongValue(reference.pointer).long;
   }
 
   static final _getBigIntegerValue = jniLookup<
@@ -2059,7 +2077,7 @@
   ///   JsonParseException for decoding problems
   jni.JObject getBigIntegerValue() {
     return const jni.JObjectType()
-        .fromRef(_getBigIntegerValue(reference).object);
+        .fromRef(_getBigIntegerValue(reference.pointer).object);
   }
 
   static final _getFloatValue = jniLookup<
@@ -2086,7 +2104,7 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   double getFloatValue() {
-    return _getFloatValue(reference).float;
+    return _getFloatValue(reference.pointer).float;
   }
 
   static final _getDoubleValue = jniLookup<
@@ -2113,7 +2131,7 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   double getDoubleValue() {
-    return _getDoubleValue(reference).doubleFloat;
+    return _getDoubleValue(reference.pointer).doubleFloat;
   }
 
   static final _getDecimalValue = jniLookup<
@@ -2134,7 +2152,8 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   jni.JObject getDecimalValue() {
-    return const jni.JObjectType().fromRef(_getDecimalValue(reference).object);
+    return const jni.JObjectType()
+        .fromRef(_getDecimalValue(reference.pointer).object);
   }
 
   static final _getBooleanValue = jniLookup<
@@ -2157,7 +2176,7 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   bool getBooleanValue() {
-    return _getBooleanValue(reference).boolean;
+    return _getBooleanValue(reference.pointer).boolean;
   }
 
   static final _getEmbeddedObject = jniLookup<
@@ -2185,7 +2204,7 @@
   ///   JsonParseException for decoding problems
   jni.JObject getEmbeddedObject() {
     return const jni.JObjectType()
-        .fromRef(_getEmbeddedObject(reference).object);
+        .fromRef(_getEmbeddedObject(reference.pointer).object);
   }
 
   static final _getBinaryValue = jniLookup<
@@ -2222,8 +2241,8 @@
   jni.JArray<jni.jbyte> getBinaryValue(
     jni.JObject bv,
   ) {
-    return const jni.JArrayType(jni.jbyteType())
-        .fromRef(_getBinaryValue(reference, bv.reference).object);
+    return const jni.JArrayType(jni.jbyteType()).fromRef(
+        _getBinaryValue(reference.pointer, bv.reference.pointer).object);
   }
 
   static final _getBinaryValue1 = jniLookup<
@@ -2243,7 +2262,7 @@
   ///   JsonParseException for decoding problems
   jni.JArray<jni.jbyte> getBinaryValue1() {
     return const jni.JArrayType(jni.jbyteType())
-        .fromRef(_getBinaryValue1(reference).object);
+        .fromRef(_getBinaryValue1(reference.pointer).object);
   }
 
   static final _readBinaryValue = jniLookup<
@@ -2270,7 +2289,7 @@
   int readBinaryValue(
     jni.JObject out,
   ) {
-    return _readBinaryValue(reference, out.reference).integer;
+    return _readBinaryValue(reference.pointer, out.reference.pointer).integer;
   }
 
   static final _readBinaryValue1 = jniLookup<
@@ -2297,7 +2316,9 @@
     jni.JObject bv,
     jni.JObject out,
   ) {
-    return _readBinaryValue1(reference, bv.reference, out.reference).integer;
+    return _readBinaryValue1(
+            reference.pointer, bv.reference.pointer, out.reference.pointer)
+        .integer;
   }
 
   static final _getValueAsInt = jniLookup<
@@ -2322,7 +2343,7 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   int getValueAsInt() {
-    return _getValueAsInt(reference).integer;
+    return _getValueAsInt(reference.pointer).integer;
   }
 
   static final _getValueAsInt1 = jniLookup<
@@ -2349,7 +2370,7 @@
   int getValueAsInt1(
     int def,
   ) {
-    return _getValueAsInt1(reference, def).integer;
+    return _getValueAsInt1(reference.pointer, def).integer;
   }
 
   static final _getValueAsLong = jniLookup<
@@ -2374,7 +2395,7 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   int getValueAsLong() {
-    return _getValueAsLong(reference).long;
+    return _getValueAsLong(reference.pointer).long;
   }
 
   static final _getValueAsLong1 = jniLookup<
@@ -2401,7 +2422,7 @@
   int getValueAsLong1(
     int def,
   ) {
-    return _getValueAsLong1(reference, def).long;
+    return _getValueAsLong1(reference.pointer, def).long;
   }
 
   static final _getValueAsDouble = jniLookup<
@@ -2426,7 +2447,7 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   double getValueAsDouble() {
-    return _getValueAsDouble(reference).doubleFloat;
+    return _getValueAsDouble(reference.pointer).doubleFloat;
   }
 
   static final _getValueAsDouble1 = jniLookup<
@@ -2453,7 +2474,7 @@
   double getValueAsDouble1(
     double def,
   ) {
-    return _getValueAsDouble1(reference, def).doubleFloat;
+    return _getValueAsDouble1(reference.pointer, def).doubleFloat;
   }
 
   static final _getValueAsBoolean = jniLookup<
@@ -2478,7 +2499,7 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   bool getValueAsBoolean() {
-    return _getValueAsBoolean(reference).boolean;
+    return _getValueAsBoolean(reference.pointer).boolean;
   }
 
   static final _getValueAsBoolean1 = jniLookup<
@@ -2505,7 +2526,7 @@
   bool getValueAsBoolean1(
     bool def,
   ) {
-    return _getValueAsBoolean1(reference, def ? 1 : 0).boolean;
+    return _getValueAsBoolean1(reference.pointer, def ? 1 : 0).boolean;
   }
 
   static final _getValueAsString = jniLookup<
@@ -2529,7 +2550,8 @@
   ///   JsonParseException for decoding problems
   ///@since 2.1
   jni.JString getValueAsString() {
-    return const jni.JStringType().fromRef(_getValueAsString(reference).object);
+    return const jni.JStringType()
+        .fromRef(_getValueAsString(reference.pointer).object);
   }
 
   static final _getValueAsString1 = jniLookup<
@@ -2558,8 +2580,8 @@
   jni.JString getValueAsString1(
     jni.JString def,
   ) {
-    return const jni.JStringType()
-        .fromRef(_getValueAsString1(reference, def.reference).object);
+    return const jni.JStringType().fromRef(
+        _getValueAsString1(reference.pointer, def.reference.pointer).object);
   }
 
   static final _canReadObjectId = jniLookup<
@@ -2582,7 +2604,7 @@
   ///    {@code false} if not
   ///@since 2.3
   bool canReadObjectId() {
-    return _canReadObjectId(reference).boolean;
+    return _canReadObjectId(reference.pointer).boolean;
   }
 
   static final _canReadTypeId = jniLookup<
@@ -2605,7 +2627,7 @@
   ///    {@code false} if not
   ///@since 2.3
   bool canReadTypeId() {
-    return _canReadTypeId(reference).boolean;
+    return _canReadTypeId(reference.pointer).boolean;
   }
 
   static final _getObjectId = jniLookup<
@@ -2631,7 +2653,8 @@
   ///   JsonParseException for decoding problems
   ///@since 2.3
   jni.JObject getObjectId() {
-    return const jni.JObjectType().fromRef(_getObjectId(reference).object);
+    return const jni.JObjectType()
+        .fromRef(_getObjectId(reference.pointer).object);
   }
 
   static final _getTypeId = jniLookup<
@@ -2657,7 +2680,8 @@
   ///   JsonParseException for decoding problems
   ///@since 2.3
   jni.JObject getTypeId() {
-    return const jni.JObjectType().fromRef(_getTypeId(reference).object);
+    return const jni.JObjectType()
+        .fromRef(_getTypeId(reference.pointer).object);
   }
 
   static final _readValueAs = jniLookup<
@@ -2700,7 +2724,8 @@
     jni.JObject valueType, {
     required jni.JObjType<$T> T,
   }) {
-    return T.fromRef(_readValueAs(reference, valueType.reference).object);
+    return T.fromRef(
+        _readValueAs(reference.pointer, valueType.reference.pointer).object);
   }
 
   static final _readValueAs1 = jniLookup<
@@ -2740,7 +2765,9 @@
     jni.JObject valueTypeRef, {
     required jni.JObjType<$T> T,
   }) {
-    return T.fromRef(_readValueAs1(reference, valueTypeRef.reference).object);
+    return T.fromRef(
+        _readValueAs1(reference.pointer, valueTypeRef.reference.pointer)
+            .object);
   }
 
   static final _readValuesAs = jniLookup<
@@ -2766,8 +2793,8 @@
     jni.JObject valueType, {
     required jni.JObjType<$T> T,
   }) {
-    return jni.JIteratorType(T)
-        .fromRef(_readValuesAs(reference, valueType.reference).object);
+    return jni.JIteratorType(T).fromRef(
+        _readValuesAs(reference.pointer, valueType.reference.pointer).object);
   }
 
   static final _readValuesAs1 = jniLookup<
@@ -2793,8 +2820,9 @@
     jni.JObject valueTypeRef, {
     required jni.JObjType<$T> T,
   }) {
-    return jni.JIteratorType(T)
-        .fromRef(_readValuesAs1(reference, valueTypeRef.reference).object);
+    return jni.JIteratorType(T).fromRef(
+        _readValuesAs1(reference.pointer, valueTypeRef.reference.pointer)
+            .object);
   }
 
   static final _readValueAsTree = jniLookup<
@@ -2818,7 +2846,7 @@
   $T readValueAsTree<$T extends jni.JObject>({
     required jni.JObjType<$T> T,
   }) {
-    return T.fromRef(_readValueAsTree(reference).object);
+    return T.fromRef(_readValueAsTree(reference.pointer).object);
   }
 }
 
diff --git a/pkgs/jnigen/test/jackson_core_test/third_party/c_based/dart_bindings/com/fasterxml/jackson/core/JsonToken.dart b/pkgs/jnigen/test/jackson_core_test/third_party/c_based/dart_bindings/com/fasterxml/jackson/core/JsonToken.dart
index 2d036c5..0546890 100644
--- a/pkgs/jnigen/test/jackson_core_test/third_party/c_based/dart_bindings/com/fasterxml/jackson/core/JsonToken.dart
+++ b/pkgs/jnigen/test/jackson_core_test/third_party/c_based/dart_bindings/com/fasterxml/jackson/core/JsonToken.dart
@@ -77,7 +77,8 @@
   static JsonToken valueOf(
     jni.JString name,
   ) {
-    return const $JsonTokenType().fromRef(_valueOf(name.reference).object);
+    return const $JsonTokenType()
+        .fromRef(_valueOf(name.reference.pointer).object);
   }
 
   static final _id = jniLookup<
@@ -87,7 +88,7 @@
 
   /// from: public final int id()
   int id() {
-    return _id(reference).integer;
+    return _id(reference.pointer).integer;
   }
 
   static final _asString = jniLookup<
@@ -99,7 +100,7 @@
   /// from: public final java.lang.String asString()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JString asString() {
-    return const jni.JStringType().fromRef(_asString(reference).object);
+    return const jni.JStringType().fromRef(_asString(reference.pointer).object);
   }
 
   static final _asCharArray = jniLookup<
@@ -112,7 +113,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni.JArray<jni.jchar> asCharArray() {
     return const jni.JArrayType(jni.jcharType())
-        .fromRef(_asCharArray(reference).object);
+        .fromRef(_asCharArray(reference.pointer).object);
   }
 
   static final _asByteArray = jniLookup<
@@ -125,7 +126,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni.JArray<jni.jbyte> asByteArray() {
     return const jni.JArrayType(jni.jbyteType())
-        .fromRef(_asByteArray(reference).object);
+        .fromRef(_asByteArray(reference.pointer).object);
   }
 
   static final _isNumeric = jniLookup<
@@ -139,7 +140,7 @@
   /// @return {@code True} if this token is {@code VALUE_NUMBER_INT} or {@code VALUE_NUMBER_FLOAT},
   ///   {@code false} otherwise
   bool isNumeric() {
-    return _isNumeric(reference).boolean;
+    return _isNumeric(reference.pointer).boolean;
   }
 
   static final _isStructStart = jniLookup<
@@ -158,7 +159,7 @@
   ///   {@code false} otherwise
   ///@since 2.3
   bool isStructStart() {
-    return _isStructStart(reference).boolean;
+    return _isStructStart(reference.pointer).boolean;
   }
 
   static final _isStructEnd = jniLookup<
@@ -177,7 +178,7 @@
   ///   {@code false} otherwise
   ///@since 2.3
   bool isStructEnd() {
-    return _isStructEnd(reference).boolean;
+    return _isStructEnd(reference.pointer).boolean;
   }
 
   static final _isScalarValue = jniLookup<
@@ -195,7 +196,7 @@
   ///@return {@code True} if this token is a scalar value token (one of
   ///   {@code VALUE_xxx} tokens), {@code false} otherwise
   bool isScalarValue() {
-    return _isScalarValue(reference).boolean;
+    return _isScalarValue(reference.pointer).boolean;
   }
 
   static final _isBoolean = jniLookup<
@@ -209,7 +210,7 @@
   /// @return {@code True} if this token is {@code VALUE_TRUE} or {@code VALUE_FALSE},
   ///   {@code false} otherwise
   bool isBoolean() {
-    return _isBoolean(reference).boolean;
+    return _isBoolean(reference.pointer).boolean;
   }
 }
 
diff --git a/pkgs/jnigen/test/jackson_core_test/third_party/dart_only/dart_bindings/com/fasterxml/jackson/core/JsonFactory.dart b/pkgs/jnigen/test/jackson_core_test/third_party/dart_only/dart_bindings/com/fasterxml/jackson/core/JsonFactory.dart
index e1f2bbe..f8d55f1 100644
--- a/pkgs/jnigen/test/jackson_core_test/third_party/dart_only/dart_bindings/com/fasterxml/jackson/core/JsonFactory.dart
+++ b/pkgs/jnigen/test/jackson_core_test/third_party/dart_only/dart_bindings/com/fasterxml/jackson/core/JsonFactory.dart
@@ -59,7 +59,7 @@
   /// The type which includes information such as the signature of this class.
   static const type = $JsonFactory_FeatureType();
   static final _id_values = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"values",
       r"()[Lcom/fasterxml/jackson/core/JsonFactory$Feature;");
 
@@ -67,12 +67,12 @@
   /// The returned object must be released after use, by calling the [release] method.
   static jni.JArray<JsonFactory_Feature> values() {
     return const jni.JArrayType($JsonFactory_FeatureType()).fromRef(
-        jni.Jni.accessors.callStaticMethodWithArgs(_class.reference, _id_values,
-            jni.JniCallType.objectType, []).object);
+        jni.Jni.accessors.callStaticMethodWithArgs(_class.reference.pointer,
+            _id_values, jni.JniCallType.objectType, []).object);
   }
 
   static final _id_valueOf = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"valueOf",
       r"(Ljava/lang/String;)Lcom/fasterxml/jackson/core/JsonFactory$Feature;");
 
@@ -82,12 +82,12 @@
     jni.JString name,
   ) {
     return const $JsonFactory_FeatureType().fromRef(jni.Jni.accessors
-        .callStaticMethodWithArgs(_class.reference, _id_valueOf,
-            jni.JniCallType.objectType, [name.reference]).object);
+        .callStaticMethodWithArgs(_class.reference.pointer, _id_valueOf,
+            jni.JniCallType.objectType, [name.reference.pointer]).object);
   }
 
-  static final _id_collectDefaults = jni.Jni.accessors
-      .getStaticMethodIDOf(_class.reference, r"collectDefaults", r"()I");
+  static final _id_collectDefaults = jni.Jni.accessors.getStaticMethodIDOf(
+      _class.reference.pointer, r"collectDefaults", r"()I");
 
   /// from: static public int collectDefaults()
   ///
@@ -95,37 +95,40 @@
   /// are enabled by default.
   ///@return Bit field of features enabled by default
   static int collectDefaults() {
-    return jni.Jni.accessors.callStaticMethodWithArgs(_class.reference,
+    return jni.Jni.accessors.callStaticMethodWithArgs(_class.reference.pointer,
         _id_collectDefaults, jni.JniCallType.intType, []).integer;
   }
 
   static final _id_enabledByDefault = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"enabledByDefault", r"()Z");
+      .getMethodIDOf(_class.reference.pointer, r"enabledByDefault", r"()Z");
 
   /// from: public boolean enabledByDefault()
   bool enabledByDefault() {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_enabledByDefault,
-        jni.JniCallType.booleanType, []).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_enabledByDefault, jni.JniCallType.booleanType, []).boolean;
   }
 
-  static final _id_enabledIn =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"enabledIn", r"(I)Z");
+  static final _id_enabledIn = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"enabledIn", r"(I)Z");
 
   /// from: public boolean enabledIn(int flags)
   bool enabledIn(
     int flags,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_enabledIn,
-        jni.JniCallType.booleanType, [jni.JValueInt(flags)]).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_enabledIn,
+        jni.JniCallType.booleanType,
+        [jni.JValueInt(flags)]).boolean;
   }
 
-  static final _id_getMask =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"getMask", r"()I");
+  static final _id_getMask = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"getMask", r"()I");
 
   /// from: public int getMask()
   int getMask() {
     return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getMask, jni.JniCallType.intType, []).integer;
+        reference.pointer, _id_getMask, jni.JniCallType.intType, []).integer;
   }
 }
 
@@ -188,7 +191,7 @@
   /// The type which includes information such as the signature of this class.
   static const type = $JsonFactoryType();
   static final _id_FORMAT_NAME_JSON = jni.Jni.accessors.getStaticFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"FORMAT_NAME_JSON",
     r"Ljava/lang/String;",
   );
@@ -198,15 +201,15 @@
   ///
   /// Name used to identify JSON format
   /// (and returned by \#getFormatName()
-  static jni.JString get FORMAT_NAME_JSON => const jni.JStringType().fromRef(jni
-      .Jni.accessors
-      .getStaticField(
-          _class.reference, _id_FORMAT_NAME_JSON, jni.JniCallType.objectType)
-      .object);
+  static jni.JString get FORMAT_NAME_JSON =>
+      const jni.JStringType().fromRef(jni.Jni.accessors
+          .getStaticField(_class.reference.pointer, _id_FORMAT_NAME_JSON,
+              jni.JniCallType.objectType)
+          .object);
 
   static final _id_DEFAULT_FACTORY_FEATURE_FLAGS =
       jni.Jni.accessors.getStaticFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"DEFAULT_FACTORY_FEATURE_FLAGS",
     r"I",
   );
@@ -215,13 +218,13 @@
   ///
   /// Bitfield (set of flags) of all factory features that are enabled by default.
   static int get DEFAULT_FACTORY_FEATURE_FLAGS => jni.Jni.accessors
-      .getStaticField(_class.reference, _id_DEFAULT_FACTORY_FEATURE_FLAGS,
-          jni.JniCallType.intType)
+      .getStaticField(_class.reference.pointer,
+          _id_DEFAULT_FACTORY_FEATURE_FLAGS, jni.JniCallType.intType)
       .integer;
 
   static final _id_DEFAULT_PARSER_FEATURE_FLAGS =
       jni.Jni.accessors.getStaticFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"DEFAULT_PARSER_FEATURE_FLAGS",
     r"I",
   );
@@ -231,13 +234,13 @@
   /// Bitfield (set of flags) of all parser features that are enabled
   /// by default.
   static int get DEFAULT_PARSER_FEATURE_FLAGS => jni.Jni.accessors
-      .getStaticField(_class.reference, _id_DEFAULT_PARSER_FEATURE_FLAGS,
-          jni.JniCallType.intType)
+      .getStaticField(_class.reference.pointer,
+          _id_DEFAULT_PARSER_FEATURE_FLAGS, jni.JniCallType.intType)
       .integer;
 
   static final _id_DEFAULT_GENERATOR_FEATURE_FLAGS =
       jni.Jni.accessors.getStaticFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"DEFAULT_GENERATOR_FEATURE_FLAGS",
     r"I",
   );
@@ -247,13 +250,13 @@
   /// Bitfield (set of flags) of all generator features that are enabled
   /// by default.
   static int get DEFAULT_GENERATOR_FEATURE_FLAGS => jni.Jni.accessors
-      .getStaticField(_class.reference, _id_DEFAULT_GENERATOR_FEATURE_FLAGS,
-          jni.JniCallType.intType)
+      .getStaticField(_class.reference.pointer,
+          _id_DEFAULT_GENERATOR_FEATURE_FLAGS, jni.JniCallType.intType)
       .integer;
 
   static final _id_DEFAULT_ROOT_VALUE_SEPARATOR =
       jni.Jni.accessors.getStaticFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"DEFAULT_ROOT_VALUE_SEPARATOR",
     r"Lcom/fasterxml/jackson/core/SerializableString;",
   );
@@ -262,12 +265,12 @@
   /// The returned object must be released after use, by calling the [release] method.
   static jni.JObject get DEFAULT_ROOT_VALUE_SEPARATOR =>
       const jni.JObjectType().fromRef(jni.Jni.accessors
-          .getStaticField(_class.reference, _id_DEFAULT_ROOT_VALUE_SEPARATOR,
-              jni.JniCallType.objectType)
+          .getStaticField(_class.reference.pointer,
+              _id_DEFAULT_ROOT_VALUE_SEPARATOR, jni.JniCallType.objectType)
           .object);
 
-  static final _id_new0 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"()V");
+  static final _id_new0 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"()V");
 
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
@@ -282,23 +285,25 @@
   /// factory instance.
   factory JsonFactory() {
     return JsonFactory.fromRef(jni.Jni.accessors
-        .newObjectWithArgs(_class.reference, _id_new0, []).object);
+        .newObjectWithArgs(_class.reference.pointer, _id_new0, []).object);
   }
 
-  static final _id_new1 = jni.Jni.accessors.getMethodIDOf(_class.reference,
-      r"<init>", r"(Lcom/fasterxml/jackson/core/ObjectCodec;)V");
+  static final _id_new1 = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer,
+      r"<init>",
+      r"(Lcom/fasterxml/jackson/core/ObjectCodec;)V");
 
   /// from: public void <init>(com.fasterxml.jackson.core.ObjectCodec oc)
   /// The returned object must be released after use, by calling the [release] method.
   factory JsonFactory.new1(
     jni.JObject oc,
   ) {
-    return JsonFactory.fromRef(jni.Jni.accessors
-        .newObjectWithArgs(_class.reference, _id_new1, [oc.reference]).object);
+    return JsonFactory.fromRef(jni.Jni.accessors.newObjectWithArgs(
+        _class.reference.pointer, _id_new1, [oc.reference.pointer]).object);
   }
 
   static final _id_new2 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"<init>",
       r"(Lcom/fasterxml/jackson/core/JsonFactory;Lcom/fasterxml/jackson/core/ObjectCodec;)V");
 
@@ -314,11 +319,15 @@
     jni.JObject codec,
   ) {
     return JsonFactory.fromRef(jni.Jni.accessors.newObjectWithArgs(
-        _class.reference, _id_new2, [src.reference, codec.reference]).object);
+        _class.reference.pointer,
+        _id_new2,
+        [src.reference.pointer, codec.reference.pointer]).object);
   }
 
-  static final _id_new3 = jni.Jni.accessors.getMethodIDOf(_class.reference,
-      r"<init>", r"(Lcom/fasterxml/jackson/core/JsonFactoryBuilder;)V");
+  static final _id_new3 = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer,
+      r"<init>",
+      r"(Lcom/fasterxml/jackson/core/JsonFactoryBuilder;)V");
 
   /// from: public void <init>(com.fasterxml.jackson.core.JsonFactoryBuilder b)
   /// The returned object must be released after use, by calling the [release] method.
@@ -329,12 +338,14 @@
   factory JsonFactory.new3(
     jni.JObject b,
   ) {
-    return JsonFactory.fromRef(jni.Jni.accessors
-        .newObjectWithArgs(_class.reference, _id_new3, [b.reference]).object);
+    return JsonFactory.fromRef(jni.Jni.accessors.newObjectWithArgs(
+        _class.reference.pointer, _id_new3, [b.reference.pointer]).object);
   }
 
-  static final _id_new4 = jni.Jni.accessors.getMethodIDOf(_class.reference,
-      r"<init>", r"(Lcom/fasterxml/jackson/core/TSFBuilder;Z)V");
+  static final _id_new4 = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer,
+      r"<init>",
+      r"(Lcom/fasterxml/jackson/core/TSFBuilder;Z)V");
 
   /// from: protected void <init>(com.fasterxml.jackson.core.TSFBuilder<?,?> b, boolean bogus)
   /// The returned object must be released after use, by calling the [release] method.
@@ -349,11 +360,15 @@
     bool bogus,
   ) {
     return JsonFactory.fromRef(jni.Jni.accessors.newObjectWithArgs(
-        _class.reference, _id_new4, [b.reference, bogus ? 1 : 0]).object);
+        _class.reference.pointer,
+        _id_new4,
+        [b.reference.pointer, bogus ? 1 : 0]).object);
   }
 
-  static final _id_rebuild = jni.Jni.accessors.getMethodIDOf(_class.reference,
-      r"rebuild", r"()Lcom/fasterxml/jackson/core/TSFBuilder;");
+  static final _id_rebuild = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer,
+      r"rebuild",
+      r"()Lcom/fasterxml/jackson/core/TSFBuilder;");
 
   /// from: public com.fasterxml.jackson.core.TSFBuilder<?,?> rebuild()
   /// The returned object must be released after use, by calling the [release] method.
@@ -364,11 +379,11 @@
   ///@since 2.10
   jni.JObject rebuild() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_rebuild, jni.JniCallType.objectType, []).object);
+        reference.pointer, _id_rebuild, jni.JniCallType.objectType, []).object);
   }
 
   static final _id_builder = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"builder",
       r"()Lcom/fasterxml/jackson/core/TSFBuilder;");
 
@@ -385,12 +400,14 @@
   ///@return Builder instance to use
   static jni.JObject builder() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors
-        .callStaticMethodWithArgs(_class.reference, _id_builder,
+        .callStaticMethodWithArgs(_class.reference.pointer, _id_builder,
             jni.JniCallType.objectType, []).object);
   }
 
   static final _id_copy = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"copy", r"()Lcom/fasterxml/jackson/core/JsonFactory;");
+      _class.reference.pointer,
+      r"copy",
+      r"()Lcom/fasterxml/jackson/core/JsonFactory;");
 
   /// from: public com.fasterxml.jackson.core.JsonFactory copy()
   /// The returned object must be released after use, by calling the [release] method.
@@ -409,12 +426,12 @@
   ///@since 2.1
   JsonFactory copy() {
     return const $JsonFactoryType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(
-            reference, _id_copy, jni.JniCallType.objectType, []).object);
+        .callMethodWithArgs(reference.pointer, _id_copy,
+            jni.JniCallType.objectType, []).object);
   }
 
-  static final _id_readResolve = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"readResolve", r"()Ljava/lang/Object;");
+  static final _id_readResolve = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"readResolve", r"()Ljava/lang/Object;");
 
   /// from: protected java.lang.Object readResolve()
   /// The returned object must be released after use, by calling the [release] method.
@@ -427,11 +444,13 @@
   ///@return Newly constructed instance
   jni.JObject readResolve() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_readResolve, jni.JniCallType.objectType, []).object);
+        reference.pointer,
+        _id_readResolve,
+        jni.JniCallType.objectType, []).object);
   }
 
-  static final _id_requiresPropertyOrdering = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"requiresPropertyOrdering", r"()Z");
+  static final _id_requiresPropertyOrdering = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"requiresPropertyOrdering", r"()Z");
 
   /// from: public boolean requiresPropertyOrdering()
   ///
@@ -450,12 +469,12 @@
   ///   requires Object properties to be ordered.
   ///@since 2.3
   bool requiresPropertyOrdering() {
-    return jni.Jni.accessors.callMethodWithArgs(reference,
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
         _id_requiresPropertyOrdering, jni.JniCallType.booleanType, []).boolean;
   }
 
-  static final _id_canHandleBinaryNatively = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"canHandleBinaryNatively", r"()Z");
+  static final _id_canHandleBinaryNatively = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"canHandleBinaryNatively", r"()Z");
 
   /// from: public boolean canHandleBinaryNatively()
   ///
@@ -471,12 +490,12 @@
   ///    supports native binary content
   ///@since 2.3
   bool canHandleBinaryNatively() {
-    return jni.Jni.accessors.callMethodWithArgs(reference,
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
         _id_canHandleBinaryNatively, jni.JniCallType.booleanType, []).boolean;
   }
 
   static final _id_canUseCharArrays = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"canUseCharArrays", r"()Z");
+      .getMethodIDOf(_class.reference.pointer, r"canUseCharArrays", r"()Z");
 
   /// from: public boolean canUseCharArrays()
   ///
@@ -492,12 +511,12 @@
   ///   accessed using parser method {@code getTextCharacters()}.
   ///@since 2.4
   bool canUseCharArrays() {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_canUseCharArrays,
-        jni.JniCallType.booleanType, []).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_canUseCharArrays, jni.JniCallType.booleanType, []).boolean;
   }
 
   static final _id_canParseAsync = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"canParseAsync", r"()Z");
+      .getMethodIDOf(_class.reference.pointer, r"canParseAsync", r"()Z");
 
   /// from: public boolean canParseAsync()
   ///
@@ -509,36 +528,40 @@
   ///    not (and consequently whether {@code createNonBlockingXxx()} method(s) work)
   ///@since 2.9
   bool canParseAsync() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_canParseAsync, jni.JniCallType.booleanType, []).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_canParseAsync, jni.JniCallType.booleanType, []).boolean;
   }
 
   static final _id_getFormatReadFeatureType = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"getFormatReadFeatureType", r"()Ljava/lang/Class;");
+      _class.reference.pointer,
+      r"getFormatReadFeatureType",
+      r"()Ljava/lang/Class;");
 
   /// from: public java.lang.Class<? extends com.fasterxml.jackson.core.FormatFeature> getFormatReadFeatureType()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject getFormatReadFeatureType() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_getFormatReadFeatureType,
         jni.JniCallType.objectType, []).object);
   }
 
   static final _id_getFormatWriteFeatureType = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"getFormatWriteFeatureType", r"()Ljava/lang/Class;");
+      _class.reference.pointer,
+      r"getFormatWriteFeatureType",
+      r"()Ljava/lang/Class;");
 
   /// from: public java.lang.Class<? extends com.fasterxml.jackson.core.FormatFeature> getFormatWriteFeatureType()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject getFormatWriteFeatureType() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_getFormatWriteFeatureType,
         jni.JniCallType.objectType, []).object);
   }
 
   static final _id_canUseSchema = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"canUseSchema",
       r"(Lcom/fasterxml/jackson/core/FormatSchema;)Z");
 
@@ -556,12 +579,15 @@
   bool canUseSchema(
     jni.JObject schema,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_canUseSchema,
-        jni.JniCallType.booleanType, [schema.reference]).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_canUseSchema,
+        jni.JniCallType.booleanType,
+        [schema.reference.pointer]).boolean;
   }
 
   static final _id_getFormatName = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"getFormatName", r"()Ljava/lang/String;");
+      _class.reference.pointer, r"getFormatName", r"()Ljava/lang/String;");
 
   /// from: public java.lang.String getFormatName()
   /// The returned object must be released after use, by calling the [release] method.
@@ -574,11 +600,13 @@
   ///@return Name of the format handled by parsers, generators this factory creates
   jni.JString getFormatName() {
     return const jni.JStringType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getFormatName, jni.JniCallType.objectType, []).object);
+        reference.pointer,
+        _id_getFormatName,
+        jni.JniCallType.objectType, []).object);
   }
 
   static final _id_hasFormat = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"hasFormat",
       r"(Lcom/fasterxml/jackson/core/format/InputAccessor;)Lcom/fasterxml/jackson/core/format/MatchStrength;");
 
@@ -588,14 +616,14 @@
     jni.JObject acc,
   ) {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_hasFormat,
         jni.JniCallType.objectType,
-        [acc.reference]).object);
+        [acc.reference.pointer]).object);
   }
 
   static final _id_requiresCustomCodec = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"requiresCustomCodec", r"()Z");
+      .getMethodIDOf(_class.reference.pointer, r"requiresCustomCodec", r"()Z");
 
   /// from: public boolean requiresCustomCodec()
   ///
@@ -609,12 +637,12 @@
   ///   ObjectCodec is enough
   ///@since 2.1
   bool requiresCustomCodec() {
-    return jni.Jni.accessors.callMethodWithArgs(reference,
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
         _id_requiresCustomCodec, jni.JniCallType.booleanType, []).boolean;
   }
 
   static final _id_hasJSONFormat = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"hasJSONFormat",
       r"(Lcom/fasterxml/jackson/core/format/InputAccessor;)Lcom/fasterxml/jackson/core/format/MatchStrength;");
 
@@ -624,24 +652,26 @@
     jni.JObject acc,
   ) {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_hasJSONFormat,
         jni.JniCallType.objectType,
-        [acc.reference]).object);
+        [acc.reference.pointer]).object);
   }
 
   static final _id_version = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"version", r"()Lcom/fasterxml/jackson/core/Version;");
+      _class.reference.pointer,
+      r"version",
+      r"()Lcom/fasterxml/jackson/core/Version;");
 
   /// from: public com.fasterxml.jackson.core.Version version()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject version() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_version, jni.JniCallType.objectType, []).object);
+        reference.pointer, _id_version, jni.JniCallType.objectType, []).object);
   }
 
   static final _id_configure = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"configure",
       r"(Lcom/fasterxml/jackson/core/JsonFactory$Feature;Z)Lcom/fasterxml/jackson/core/JsonFactory;");
 
@@ -659,12 +689,15 @@
     bool state,
   ) {
     return const $JsonFactoryType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_configure,
-            jni.JniCallType.objectType, [f.reference, state ? 1 : 0]).object);
+        .callMethodWithArgs(
+            reference.pointer,
+            _id_configure,
+            jni.JniCallType.objectType,
+            [f.reference.pointer, state ? 1 : 0]).object);
   }
 
   static final _id_enable = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"enable",
       r"(Lcom/fasterxml/jackson/core/JsonFactory$Feature;)Lcom/fasterxml/jackson/core/JsonFactory;");
 
@@ -680,12 +713,12 @@
     JsonFactory_Feature f,
   ) {
     return const $JsonFactoryType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_enable, jni.JniCallType.objectType,
-            [f.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_enable,
+            jni.JniCallType.objectType, [f.reference.pointer]).object);
   }
 
   static final _id_disable = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"disable",
       r"(Lcom/fasterxml/jackson/core/JsonFactory$Feature;)Lcom/fasterxml/jackson/core/JsonFactory;");
 
@@ -701,12 +734,14 @@
     JsonFactory_Feature f,
   ) {
     return const $JsonFactoryType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_disable, jni.JniCallType.objectType,
-            [f.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_disable,
+            jni.JniCallType.objectType, [f.reference.pointer]).object);
   }
 
-  static final _id_isEnabled = jni.Jni.accessors.getMethodIDOf(_class.reference,
-      r"isEnabled", r"(Lcom/fasterxml/jackson/core/JsonFactory$Feature;)Z");
+  static final _id_isEnabled = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer,
+      r"isEnabled",
+      r"(Lcom/fasterxml/jackson/core/JsonFactory$Feature;)Z");
 
   /// from: public final boolean isEnabled(com.fasterxml.jackson.core.JsonFactory.Feature f)
   ///
@@ -716,48 +751,51 @@
   bool isEnabled(
     JsonFactory_Feature f,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_isEnabled,
-        jni.JniCallType.booleanType, [f.reference]).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_isEnabled,
+        jni.JniCallType.booleanType,
+        [f.reference.pointer]).boolean;
   }
 
   static final _id_getParserFeatures = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getParserFeatures", r"()I");
+      .getMethodIDOf(_class.reference.pointer, r"getParserFeatures", r"()I");
 
   /// from: public final int getParserFeatures()
   int getParserFeatures() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getParserFeatures, jni.JniCallType.intType, []).integer;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_getParserFeatures, jni.JniCallType.intType, []).integer;
   }
 
   static final _id_getGeneratorFeatures = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getGeneratorFeatures", r"()I");
+      .getMethodIDOf(_class.reference.pointer, r"getGeneratorFeatures", r"()I");
 
   /// from: public final int getGeneratorFeatures()
   int getGeneratorFeatures() {
-    return jni.Jni.accessors.callMethodWithArgs(reference,
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
         _id_getGeneratorFeatures, jni.JniCallType.intType, []).integer;
   }
 
-  static final _id_getFormatParserFeatures = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getFormatParserFeatures", r"()I");
+  static final _id_getFormatParserFeatures = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"getFormatParserFeatures", r"()I");
 
   /// from: public int getFormatParserFeatures()
   int getFormatParserFeatures() {
-    return jni.Jni.accessors.callMethodWithArgs(reference,
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
         _id_getFormatParserFeatures, jni.JniCallType.intType, []).integer;
   }
 
-  static final _id_getFormatGeneratorFeatures = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getFormatGeneratorFeatures", r"()I");
+  static final _id_getFormatGeneratorFeatures = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"getFormatGeneratorFeatures", r"()I");
 
   /// from: public int getFormatGeneratorFeatures()
   int getFormatGeneratorFeatures() {
-    return jni.Jni.accessors.callMethodWithArgs(reference,
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
         _id_getFormatGeneratorFeatures, jni.JniCallType.intType, []).integer;
   }
 
   static final _id_configure1 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"configure",
       r"(Lcom/fasterxml/jackson/core/JsonParser$Feature;Z)Lcom/fasterxml/jackson/core/JsonFactory;");
 
@@ -774,12 +812,15 @@
     bool state,
   ) {
     return const $JsonFactoryType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_configure1,
-            jni.JniCallType.objectType, [f.reference, state ? 1 : 0]).object);
+        .callMethodWithArgs(
+            reference.pointer,
+            _id_configure1,
+            jni.JniCallType.objectType,
+            [f.reference.pointer, state ? 1 : 0]).object);
   }
 
   static final _id_enable1 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"enable",
       r"(Lcom/fasterxml/jackson/core/JsonParser$Feature;)Lcom/fasterxml/jackson/core/JsonFactory;");
 
@@ -794,12 +835,12 @@
     jsonparser_.JsonParser_Feature f,
   ) {
     return const $JsonFactoryType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_enable1, jni.JniCallType.objectType,
-            [f.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_enable1,
+            jni.JniCallType.objectType, [f.reference.pointer]).object);
   }
 
   static final _id_disable1 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"disable",
       r"(Lcom/fasterxml/jackson/core/JsonParser$Feature;)Lcom/fasterxml/jackson/core/JsonFactory;");
 
@@ -814,12 +855,12 @@
     jsonparser_.JsonParser_Feature f,
   ) {
     return const $JsonFactoryType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_disable1, jni.JniCallType.objectType,
-            [f.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_disable1,
+            jni.JniCallType.objectType, [f.reference.pointer]).object);
   }
 
   static final _id_isEnabled1 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"isEnabled",
       r"(Lcom/fasterxml/jackson/core/JsonParser$Feature;)Z");
 
@@ -831,12 +872,15 @@
   bool isEnabled1(
     jsonparser_.JsonParser_Feature f,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_isEnabled1,
-        jni.JniCallType.booleanType, [f.reference]).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_isEnabled1,
+        jni.JniCallType.booleanType,
+        [f.reference.pointer]).boolean;
   }
 
   static final _id_isEnabled2 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"isEnabled",
       r"(Lcom/fasterxml/jackson/core/StreamReadFeature;)Z");
 
@@ -849,12 +893,15 @@
   bool isEnabled2(
     jni.JObject f,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_isEnabled2,
-        jni.JniCallType.booleanType, [f.reference]).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_isEnabled2,
+        jni.JniCallType.booleanType,
+        [f.reference.pointer]).boolean;
   }
 
   static final _id_getInputDecorator = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"getInputDecorator",
       r"()Lcom/fasterxml/jackson/core/io/InputDecorator;");
 
@@ -866,13 +913,13 @@
   ///@return InputDecorator configured, if any
   jni.JObject getInputDecorator() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_getInputDecorator,
         jni.JniCallType.objectType, []).object);
   }
 
   static final _id_setInputDecorator = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"setInputDecorator",
       r"(Lcom/fasterxml/jackson/core/io/InputDecorator;)Lcom/fasterxml/jackson/core/JsonFactory;");
 
@@ -887,12 +934,12 @@
     jni.JObject d,
   ) {
     return const $JsonFactoryType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_setInputDecorator,
-            jni.JniCallType.objectType, [d.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_setInputDecorator,
+            jni.JniCallType.objectType, [d.reference.pointer]).object);
   }
 
   static final _id_configure2 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"configure",
       r"(Lcom/fasterxml/jackson/core/JsonGenerator$Feature;Z)Lcom/fasterxml/jackson/core/JsonFactory;");
 
@@ -909,12 +956,15 @@
     bool state,
   ) {
     return const $JsonFactoryType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_configure2,
-            jni.JniCallType.objectType, [f.reference, state ? 1 : 0]).object);
+        .callMethodWithArgs(
+            reference.pointer,
+            _id_configure2,
+            jni.JniCallType.objectType,
+            [f.reference.pointer, state ? 1 : 0]).object);
   }
 
   static final _id_enable2 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"enable",
       r"(Lcom/fasterxml/jackson/core/JsonGenerator$Feature;)Lcom/fasterxml/jackson/core/JsonFactory;");
 
@@ -929,12 +979,12 @@
     jni.JObject f,
   ) {
     return const $JsonFactoryType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_enable2, jni.JniCallType.objectType,
-            [f.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_enable2,
+            jni.JniCallType.objectType, [f.reference.pointer]).object);
   }
 
   static final _id_disable2 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"disable",
       r"(Lcom/fasterxml/jackson/core/JsonGenerator$Feature;)Lcom/fasterxml/jackson/core/JsonFactory;");
 
@@ -949,12 +999,12 @@
     jni.JObject f,
   ) {
     return const $JsonFactoryType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_disable2, jni.JniCallType.objectType,
-            [f.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_disable2,
+            jni.JniCallType.objectType, [f.reference.pointer]).object);
   }
 
   static final _id_isEnabled3 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"isEnabled",
       r"(Lcom/fasterxml/jackson/core/JsonGenerator$Feature;)Z");
 
@@ -966,12 +1016,15 @@
   bool isEnabled3(
     jni.JObject f,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_isEnabled3,
-        jni.JniCallType.booleanType, [f.reference]).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_isEnabled3,
+        jni.JniCallType.booleanType,
+        [f.reference.pointer]).boolean;
   }
 
   static final _id_isEnabled4 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"isEnabled",
       r"(Lcom/fasterxml/jackson/core/StreamWriteFeature;)Z");
 
@@ -984,12 +1037,15 @@
   bool isEnabled4(
     jni.JObject f,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_isEnabled4,
-        jni.JniCallType.booleanType, [f.reference]).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_isEnabled4,
+        jni.JniCallType.booleanType,
+        [f.reference.pointer]).boolean;
   }
 
   static final _id_getCharacterEscapes = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"getCharacterEscapes",
       r"()Lcom/fasterxml/jackson/core/io/CharacterEscapes;");
 
@@ -1001,13 +1057,13 @@
   ///@return Configured {@code CharacterEscapes}, if any; {@code null} if none
   jni.JObject getCharacterEscapes() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_getCharacterEscapes,
         jni.JniCallType.objectType, []).object);
   }
 
   static final _id_setCharacterEscapes = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"setCharacterEscapes",
       r"(Lcom/fasterxml/jackson/core/io/CharacterEscapes;)Lcom/fasterxml/jackson/core/JsonFactory;");
 
@@ -1022,12 +1078,12 @@
     jni.JObject esc,
   ) {
     return const $JsonFactoryType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_setCharacterEscapes,
-            jni.JniCallType.objectType, [esc.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_setCharacterEscapes,
+            jni.JniCallType.objectType, [esc.reference.pointer]).object);
   }
 
   static final _id_getOutputDecorator = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"getOutputDecorator",
       r"()Lcom/fasterxml/jackson/core/io/OutputDecorator;");
 
@@ -1040,13 +1096,13 @@
   ///    {@code null} if none.
   jni.JObject getOutputDecorator() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_getOutputDecorator,
         jni.JniCallType.objectType, []).object);
   }
 
   static final _id_setOutputDecorator = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"setOutputDecorator",
       r"(Lcom/fasterxml/jackson/core/io/OutputDecorator;)Lcom/fasterxml/jackson/core/JsonFactory;");
 
@@ -1061,12 +1117,12 @@
     jni.JObject d,
   ) {
     return const $JsonFactoryType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_setOutputDecorator,
-            jni.JniCallType.objectType, [d.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_setOutputDecorator,
+            jni.JniCallType.objectType, [d.reference.pointer]).object);
   }
 
   static final _id_setRootValueSeparator = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"setRootValueSeparator",
       r"(Ljava/lang/String;)Lcom/fasterxml/jackson/core/JsonFactory;");
 
@@ -1082,12 +1138,14 @@
     jni.JString sep,
   ) {
     return const $JsonFactoryType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_setRootValueSeparator,
-            jni.JniCallType.objectType, [sep.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_setRootValueSeparator,
+            jni.JniCallType.objectType, [sep.reference.pointer]).object);
   }
 
   static final _id_getRootValueSeparator = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"getRootValueSeparator", r"()Ljava/lang/String;");
+      _class.reference.pointer,
+      r"getRootValueSeparator",
+      r"()Ljava/lang/String;");
 
   /// from: public java.lang.String getRootValueSeparator()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1095,13 +1153,13 @@
   /// @return Root value separator configured, if any
   jni.JString getRootValueSeparator() {
     return const jni.JStringType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_getRootValueSeparator,
         jni.JniCallType.objectType, []).object);
   }
 
   static final _id_setCodec = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"setCodec",
       r"(Lcom/fasterxml/jackson/core/ObjectCodec;)Lcom/fasterxml/jackson/core/JsonFactory;");
 
@@ -1119,22 +1177,26 @@
     jni.JObject oc,
   ) {
     return const $JsonFactoryType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_setCodec, jni.JniCallType.objectType,
-            [oc.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_setCodec,
+            jni.JniCallType.objectType, [oc.reference.pointer]).object);
   }
 
-  static final _id_getCodec = jni.Jni.accessors.getMethodIDOf(_class.reference,
-      r"getCodec", r"()Lcom/fasterxml/jackson/core/ObjectCodec;");
+  static final _id_getCodec = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer,
+      r"getCodec",
+      r"()Lcom/fasterxml/jackson/core/ObjectCodec;");
 
   /// from: public com.fasterxml.jackson.core.ObjectCodec getCodec()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject getCodec() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getCodec, jni.JniCallType.objectType, []).object);
+        reference.pointer,
+        _id_getCodec,
+        jni.JniCallType.objectType, []).object);
   }
 
   static final _id_createParser = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createParser",
       r"(Ljava/io/File;)Lcom/fasterxml/jackson/core/JsonParser;");
 
@@ -1161,12 +1223,12 @@
     jni.JObject f,
   ) {
     return const jsonparser_.$JsonParserType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_createParser,
-            jni.JniCallType.objectType, [f.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_createParser,
+            jni.JniCallType.objectType, [f.reference.pointer]).object);
   }
 
   static final _id_createParser1 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createParser",
       r"(Ljava/net/URL;)Lcom/fasterxml/jackson/core/JsonParser;");
 
@@ -1191,12 +1253,12 @@
     jni.JObject url,
   ) {
     return const jsonparser_.$JsonParserType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_createParser1,
-            jni.JniCallType.objectType, [url.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_createParser1,
+            jni.JniCallType.objectType, [url.reference.pointer]).object);
   }
 
   static final _id_createParser2 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createParser",
       r"(Ljava/io/InputStream;)Lcom/fasterxml/jackson/core/JsonParser;");
 
@@ -1224,12 +1286,12 @@
     jni.JObject in0,
   ) {
     return const jsonparser_.$JsonParserType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_createParser2,
-            jni.JniCallType.objectType, [in0.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_createParser2,
+            jni.JniCallType.objectType, [in0.reference.pointer]).object);
   }
 
   static final _id_createParser3 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createParser",
       r"(Ljava/io/Reader;)Lcom/fasterxml/jackson/core/JsonParser;");
 
@@ -1250,12 +1312,12 @@
     jni.JObject r,
   ) {
     return const jsonparser_.$JsonParserType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_createParser3,
-            jni.JniCallType.objectType, [r.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_createParser3,
+            jni.JniCallType.objectType, [r.reference.pointer]).object);
   }
 
   static final _id_createParser4 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createParser",
       r"([B)Lcom/fasterxml/jackson/core/JsonParser;");
 
@@ -1269,12 +1331,12 @@
     jni.JArray<jni.jbyte> data,
   ) {
     return const jsonparser_.$JsonParserType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_createParser4,
-            jni.JniCallType.objectType, [data.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_createParser4,
+            jni.JniCallType.objectType, [data.reference.pointer]).object);
   }
 
   static final _id_createParser5 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createParser",
       r"([BII)Lcom/fasterxml/jackson/core/JsonParser;");
 
@@ -1294,15 +1356,15 @@
   ) {
     return const jsonparser_.$JsonParserType().fromRef(jni.Jni.accessors
         .callMethodWithArgs(
-            reference, _id_createParser5, jni.JniCallType.objectType, [
-      data.reference,
+            reference.pointer, _id_createParser5, jni.JniCallType.objectType, [
+      data.reference.pointer,
       jni.JValueInt(offset),
       jni.JValueInt(len)
     ]).object);
   }
 
   static final _id_createParser6 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createParser",
       r"(Ljava/lang/String;)Lcom/fasterxml/jackson/core/JsonParser;");
 
@@ -1316,12 +1378,12 @@
     jni.JString content,
   ) {
     return const jsonparser_.$JsonParserType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_createParser6,
-            jni.JniCallType.objectType, [content.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_createParser6,
+            jni.JniCallType.objectType, [content.reference.pointer]).object);
   }
 
   static final _id_createParser7 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createParser",
       r"([C)Lcom/fasterxml/jackson/core/JsonParser;");
 
@@ -1335,12 +1397,12 @@
     jni.JArray<jni.jchar> content,
   ) {
     return const jsonparser_.$JsonParserType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_createParser7,
-            jni.JniCallType.objectType, [content.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_createParser7,
+            jni.JniCallType.objectType, [content.reference.pointer]).object);
   }
 
   static final _id_createParser8 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createParser",
       r"([CII)Lcom/fasterxml/jackson/core/JsonParser;");
 
@@ -1356,15 +1418,15 @@
   ) {
     return const jsonparser_.$JsonParserType().fromRef(jni.Jni.accessors
         .callMethodWithArgs(
-            reference, _id_createParser8, jni.JniCallType.objectType, [
-      content.reference,
+            reference.pointer, _id_createParser8, jni.JniCallType.objectType, [
+      content.reference.pointer,
       jni.JValueInt(offset),
       jni.JValueInt(len)
     ]).object);
   }
 
   static final _id_createParser9 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createParser",
       r"(Ljava/io/DataInput;)Lcom/fasterxml/jackson/core/JsonParser;");
 
@@ -1381,12 +1443,14 @@
     jni.JObject in0,
   ) {
     return const jsonparser_.$JsonParserType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_createParser9,
-            jni.JniCallType.objectType, [in0.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_createParser9,
+            jni.JniCallType.objectType, [in0.reference.pointer]).object);
   }
 
   static final _id_createNonBlockingByteArrayParser = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"createNonBlockingByteArrayParser",
+      .getMethodIDOf(
+          _class.reference.pointer,
+          r"createNonBlockingByteArrayParser",
           r"()Lcom/fasterxml/jackson/core/JsonParser;");
 
   /// from: public com.fasterxml.jackson.core.JsonParser createNonBlockingByteArrayParser()
@@ -1407,12 +1471,14 @@
   ///@since 2.9
   jsonparser_.JsonParser createNonBlockingByteArrayParser() {
     return const jsonparser_.$JsonParserType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_createNonBlockingByteArrayParser,
+        .callMethodWithArgs(
+            reference.pointer,
+            _id_createNonBlockingByteArrayParser,
             jni.JniCallType.objectType, []).object);
   }
 
   static final _id_createGenerator = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createGenerator",
       r"(Ljava/io/OutputStream;Lcom/fasterxml/jackson/core/JsonEncoding;)Lcom/fasterxml/jackson/core/JsonGenerator;");
 
@@ -1442,14 +1508,14 @@
     jni.JObject enc,
   ) {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_createGenerator,
         jni.JniCallType.objectType,
-        [out.reference, enc.reference]).object);
+        [out.reference.pointer, enc.reference.pointer]).object);
   }
 
   static final _id_createGenerator1 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createGenerator",
       r"(Ljava/io/OutputStream;)Lcom/fasterxml/jackson/core/JsonGenerator;");
 
@@ -1465,14 +1531,14 @@
     jni.JObject out,
   ) {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_createGenerator1,
         jni.JniCallType.objectType,
-        [out.reference]).object);
+        [out.reference.pointer]).object);
   }
 
   static final _id_createGenerator2 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createGenerator",
       r"(Ljava/io/Writer;)Lcom/fasterxml/jackson/core/JsonGenerator;");
 
@@ -1494,14 +1560,14 @@
     jni.JObject w,
   ) {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_createGenerator2,
         jni.JniCallType.objectType,
-        [w.reference]).object);
+        [w.reference.pointer]).object);
   }
 
   static final _id_createGenerator3 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createGenerator",
       r"(Ljava/io/File;Lcom/fasterxml/jackson/core/JsonEncoding;)Lcom/fasterxml/jackson/core/JsonGenerator;");
 
@@ -1525,14 +1591,14 @@
     jni.JObject enc,
   ) {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_createGenerator3,
         jni.JniCallType.objectType,
-        [f.reference, enc.reference]).object);
+        [f.reference.pointer, enc.reference.pointer]).object);
   }
 
   static final _id_createGenerator4 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createGenerator",
       r"(Ljava/io/DataOutput;Lcom/fasterxml/jackson/core/JsonEncoding;)Lcom/fasterxml/jackson/core/JsonGenerator;");
 
@@ -1547,14 +1613,14 @@
     jni.JObject enc,
   ) {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_createGenerator4,
         jni.JniCallType.objectType,
-        [out.reference, enc.reference]).object);
+        [out.reference.pointer, enc.reference.pointer]).object);
   }
 
   static final _id_createGenerator5 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createGenerator",
       r"(Ljava/io/DataOutput;)Lcom/fasterxml/jackson/core/JsonGenerator;");
 
@@ -1570,14 +1636,14 @@
     jni.JObject out,
   ) {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_createGenerator5,
         jni.JniCallType.objectType,
-        [out.reference]).object);
+        [out.reference.pointer]).object);
   }
 
   static final _id_createJsonParser = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createJsonParser",
       r"(Ljava/io/File;)Lcom/fasterxml/jackson/core/JsonParser;");
 
@@ -1606,12 +1672,12 @@
     jni.JObject f,
   ) {
     return const jsonparser_.$JsonParserType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_createJsonParser,
-            jni.JniCallType.objectType, [f.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_createJsonParser,
+            jni.JniCallType.objectType, [f.reference.pointer]).object);
   }
 
   static final _id_createJsonParser1 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createJsonParser",
       r"(Ljava/net/URL;)Lcom/fasterxml/jackson/core/JsonParser;");
 
@@ -1639,12 +1705,12 @@
     jni.JObject url,
   ) {
     return const jsonparser_.$JsonParserType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_createJsonParser1,
-            jni.JniCallType.objectType, [url.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_createJsonParser1,
+            jni.JniCallType.objectType, [url.reference.pointer]).object);
   }
 
   static final _id_createJsonParser2 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createJsonParser",
       r"(Ljava/io/InputStream;)Lcom/fasterxml/jackson/core/JsonParser;");
 
@@ -1675,12 +1741,12 @@
     jni.JObject in0,
   ) {
     return const jsonparser_.$JsonParserType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_createJsonParser2,
-            jni.JniCallType.objectType, [in0.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_createJsonParser2,
+            jni.JniCallType.objectType, [in0.reference.pointer]).object);
   }
 
   static final _id_createJsonParser3 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createJsonParser",
       r"(Ljava/io/Reader;)Lcom/fasterxml/jackson/core/JsonParser;");
 
@@ -1704,12 +1770,12 @@
     jni.JObject r,
   ) {
     return const jsonparser_.$JsonParserType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_createJsonParser3,
-            jni.JniCallType.objectType, [r.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_createJsonParser3,
+            jni.JniCallType.objectType, [r.reference.pointer]).object);
   }
 
   static final _id_createJsonParser4 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createJsonParser",
       r"([B)Lcom/fasterxml/jackson/core/JsonParser;");
 
@@ -1726,12 +1792,12 @@
     jni.JArray<jni.jbyte> data,
   ) {
     return const jsonparser_.$JsonParserType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_createJsonParser4,
-            jni.JniCallType.objectType, [data.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_createJsonParser4,
+            jni.JniCallType.objectType, [data.reference.pointer]).object);
   }
 
   static final _id_createJsonParser5 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createJsonParser",
       r"([BII)Lcom/fasterxml/jackson/core/JsonParser;");
 
@@ -1753,16 +1819,16 @@
     int len,
   ) {
     return const jsonparser_.$JsonParserType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(
-            reference, _id_createJsonParser5, jni.JniCallType.objectType, [
-      data.reference,
+        .callMethodWithArgs(reference.pointer, _id_createJsonParser5,
+            jni.JniCallType.objectType, [
+      data.reference.pointer,
       jni.JValueInt(offset),
       jni.JValueInt(len)
     ]).object);
   }
 
   static final _id_createJsonParser6 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createJsonParser",
       r"(Ljava/lang/String;)Lcom/fasterxml/jackson/core/JsonParser;");
 
@@ -1780,12 +1846,12 @@
     jni.JString content,
   ) {
     return const jsonparser_.$JsonParserType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_createJsonParser6,
-            jni.JniCallType.objectType, [content.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_createJsonParser6,
+            jni.JniCallType.objectType, [content.reference.pointer]).object);
   }
 
   static final _id_createJsonGenerator = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createJsonGenerator",
       r"(Ljava/io/OutputStream;Lcom/fasterxml/jackson/core/JsonEncoding;)Lcom/fasterxml/jackson/core/JsonGenerator;");
 
@@ -1817,14 +1883,14 @@
     jni.JObject enc,
   ) {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_createJsonGenerator,
         jni.JniCallType.objectType,
-        [out.reference, enc.reference]).object);
+        [out.reference.pointer, enc.reference.pointer]).object);
   }
 
   static final _id_createJsonGenerator1 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createJsonGenerator",
       r"(Ljava/io/Writer;)Lcom/fasterxml/jackson/core/JsonGenerator;");
 
@@ -1848,14 +1914,14 @@
     jni.JObject out,
   ) {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_createJsonGenerator1,
         jni.JniCallType.objectType,
-        [out.reference]).object);
+        [out.reference.pointer]).object);
   }
 
   static final _id_createJsonGenerator2 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"createJsonGenerator",
       r"(Ljava/io/OutputStream;)Lcom/fasterxml/jackson/core/JsonGenerator;");
 
@@ -1874,10 +1940,10 @@
     jni.JObject out,
   ) {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_createJsonGenerator2,
         jni.JniCallType.objectType,
-        [out.reference]).object);
+        [out.reference.pointer]).object);
   }
 }
 
diff --git a/pkgs/jnigen/test/jackson_core_test/third_party/dart_only/dart_bindings/com/fasterxml/jackson/core/JsonParser.dart b/pkgs/jnigen/test/jackson_core_test/third_party/dart_only/dart_bindings/com/fasterxml/jackson/core/JsonParser.dart
index ae8f7aa..c17de90 100644
--- a/pkgs/jnigen/test/jackson_core_test/third_party/dart_only/dart_bindings/com/fasterxml/jackson/core/JsonParser.dart
+++ b/pkgs/jnigen/test/jackson_core_test/third_party/dart_only/dart_bindings/com/fasterxml/jackson/core/JsonParser.dart
@@ -58,7 +58,7 @@
   /// The type which includes information such as the signature of this class.
   static const type = $JsonParser_FeatureType();
   static final _id_values = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"values",
       r"()[Lcom/fasterxml/jackson/core/JsonParser$Feature;");
 
@@ -66,12 +66,12 @@
   /// The returned object must be released after use, by calling the [release] method.
   static jni.JArray<JsonParser_Feature> values() {
     return const jni.JArrayType($JsonParser_FeatureType()).fromRef(
-        jni.Jni.accessors.callStaticMethodWithArgs(_class.reference, _id_values,
-            jni.JniCallType.objectType, []).object);
+        jni.Jni.accessors.callStaticMethodWithArgs(_class.reference.pointer,
+            _id_values, jni.JniCallType.objectType, []).object);
   }
 
   static final _id_valueOf = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"valueOf",
       r"(Ljava/lang/String;)Lcom/fasterxml/jackson/core/JsonParser$Feature;");
 
@@ -81,12 +81,12 @@
     jni.JString name,
   ) {
     return const $JsonParser_FeatureType().fromRef(jni.Jni.accessors
-        .callStaticMethodWithArgs(_class.reference, _id_valueOf,
-            jni.JniCallType.objectType, [name.reference]).object);
+        .callStaticMethodWithArgs(_class.reference.pointer, _id_valueOf,
+            jni.JniCallType.objectType, [name.reference.pointer]).object);
   }
 
-  static final _id_collectDefaults = jni.Jni.accessors
-      .getStaticMethodIDOf(_class.reference, r"collectDefaults", r"()I");
+  static final _id_collectDefaults = jni.Jni.accessors.getStaticMethodIDOf(
+      _class.reference.pointer, r"collectDefaults", r"()I");
 
   /// from: static public int collectDefaults()
   ///
@@ -94,37 +94,40 @@
   /// are enabled by default.
   ///@return Bit mask of all features that are enabled by default
   static int collectDefaults() {
-    return jni.Jni.accessors.callStaticMethodWithArgs(_class.reference,
+    return jni.Jni.accessors.callStaticMethodWithArgs(_class.reference.pointer,
         _id_collectDefaults, jni.JniCallType.intType, []).integer;
   }
 
   static final _id_enabledByDefault = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"enabledByDefault", r"()Z");
+      .getMethodIDOf(_class.reference.pointer, r"enabledByDefault", r"()Z");
 
   /// from: public boolean enabledByDefault()
   bool enabledByDefault() {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_enabledByDefault,
-        jni.JniCallType.booleanType, []).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_enabledByDefault, jni.JniCallType.booleanType, []).boolean;
   }
 
-  static final _id_enabledIn =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"enabledIn", r"(I)Z");
+  static final _id_enabledIn = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"enabledIn", r"(I)Z");
 
   /// from: public boolean enabledIn(int flags)
   bool enabledIn(
     int flags,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_enabledIn,
-        jni.JniCallType.booleanType, [jni.JValueInt(flags)]).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_enabledIn,
+        jni.JniCallType.booleanType,
+        [jni.JValueInt(flags)]).boolean;
   }
 
-  static final _id_getMask =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"getMask", r"()I");
+  static final _id_getMask = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"getMask", r"()I");
 
   /// from: public int getMask()
   int getMask() {
     return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getMask, jni.JniCallType.intType, []).integer;
+        reference.pointer, _id_getMask, jni.JniCallType.intType, []).integer;
   }
 }
 
@@ -172,7 +175,7 @@
   /// The type which includes information such as the signature of this class.
   static const type = $JsonParser_NumberTypeType();
   static final _id_values = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"values",
       r"()[Lcom/fasterxml/jackson/core/JsonParser$NumberType;");
 
@@ -180,12 +183,12 @@
   /// The returned object must be released after use, by calling the [release] method.
   static jni.JArray<JsonParser_NumberType> values() {
     return const jni.JArrayType($JsonParser_NumberTypeType()).fromRef(
-        jni.Jni.accessors.callStaticMethodWithArgs(_class.reference, _id_values,
-            jni.JniCallType.objectType, []).object);
+        jni.Jni.accessors.callStaticMethodWithArgs(_class.reference.pointer,
+            _id_values, jni.JniCallType.objectType, []).object);
   }
 
   static final _id_valueOf = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"valueOf",
       r"(Ljava/lang/String;)Lcom/fasterxml/jackson/core/JsonParser$NumberType;");
 
@@ -195,8 +198,8 @@
     jni.JString name,
   ) {
     return const $JsonParser_NumberTypeType().fromRef(jni.Jni.accessors
-        .callStaticMethodWithArgs(_class.reference, _id_valueOf,
-            jni.JniCallType.objectType, [name.reference]).object);
+        .callStaticMethodWithArgs(_class.reference.pointer, _id_valueOf,
+            jni.JniCallType.objectType, [name.reference.pointer]).object);
   }
 }
 
@@ -248,7 +251,7 @@
   static const type = $JsonParserType();
   static final _id_DEFAULT_READ_CAPABILITIES =
       jni.Jni.accessors.getStaticFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"DEFAULT_READ_CAPABILITIES",
     r"Lcom/fasterxml/jackson/core/util/JacksonFeatureSet;",
   );
@@ -262,22 +265,22 @@
   ///@since 2.12
   static jni.JObject get DEFAULT_READ_CAPABILITIES =>
       const jni.JObjectType().fromRef(jni.Jni.accessors
-          .getStaticField(_class.reference, _id_DEFAULT_READ_CAPABILITIES,
-              jni.JniCallType.objectType)
+          .getStaticField(_class.reference.pointer,
+              _id_DEFAULT_READ_CAPABILITIES, jni.JniCallType.objectType)
           .object);
 
-  static final _id_new0 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"()V");
+  static final _id_new0 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"()V");
 
   /// from: protected void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory JsonParser() {
     return JsonParser.fromRef(jni.Jni.accessors
-        .newObjectWithArgs(_class.reference, _id_new0, []).object);
+        .newObjectWithArgs(_class.reference.pointer, _id_new0, []).object);
   }
 
-  static final _id_new1 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"(I)V");
+  static final _id_new1 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"(I)V");
 
   /// from: protected void <init>(int features)
   /// The returned object must be released after use, by calling the [release] method.
@@ -285,11 +288,13 @@
     int features,
   ) {
     return JsonParser.fromRef(jni.Jni.accessors.newObjectWithArgs(
-        _class.reference, _id_new1, [jni.JValueInt(features)]).object);
+        _class.reference.pointer, _id_new1, [jni.JValueInt(features)]).object);
   }
 
-  static final _id_getCodec = jni.Jni.accessors.getMethodIDOf(_class.reference,
-      r"getCodec", r"()Lcom/fasterxml/jackson/core/ObjectCodec;");
+  static final _id_getCodec = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer,
+      r"getCodec",
+      r"()Lcom/fasterxml/jackson/core/ObjectCodec;");
 
   /// from: public abstract com.fasterxml.jackson.core.ObjectCodec getCodec()
   /// The returned object must be released after use, by calling the [release] method.
@@ -300,11 +305,15 @@
   ///@return Codec assigned to this parser, if any; {@code null} if none
   jni.JObject getCodec() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getCodec, jni.JniCallType.objectType, []).object);
+        reference.pointer,
+        _id_getCodec,
+        jni.JniCallType.objectType, []).object);
   }
 
-  static final _id_setCodec = jni.Jni.accessors.getMethodIDOf(_class.reference,
-      r"setCodec", r"(Lcom/fasterxml/jackson/core/ObjectCodec;)V");
+  static final _id_setCodec = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer,
+      r"setCodec",
+      r"(Lcom/fasterxml/jackson/core/ObjectCodec;)V");
 
   /// from: public abstract void setCodec(com.fasterxml.jackson.core.ObjectCodec oc)
   ///
@@ -315,12 +324,12 @@
   void setCodec(
     jni.JObject oc,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_setCodec,
-        jni.JniCallType.voidType, [oc.reference]).check();
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer, _id_setCodec,
+        jni.JniCallType.voidType, [oc.reference.pointer]).check();
   }
 
   static final _id_getInputSource = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"getInputSource", r"()Ljava/lang/Object;");
+      _class.reference.pointer, r"getInputSource", r"()Ljava/lang/Object;");
 
   /// from: public java.lang.Object getInputSource()
   /// The returned object must be released after use, by calling the [release] method.
@@ -341,11 +350,13 @@
   ///@return Input source this parser was configured with
   jni.JObject getInputSource() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getInputSource, jni.JniCallType.objectType, []).object);
+        reference.pointer,
+        _id_getInputSource,
+        jni.JniCallType.objectType, []).object);
   }
 
   static final _id_setRequestPayloadOnError = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"setRequestPayloadOnError",
       r"(Lcom/fasterxml/jackson/core/util/RequestPayload;)V");
 
@@ -358,14 +369,14 @@
     jni.JObject payload,
   ) {
     return jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_setRequestPayloadOnError,
         jni.JniCallType.voidType,
-        [payload.reference]).check();
+        [payload.reference.pointer]).check();
   }
 
   static final _id_setRequestPayloadOnError1 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"setRequestPayloadOnError",
       r"([BLjava/lang/String;)V");
 
@@ -380,14 +391,16 @@
     jni.JString charset,
   ) {
     return jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_setRequestPayloadOnError1,
         jni.JniCallType.voidType,
-        [payload.reference, charset.reference]).check();
+        [payload.reference.pointer, charset.reference.pointer]).check();
   }
 
   static final _id_setRequestPayloadOnError2 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"setRequestPayloadOnError", r"(Ljava/lang/String;)V");
+      _class.reference.pointer,
+      r"setRequestPayloadOnError",
+      r"(Ljava/lang/String;)V");
 
   /// from: public void setRequestPayloadOnError(java.lang.String payload)
   ///
@@ -398,14 +411,16 @@
     jni.JString payload,
   ) {
     return jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_setRequestPayloadOnError2,
         jni.JniCallType.voidType,
-        [payload.reference]).check();
+        [payload.reference.pointer]).check();
   }
 
-  static final _id_setSchema = jni.Jni.accessors.getMethodIDOf(_class.reference,
-      r"setSchema", r"(Lcom/fasterxml/jackson/core/FormatSchema;)V");
+  static final _id_setSchema = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer,
+      r"setSchema",
+      r"(Lcom/fasterxml/jackson/core/FormatSchema;)V");
 
   /// from: public void setSchema(com.fasterxml.jackson.core.FormatSchema schema)
   ///
@@ -422,12 +437,17 @@
   void setSchema(
     jni.JObject schema,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_setSchema,
-        jni.JniCallType.voidType, [schema.reference]).check();
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_setSchema,
+        jni.JniCallType.voidType,
+        [schema.reference.pointer]).check();
   }
 
-  static final _id_getSchema = jni.Jni.accessors.getMethodIDOf(_class.reference,
-      r"getSchema", r"()Lcom/fasterxml/jackson/core/FormatSchema;");
+  static final _id_getSchema = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer,
+      r"getSchema",
+      r"()Lcom/fasterxml/jackson/core/FormatSchema;");
 
   /// from: public com.fasterxml.jackson.core.FormatSchema getSchema()
   /// The returned object must be released after use, by calling the [release] method.
@@ -438,11 +458,13 @@
   ///@since 2.1
   jni.JObject getSchema() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getSchema, jni.JniCallType.objectType, []).object);
+        reference.pointer,
+        _id_getSchema,
+        jni.JniCallType.objectType, []).object);
   }
 
   static final _id_canUseSchema = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"canUseSchema",
       r"(Lcom/fasterxml/jackson/core/FormatSchema;)Z");
 
@@ -455,12 +477,15 @@
   bool canUseSchema(
     jni.JObject schema,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_canUseSchema,
-        jni.JniCallType.booleanType, [schema.reference]).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_canUseSchema,
+        jni.JniCallType.booleanType,
+        [schema.reference.pointer]).boolean;
   }
 
   static final _id_requiresCustomCodec = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"requiresCustomCodec", r"()Z");
+      .getMethodIDOf(_class.reference.pointer, r"requiresCustomCodec", r"()Z");
 
   /// from: public boolean requiresCustomCodec()
   ///
@@ -473,12 +498,12 @@
   ///   ObjectCodec is enough
   ///@since 2.1
   bool requiresCustomCodec() {
-    return jni.Jni.accessors.callMethodWithArgs(reference,
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
         _id_requiresCustomCodec, jni.JniCallType.booleanType, []).boolean;
   }
 
   static final _id_canParseAsync = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"canParseAsync", r"()Z");
+      .getMethodIDOf(_class.reference.pointer, r"canParseAsync", r"()Z");
 
   /// from: public boolean canParseAsync()
   ///
@@ -494,12 +519,12 @@
   ///@return True if this is a non-blocking ("asynchronous") parser
   ///@since 2.9
   bool canParseAsync() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_canParseAsync, jni.JniCallType.booleanType, []).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_canParseAsync, jni.JniCallType.booleanType, []).boolean;
   }
 
   static final _id_getNonBlockingInputFeeder = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"getNonBlockingInputFeeder",
       r"()Lcom/fasterxml/jackson/core/async/NonBlockingInputFeeder;");
 
@@ -513,13 +538,13 @@
   ///@since 2.9
   jni.JObject getNonBlockingInputFeeder() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_getNonBlockingInputFeeder,
         jni.JniCallType.objectType, []).object);
   }
 
   static final _id_getReadCapabilities = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"getReadCapabilities",
       r"()Lcom/fasterxml/jackson/core/util/JacksonFeatureSet;");
 
@@ -532,13 +557,15 @@
   ///@since 2.12
   jni.JObject getReadCapabilities() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_getReadCapabilities,
         jni.JniCallType.objectType, []).object);
   }
 
   static final _id_version = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"version", r"()Lcom/fasterxml/jackson/core/Version;");
+      _class.reference.pointer,
+      r"version",
+      r"()Lcom/fasterxml/jackson/core/Version;");
 
   /// from: public abstract com.fasterxml.jackson.core.Version version()
   /// The returned object must be released after use, by calling the [release] method.
@@ -549,11 +576,11 @@
   ///   {@code jackson-core} jar that contains the class
   jni.JObject version() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_version, jni.JniCallType.objectType, []).object);
+        reference.pointer, _id_version, jni.JniCallType.objectType, []).object);
   }
 
-  static final _id_close =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"close", r"()V");
+  static final _id_close = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"close", r"()V");
 
   /// from: public abstract void close()
   ///
@@ -573,11 +600,11 @@
   ///@throws IOException if there is either an underlying I/O problem
   void close() {
     return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_close, jni.JniCallType.voidType, []).check();
+        reference.pointer, _id_close, jni.JniCallType.voidType, []).check();
   }
 
-  static final _id_isClosed =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"isClosed", r"()Z");
+  static final _id_isClosed = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"isClosed", r"()Z");
 
   /// from: public abstract boolean isClosed()
   ///
@@ -589,12 +616,12 @@
   /// end of input.
   ///@return {@code True} if this parser instance has been closed
   bool isClosed() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_isClosed, jni.JniCallType.booleanType, []).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer, _id_isClosed,
+        jni.JniCallType.booleanType, []).boolean;
   }
 
   static final _id_getParsingContext = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"getParsingContext",
       r"()Lcom/fasterxml/jackson/core/JsonStreamContext;");
 
@@ -612,13 +639,13 @@
   ///@return Stream input context (JsonStreamContext) associated with this parser
   jni.JObject getParsingContext() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_getParsingContext,
         jni.JniCallType.objectType, []).object);
   }
 
   static final _id_currentLocation = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"currentLocation",
       r"()Lcom/fasterxml/jackson/core/JsonLocation;");
 
@@ -639,11 +666,13 @@
   ///@since 2.13
   jni.JObject currentLocation() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_currentLocation, jni.JniCallType.objectType, []).object);
+        reference.pointer,
+        _id_currentLocation,
+        jni.JniCallType.objectType, []).object);
   }
 
   static final _id_currentTokenLocation = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"currentTokenLocation",
       r"()Lcom/fasterxml/jackson/core/JsonLocation;");
 
@@ -664,13 +693,13 @@
   ///@since 2.13 (will eventually replace \#getTokenLocation)
   jni.JObject currentTokenLocation() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_currentTokenLocation,
         jni.JniCallType.objectType, []).object);
   }
 
   static final _id_getCurrentLocation = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"getCurrentLocation",
       r"()Lcom/fasterxml/jackson/core/JsonLocation;");
 
@@ -682,13 +711,13 @@
   ///@return Location of the last processed input unit (byte or character)
   jni.JObject getCurrentLocation() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_getCurrentLocation,
         jni.JniCallType.objectType, []).object);
   }
 
   static final _id_getTokenLocation = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"getTokenLocation",
       r"()Lcom/fasterxml/jackson/core/JsonLocation;");
 
@@ -700,13 +729,13 @@
   ///@return Starting location of the token parser currently points to
   jni.JObject getTokenLocation() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_getTokenLocation,
         jni.JniCallType.objectType, []).object);
   }
 
   static final _id_currentValue = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"currentValue", r"()Ljava/lang/Object;");
+      _class.reference.pointer, r"currentValue", r"()Ljava/lang/Object;");
 
   /// from: public java.lang.Object currentValue()
   /// The returned object must be released after use, by calling the [release] method.
@@ -724,11 +753,15 @@
   ///@since 2.13 (added as replacement for older \#getCurrentValue()
   jni.JObject currentValue() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_currentValue, jni.JniCallType.objectType, []).object);
+        reference.pointer,
+        _id_currentValue,
+        jni.JniCallType.objectType, []).object);
   }
 
   static final _id_assignCurrentValue = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"assignCurrentValue", r"(Ljava/lang/Object;)V");
+      _class.reference.pointer,
+      r"assignCurrentValue",
+      r"(Ljava/lang/Object;)V");
 
   /// from: public void assignCurrentValue(java.lang.Object v)
   ///
@@ -742,14 +775,14 @@
     jni.JObject v,
   ) {
     return jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_assignCurrentValue,
         jni.JniCallType.voidType,
-        [v.reference]).check();
+        [v.reference.pointer]).check();
   }
 
   static final _id_getCurrentValue = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"getCurrentValue", r"()Ljava/lang/Object;");
+      _class.reference.pointer, r"getCurrentValue", r"()Ljava/lang/Object;");
 
   /// from: public java.lang.Object getCurrentValue()
   /// The returned object must be released after use, by calling the [release] method.
@@ -759,11 +792,13 @@
   ///@return Location of the last processed input unit (byte or character)
   jni.JObject getCurrentValue() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getCurrentValue, jni.JniCallType.objectType, []).object);
+        reference.pointer,
+        _id_getCurrentValue,
+        jni.JniCallType.objectType, []).object);
   }
 
   static final _id_setCurrentValue = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"setCurrentValue", r"(Ljava/lang/Object;)V");
+      _class.reference.pointer, r"setCurrentValue", r"(Ljava/lang/Object;)V");
 
   /// from: public void setCurrentValue(java.lang.Object v)
   ///
@@ -773,12 +808,17 @@
   void setCurrentValue(
     jni.JObject v,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_setCurrentValue,
-        jni.JniCallType.voidType, [v.reference]).check();
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_setCurrentValue,
+        jni.JniCallType.voidType,
+        [v.reference.pointer]).check();
   }
 
   static final _id_releaseBuffered = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"releaseBuffered", r"(Ljava/io/OutputStream;)I");
+      _class.reference.pointer,
+      r"releaseBuffered",
+      r"(Ljava/io/OutputStream;)I");
 
   /// from: public int releaseBuffered(java.io.OutputStream out)
   ///
@@ -796,12 +836,15 @@
   int releaseBuffered(
     jni.JObject out,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_releaseBuffered,
-        jni.JniCallType.intType, [out.reference]).integer;
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_releaseBuffered,
+        jni.JniCallType.intType,
+        [out.reference.pointer]).integer;
   }
 
   static final _id_releaseBuffered1 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"releaseBuffered", r"(Ljava/io/Writer;)I");
+      _class.reference.pointer, r"releaseBuffered", r"(Ljava/io/Writer;)I");
 
   /// from: public int releaseBuffered(java.io.Writer w)
   ///
@@ -820,12 +863,15 @@
   int releaseBuffered1(
     jni.JObject w,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_releaseBuffered1,
-        jni.JniCallType.intType, [w.reference]).integer;
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_releaseBuffered1,
+        jni.JniCallType.intType,
+        [w.reference.pointer]).integer;
   }
 
   static final _id_enable = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"enable",
       r"(Lcom/fasterxml/jackson/core/JsonParser$Feature;)Lcom/fasterxml/jackson/core/JsonParser;");
 
@@ -840,14 +886,14 @@
     JsonParser_Feature f,
   ) {
     return const $JsonParserType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_enable,
         jni.JniCallType.objectType,
-        [f.reference]).object);
+        [f.reference.pointer]).object);
   }
 
   static final _id_disable = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"disable",
       r"(Lcom/fasterxml/jackson/core/JsonParser$Feature;)Lcom/fasterxml/jackson/core/JsonParser;");
 
@@ -862,14 +908,14 @@
     JsonParser_Feature f,
   ) {
     return const $JsonParserType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_disable,
         jni.JniCallType.objectType,
-        [f.reference]).object);
+        [f.reference.pointer]).object);
   }
 
   static final _id_configure = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"configure",
       r"(Lcom/fasterxml/jackson/core/JsonParser$Feature;Z)Lcom/fasterxml/jackson/core/JsonParser;");
 
@@ -886,14 +932,16 @@
     bool state,
   ) {
     return const $JsonParserType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_configure,
         jni.JniCallType.objectType,
-        [f.reference, state ? 1 : 0]).object);
+        [f.reference.pointer, state ? 1 : 0]).object);
   }
 
-  static final _id_isEnabled = jni.Jni.accessors.getMethodIDOf(_class.reference,
-      r"isEnabled", r"(Lcom/fasterxml/jackson/core/JsonParser$Feature;)Z");
+  static final _id_isEnabled = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer,
+      r"isEnabled",
+      r"(Lcom/fasterxml/jackson/core/JsonParser$Feature;)Z");
 
   /// from: public boolean isEnabled(com.fasterxml.jackson.core.JsonParser.Feature f)
   ///
@@ -903,12 +951,15 @@
   bool isEnabled(
     JsonParser_Feature f,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_isEnabled,
-        jni.JniCallType.booleanType, [f.reference]).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_isEnabled,
+        jni.JniCallType.booleanType,
+        [f.reference.pointer]).boolean;
   }
 
   static final _id_isEnabled1 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"isEnabled",
       r"(Lcom/fasterxml/jackson/core/StreamReadFeature;)Z");
 
@@ -921,12 +972,15 @@
   bool isEnabled1(
     jni.JObject f,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_isEnabled1,
-        jni.JniCallType.booleanType, [f.reference]).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_isEnabled1,
+        jni.JniCallType.booleanType,
+        [f.reference.pointer]).boolean;
   }
 
   static final _id_getFeatureMask = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getFeatureMask", r"()I");
+      .getMethodIDOf(_class.reference.pointer, r"getFeatureMask", r"()I");
 
   /// from: public int getFeatureMask()
   ///
@@ -934,12 +988,12 @@
   ///@return Bit mask that defines current states of all standard Features.
   ///@since 2.3
   int getFeatureMask() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getFeatureMask, jni.JniCallType.intType, []).integer;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_getFeatureMask, jni.JniCallType.intType, []).integer;
   }
 
   static final _id_setFeatureMask = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"setFeatureMask",
       r"(I)Lcom/fasterxml/jackson/core/JsonParser;");
 
@@ -955,14 +1009,14 @@
     int mask,
   ) {
     return const $JsonParserType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_setFeatureMask,
         jni.JniCallType.objectType,
         [jni.JValueInt(mask)]).object);
   }
 
   static final _id_overrideStdFeatures = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"overrideStdFeatures",
       r"(II)Lcom/fasterxml/jackson/core/JsonParser;");
 
@@ -986,14 +1040,14 @@
     int mask,
   ) {
     return const $JsonParserType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_overrideStdFeatures,
         jni.JniCallType.objectType,
         [jni.JValueInt(values), jni.JValueInt(mask)]).object);
   }
 
   static final _id_getFormatFeatures = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getFormatFeatures", r"()I");
+      .getMethodIDOf(_class.reference.pointer, r"getFormatFeatures", r"()I");
 
   /// from: public int getFormatFeatures()
   ///
@@ -1002,12 +1056,12 @@
   ///@return Bit mask that defines current states of all standard FormatFeatures.
   ///@since 2.6
   int getFormatFeatures() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getFormatFeatures, jni.JniCallType.intType, []).integer;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_getFormatFeatures, jni.JniCallType.intType, []).integer;
   }
 
   static final _id_overrideFormatFeatures = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"overrideFormatFeatures",
       r"(II)Lcom/fasterxml/jackson/core/JsonParser;");
 
@@ -1029,14 +1083,16 @@
     int mask,
   ) {
     return const $JsonParserType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_overrideFormatFeatures,
         jni.JniCallType.objectType,
         [jni.JValueInt(values), jni.JValueInt(mask)]).object);
   }
 
-  static final _id_nextToken = jni.Jni.accessors.getMethodIDOf(_class.reference,
-      r"nextToken", r"()Lcom/fasterxml/jackson/core/JsonToken;");
+  static final _id_nextToken = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer,
+      r"nextToken",
+      r"()Lcom/fasterxml/jackson/core/JsonToken;");
 
   /// from: public abstract com.fasterxml.jackson.core.JsonToken nextToken()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1051,12 +1107,14 @@
   ///   JsonParseException for decoding problems
   jsontoken_.JsonToken nextToken() {
     return const jsontoken_.$JsonTokenType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(
-            reference, _id_nextToken, jni.JniCallType.objectType, []).object);
+        .callMethodWithArgs(reference.pointer, _id_nextToken,
+            jni.JniCallType.objectType, []).object);
   }
 
-  static final _id_nextValue = jni.Jni.accessors.getMethodIDOf(_class.reference,
-      r"nextValue", r"()Lcom/fasterxml/jackson/core/JsonToken;");
+  static final _id_nextValue = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer,
+      r"nextValue",
+      r"()Lcom/fasterxml/jackson/core/JsonToken;");
 
   /// from: public abstract com.fasterxml.jackson.core.JsonToken nextValue()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1079,12 +1137,12 @@
   ///   JsonParseException for decoding problems
   jsontoken_.JsonToken nextValue() {
     return const jsontoken_.$JsonTokenType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(
-            reference, _id_nextValue, jni.JniCallType.objectType, []).object);
+        .callMethodWithArgs(reference.pointer, _id_nextValue,
+            jni.JniCallType.objectType, []).object);
   }
 
   static final _id_nextFieldName = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"nextFieldName",
       r"(Lcom/fasterxml/jackson/core/SerializableString;)Z");
 
@@ -1108,12 +1166,15 @@
   bool nextFieldName(
     jni.JObject str,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_nextFieldName,
-        jni.JniCallType.booleanType, [str.reference]).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_nextFieldName,
+        jni.JniCallType.booleanType,
+        [str.reference.pointer]).boolean;
   }
 
   static final _id_nextFieldName1 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"nextFieldName", r"()Ljava/lang/String;");
+      _class.reference.pointer, r"nextFieldName", r"()Ljava/lang/String;");
 
   /// from: public java.lang.String nextFieldName()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1128,11 +1189,13 @@
   ///@since 2.5
   jni.JString nextFieldName1() {
     return const jni.JStringType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_nextFieldName1, jni.JniCallType.objectType, []).object);
+        reference.pointer,
+        _id_nextFieldName1,
+        jni.JniCallType.objectType, []).object);
   }
 
   static final _id_nextTextValue = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"nextTextValue", r"()Ljava/lang/String;");
+      _class.reference.pointer, r"nextTextValue", r"()Ljava/lang/String;");
 
   /// from: public java.lang.String nextTextValue()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1152,11 +1215,13 @@
   ///   JsonParseException for decoding problems
   jni.JString nextTextValue() {
     return const jni.JStringType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_nextTextValue, jni.JniCallType.objectType, []).object);
+        reference.pointer,
+        _id_nextTextValue,
+        jni.JniCallType.objectType, []).object);
   }
 
   static final _id_nextIntValue = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"nextIntValue", r"(I)I");
+      .getMethodIDOf(_class.reference.pointer, r"nextIntValue", r"(I)I");
 
   /// from: public int nextIntValue(int defaultValue)
   ///
@@ -1180,12 +1245,15 @@
   int nextIntValue(
     int defaultValue,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_nextIntValue,
-        jni.JniCallType.intType, [jni.JValueInt(defaultValue)]).integer;
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_nextIntValue,
+        jni.JniCallType.intType,
+        [jni.JValueInt(defaultValue)]).integer;
   }
 
   static final _id_nextLongValue = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"nextLongValue", r"(J)J");
+      .getMethodIDOf(_class.reference.pointer, r"nextLongValue", r"(J)J");
 
   /// from: public long nextLongValue(long defaultValue)
   ///
@@ -1209,12 +1277,12 @@
   int nextLongValue(
     int defaultValue,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_nextLongValue,
-        jni.JniCallType.longType, [defaultValue]).long;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_nextLongValue, jni.JniCallType.longType, [defaultValue]).long;
   }
 
   static final _id_nextBooleanValue = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"nextBooleanValue", r"()Ljava/lang/Boolean;");
+      _class.reference.pointer, r"nextBooleanValue", r"()Ljava/lang/Boolean;");
 
   /// from: public java.lang.Boolean nextBooleanValue()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1237,12 +1305,12 @@
   ///   JsonParseException for decoding problems
   jni.JBoolean nextBooleanValue() {
     return const jni.JBooleanType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_nextBooleanValue,
+        .callMethodWithArgs(reference.pointer, _id_nextBooleanValue,
             jni.JniCallType.objectType, []).object);
   }
 
   static final _id_skipChildren = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"skipChildren",
       r"()Lcom/fasterxml/jackson/core/JsonParser;");
 
@@ -1266,11 +1334,13 @@
   ///   JsonParseException for decoding problems
   JsonParser skipChildren() {
     return const $JsonParserType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_skipChildren, jni.JniCallType.objectType, []).object);
+        reference.pointer,
+        _id_skipChildren,
+        jni.JniCallType.objectType, []).object);
   }
 
-  static final _id_finishToken =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"finishToken", r"()V");
+  static final _id_finishToken = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"finishToken", r"()V");
 
   /// from: public void finishToken()
   ///
@@ -1288,12 +1358,12 @@
   ///   JsonParseException for decoding problems
   ///@since 2.8
   void finishToken() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_finishToken, jni.JniCallType.voidType, []).check();
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_finishToken, jni.JniCallType.voidType, []).check();
   }
 
   static final _id_currentToken = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"currentToken",
       r"()Lcom/fasterxml/jackson/core/JsonToken;");
 
@@ -1311,12 +1381,12 @@
   ///@since 2.8
   jsontoken_.JsonToken currentToken() {
     return const jsontoken_.$JsonTokenType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_currentToken,
+        .callMethodWithArgs(reference.pointer, _id_currentToken,
             jni.JniCallType.objectType, []).object);
   }
 
   static final _id_currentTokenId = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"currentTokenId", r"()I");
+      .getMethodIDOf(_class.reference.pointer, r"currentTokenId", r"()I");
 
   /// from: public int currentTokenId()
   ///
@@ -1330,12 +1400,12 @@
   ///@since 2.8
   ///@return {@code int} matching one of constants from JsonTokenId.
   int currentTokenId() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_currentTokenId, jni.JniCallType.intType, []).integer;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_currentTokenId, jni.JniCallType.intType, []).integer;
   }
 
   static final _id_getCurrentToken = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"getCurrentToken",
       r"()Lcom/fasterxml/jackson/core/JsonToken;");
 
@@ -1348,12 +1418,12 @@
   ///   if any: null before any tokens have been read, and
   jsontoken_.JsonToken getCurrentToken() {
     return const jsontoken_.$JsonTokenType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_getCurrentToken,
+        .callMethodWithArgs(reference.pointer, _id_getCurrentToken,
             jni.JniCallType.objectType, []).object);
   }
 
   static final _id_getCurrentTokenId = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getCurrentTokenId", r"()I");
+      .getMethodIDOf(_class.reference.pointer, r"getCurrentTokenId", r"()I");
 
   /// from: public abstract int getCurrentTokenId()
   ///
@@ -1361,12 +1431,12 @@
   ///@return {@code int} matching one of constants from JsonTokenId.
   ///@deprecated Since 2.12 use \#currentTokenId instead
   int getCurrentTokenId() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getCurrentTokenId, jni.JniCallType.intType, []).integer;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_getCurrentTokenId, jni.JniCallType.intType, []).integer;
   }
 
   static final _id_hasCurrentToken = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"hasCurrentToken", r"()Z");
+      .getMethodIDOf(_class.reference.pointer, r"hasCurrentToken", r"()Z");
 
   /// from: public abstract boolean hasCurrentToken()
   ///
@@ -1379,12 +1449,12 @@
   ///   and returned null from \#nextToken, or the token
   ///   has been consumed)
   bool hasCurrentToken() {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_hasCurrentToken,
-        jni.JniCallType.booleanType, []).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_hasCurrentToken, jni.JniCallType.booleanType, []).boolean;
   }
 
-  static final _id_hasTokenId =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"hasTokenId", r"(I)Z");
+  static final _id_hasTokenId = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"hasTokenId", r"(I)Z");
 
   /// from: public abstract boolean hasTokenId(int id)
   ///
@@ -1403,12 +1473,17 @@
   bool hasTokenId(
     int id,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_hasTokenId,
-        jni.JniCallType.booleanType, [jni.JValueInt(id)]).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_hasTokenId,
+        jni.JniCallType.booleanType,
+        [jni.JValueInt(id)]).boolean;
   }
 
-  static final _id_hasToken = jni.Jni.accessors.getMethodIDOf(_class.reference,
-      r"hasToken", r"(Lcom/fasterxml/jackson/core/JsonToken;)Z");
+  static final _id_hasToken = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer,
+      r"hasToken",
+      r"(Lcom/fasterxml/jackson/core/JsonToken;)Z");
 
   /// from: public abstract boolean hasToken(com.fasterxml.jackson.core.JsonToken t)
   ///
@@ -1427,12 +1502,12 @@
   bool hasToken(
     jsontoken_.JsonToken t,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_hasToken,
-        jni.JniCallType.booleanType, [t.reference]).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer, _id_hasToken,
+        jni.JniCallType.booleanType, [t.reference.pointer]).boolean;
   }
 
-  static final _id_isExpectedStartArrayToken = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"isExpectedStartArrayToken", r"()Z");
+  static final _id_isExpectedStartArrayToken = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"isExpectedStartArrayToken", r"()Z");
 
   /// from: public boolean isExpectedStartArrayToken()
   ///
@@ -1453,12 +1528,12 @@
   ///   start-array marker (such JsonToken\#START_ARRAY);
   ///   {@code false} if not
   bool isExpectedStartArrayToken() {
-    return jni.Jni.accessors.callMethodWithArgs(reference,
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
         _id_isExpectedStartArrayToken, jni.JniCallType.booleanType, []).boolean;
   }
 
-  static final _id_isExpectedStartObjectToken = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"isExpectedStartObjectToken", r"()Z");
+  static final _id_isExpectedStartObjectToken = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"isExpectedStartObjectToken", r"()Z");
 
   /// from: public boolean isExpectedStartObjectToken()
   ///
@@ -1470,13 +1545,13 @@
   ///@since 2.5
   bool isExpectedStartObjectToken() {
     return jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_isExpectedStartObjectToken,
         jni.JniCallType.booleanType, []).boolean;
   }
 
-  static final _id_isExpectedNumberIntToken = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"isExpectedNumberIntToken", r"()Z");
+  static final _id_isExpectedNumberIntToken = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"isExpectedNumberIntToken", r"()Z");
 
   /// from: public boolean isExpectedNumberIntToken()
   ///
@@ -1490,12 +1565,12 @@
   ///   {@code false} if not
   ///@since 2.12
   bool isExpectedNumberIntToken() {
-    return jni.Jni.accessors.callMethodWithArgs(reference,
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
         _id_isExpectedNumberIntToken, jni.JniCallType.booleanType, []).boolean;
   }
 
-  static final _id_isNaN =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"isNaN", r"()Z");
+  static final _id_isNaN = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"isNaN", r"()Z");
 
   /// from: public boolean isNaN()
   ///
@@ -1513,11 +1588,11 @@
   ///@since 2.9
   bool isNaN() {
     return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_isNaN, jni.JniCallType.booleanType, []).boolean;
+        reference.pointer, _id_isNaN, jni.JniCallType.booleanType, []).boolean;
   }
 
   static final _id_clearCurrentToken = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"clearCurrentToken", r"()V");
+      .getMethodIDOf(_class.reference.pointer, r"clearCurrentToken", r"()V");
 
   /// from: public abstract void clearCurrentToken()
   ///
@@ -1532,12 +1607,12 @@
   /// it has to be able to consume last token used for binding (so that
   /// it will not be used again).
   void clearCurrentToken() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_clearCurrentToken, jni.JniCallType.voidType, []).check();
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_clearCurrentToken, jni.JniCallType.voidType, []).check();
   }
 
   static final _id_getLastClearedToken = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"getLastClearedToken",
       r"()Lcom/fasterxml/jackson/core/JsonToken;");
 
@@ -1552,12 +1627,14 @@
   ///@return Last cleared token, if any; {@code null} otherwise
   jsontoken_.JsonToken getLastClearedToken() {
     return const jsontoken_.$JsonTokenType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_getLastClearedToken,
+        .callMethodWithArgs(reference.pointer, _id_getLastClearedToken,
             jni.JniCallType.objectType, []).object);
   }
 
   static final _id_overrideCurrentName = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"overrideCurrentName", r"(Ljava/lang/String;)V");
+      _class.reference.pointer,
+      r"overrideCurrentName",
+      r"(Ljava/lang/String;)V");
 
   /// from: public abstract void overrideCurrentName(java.lang.String name)
   ///
@@ -1573,14 +1650,14 @@
     jni.JString name,
   ) {
     return jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_overrideCurrentName,
         jni.JniCallType.voidType,
-        [name.reference]).check();
+        [name.reference.pointer]).check();
   }
 
   static final _id_getCurrentName = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"getCurrentName", r"()Ljava/lang/String;");
+      _class.reference.pointer, r"getCurrentName", r"()Ljava/lang/String;");
 
   /// from: public abstract java.lang.String getCurrentName()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1591,11 +1668,13 @@
   ///   JsonParseException for decoding problems
   jni.JString getCurrentName() {
     return const jni.JStringType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getCurrentName, jni.JniCallType.objectType, []).object);
+        reference.pointer,
+        _id_getCurrentName,
+        jni.JniCallType.objectType, []).object);
   }
 
-  static final _id_currentName = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"currentName", r"()Ljava/lang/String;");
+  static final _id_currentName = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"currentName", r"()Ljava/lang/String;");
 
   /// from: public java.lang.String currentName()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1611,11 +1690,13 @@
   ///@since 2.10
   jni.JString currentName() {
     return const jni.JStringType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_currentName, jni.JniCallType.objectType, []).object);
+        reference.pointer,
+        _id_currentName,
+        jni.JniCallType.objectType, []).object);
   }
 
-  static final _id_getText = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getText", r"()Ljava/lang/String;");
+  static final _id_getText = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"getText", r"()Ljava/lang/String;");
 
   /// from: public abstract java.lang.String getText()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1630,11 +1711,11 @@
   ///   JsonParseException for decoding problems
   jni.JString getText() {
     return const jni.JStringType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getText, jni.JniCallType.objectType, []).object);
+        reference.pointer, _id_getText, jni.JniCallType.objectType, []).object);
   }
 
-  static final _id_getText1 = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getText", r"(Ljava/io/Writer;)I");
+  static final _id_getText1 = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"getText", r"(Ljava/io/Writer;)I");
 
   /// from: public int getText(java.io.Writer writer)
   ///
@@ -1656,12 +1737,12 @@
   int getText1(
     jni.JObject writer,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_getText1,
-        jni.JniCallType.intType, [writer.reference]).integer;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer, _id_getText1,
+        jni.JniCallType.intType, [writer.reference.pointer]).integer;
   }
 
   static final _id_getTextCharacters = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getTextCharacters", r"()[C");
+      .getMethodIDOf(_class.reference.pointer, r"getTextCharacters", r"()[C");
 
   /// from: public abstract char[] getTextCharacters()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1695,12 +1776,12 @@
   ///   JsonParseException for decoding problems
   jni.JArray<jni.jchar> getTextCharacters() {
     return const jni.JArrayType(jni.jcharType()).fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_getTextCharacters,
+        .callMethodWithArgs(reference.pointer, _id_getTextCharacters,
             jni.JniCallType.objectType, []).object);
   }
 
   static final _id_getTextLength = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getTextLength", r"()I");
+      .getMethodIDOf(_class.reference.pointer, r"getTextLength", r"()I");
 
   /// from: public abstract int getTextLength()
   ///
@@ -1712,12 +1793,12 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   int getTextLength() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getTextLength, jni.JniCallType.intType, []).integer;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_getTextLength, jni.JniCallType.intType, []).integer;
   }
 
   static final _id_getTextOffset = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getTextOffset", r"()I");
+      .getMethodIDOf(_class.reference.pointer, r"getTextOffset", r"()I");
 
   /// from: public abstract int getTextOffset()
   ///
@@ -1729,12 +1810,12 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   int getTextOffset() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getTextOffset, jni.JniCallType.intType, []).integer;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_getTextOffset, jni.JniCallType.intType, []).integer;
   }
 
   static final _id_hasTextCharacters = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"hasTextCharacters", r"()Z");
+      .getMethodIDOf(_class.reference.pointer, r"hasTextCharacters", r"()Z");
 
   /// from: public abstract boolean hasTextCharacters()
   ///
@@ -1753,12 +1834,12 @@
   ///   be efficiently returned via \#getTextCharacters; false
   ///   means that it may or may not exist
   bool hasTextCharacters() {
-    return jni.Jni.accessors.callMethodWithArgs(reference,
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
         _id_hasTextCharacters, jni.JniCallType.booleanType, []).boolean;
   }
 
   static final _id_getNumberValue = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"getNumberValue", r"()Ljava/lang/Number;");
+      _class.reference.pointer, r"getNumberValue", r"()Ljava/lang/Number;");
 
   /// from: public abstract java.lang.Number getNumberValue()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1775,11 +1856,15 @@
   ///    content read fails (possible if values are extracted lazily)
   jni.JNumber getNumberValue() {
     return const jni.JNumberType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getNumberValue, jni.JniCallType.objectType, []).object);
+        reference.pointer,
+        _id_getNumberValue,
+        jni.JniCallType.objectType, []).object);
   }
 
   static final _id_getNumberValueExact = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"getNumberValueExact", r"()Ljava/lang/Number;");
+      _class.reference.pointer,
+      r"getNumberValueExact",
+      r"()Ljava/lang/Number;");
 
   /// from: public java.lang.Number getNumberValueExact()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1800,13 +1885,13 @@
   ///@since 2.12
   jni.JNumber getNumberValueExact() {
     return const jni.JNumberType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_getNumberValueExact,
         jni.JniCallType.objectType, []).object);
   }
 
   static final _id_getNumberType = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"getNumberType",
       r"()Lcom/fasterxml/jackson/core/JsonParser$NumberType;");
 
@@ -1822,12 +1907,12 @@
   ///   JsonParseException for decoding problems
   JsonParser_NumberType getNumberType() {
     return const $JsonParser_NumberTypeType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_getNumberType,
+        .callMethodWithArgs(reference.pointer, _id_getNumberType,
             jni.JniCallType.objectType, []).object);
   }
 
   static final _id_getByteValue = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getByteValue", r"()B");
+      .getMethodIDOf(_class.reference.pointer, r"getByteValue", r"()B");
 
   /// from: public byte getByteValue()
   ///
@@ -1854,11 +1939,11 @@
   ///   JsonParseException for decoding problems
   int getByteValue() {
     return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getByteValue, jni.JniCallType.byteType, []).byte;
+        reference.pointer, _id_getByteValue, jni.JniCallType.byteType, []).byte;
   }
 
   static final _id_getShortValue = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getShortValue", r"()S");
+      .getMethodIDOf(_class.reference.pointer, r"getShortValue", r"()S");
 
   /// from: public short getShortValue()
   ///
@@ -1878,12 +1963,12 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   int getShortValue() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getShortValue, jni.JniCallType.shortType, []).short;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_getShortValue, jni.JniCallType.shortType, []).short;
   }
 
-  static final _id_getIntValue =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"getIntValue", r"()I");
+  static final _id_getIntValue = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"getIntValue", r"()I");
 
   /// from: public abstract int getIntValue()
   ///
@@ -1903,12 +1988,12 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   int getIntValue() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getIntValue, jni.JniCallType.intType, []).integer;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_getIntValue, jni.JniCallType.intType, []).integer;
   }
 
   static final _id_getLongValue = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getLongValue", r"()J");
+      .getMethodIDOf(_class.reference.pointer, r"getLongValue", r"()J");
 
   /// from: public abstract long getLongValue()
   ///
@@ -1929,11 +2014,13 @@
   ///   JsonParseException for decoding problems
   int getLongValue() {
     return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getLongValue, jni.JniCallType.longType, []).long;
+        reference.pointer, _id_getLongValue, jni.JniCallType.longType, []).long;
   }
 
   static final _id_getBigIntegerValue = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"getBigIntegerValue", r"()Ljava/math/BigInteger;");
+      _class.reference.pointer,
+      r"getBigIntegerValue",
+      r"()Ljava/math/BigInteger;");
 
   /// from: public abstract java.math.BigInteger getBigIntegerValue()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1951,13 +2038,13 @@
   ///   JsonParseException for decoding problems
   jni.JObject getBigIntegerValue() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_getBigIntegerValue,
         jni.JniCallType.objectType, []).object);
   }
 
   static final _id_getFloatValue = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getFloatValue", r"()F");
+      .getMethodIDOf(_class.reference.pointer, r"getFloatValue", r"()F");
 
   /// from: public abstract float getFloatValue()
   ///
@@ -1977,12 +2064,12 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   double getFloatValue() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getFloatValue, jni.JniCallType.floatType, []).float;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_getFloatValue, jni.JniCallType.floatType, []).float;
   }
 
   static final _id_getDoubleValue = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getDoubleValue", r"()D");
+      .getMethodIDOf(_class.reference.pointer, r"getDoubleValue", r"()D");
 
   /// from: public abstract double getDoubleValue()
   ///
@@ -2002,12 +2089,14 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   double getDoubleValue() {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_getDoubleValue,
-        jni.JniCallType.doubleType, []).doubleFloat;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_getDoubleValue, jni.JniCallType.doubleType, []).doubleFloat;
   }
 
   static final _id_getDecimalValue = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"getDecimalValue", r"()Ljava/math/BigDecimal;");
+      _class.reference.pointer,
+      r"getDecimalValue",
+      r"()Ljava/math/BigDecimal;");
 
   /// from: public abstract java.math.BigDecimal getDecimalValue()
   /// The returned object must be released after use, by calling the [release] method.
@@ -2022,11 +2111,13 @@
   ///   JsonParseException for decoding problems
   jni.JObject getDecimalValue() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getDecimalValue, jni.JniCallType.objectType, []).object);
+        reference.pointer,
+        _id_getDecimalValue,
+        jni.JniCallType.objectType, []).object);
   }
 
   static final _id_getBooleanValue = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getBooleanValue", r"()Z");
+      .getMethodIDOf(_class.reference.pointer, r"getBooleanValue", r"()Z");
 
   /// from: public boolean getBooleanValue()
   ///
@@ -2042,12 +2133,12 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   bool getBooleanValue() {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_getBooleanValue,
-        jni.JniCallType.booleanType, []).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_getBooleanValue, jni.JniCallType.booleanType, []).boolean;
   }
 
   static final _id_getEmbeddedObject = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"getEmbeddedObject", r"()Ljava/lang/Object;");
+      _class.reference.pointer, r"getEmbeddedObject", r"()Ljava/lang/Object;");
 
   /// from: public java.lang.Object getEmbeddedObject()
   /// The returned object must be released after use, by calling the [release] method.
@@ -2068,13 +2159,13 @@
   ///   JsonParseException for decoding problems
   jni.JObject getEmbeddedObject() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_getEmbeddedObject,
         jni.JniCallType.objectType, []).object);
   }
 
   static final _id_getBinaryValue = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"getBinaryValue",
       r"(Lcom/fasterxml/jackson/core/Base64Variant;)[B");
 
@@ -2105,12 +2196,12 @@
     jni.JObject bv,
   ) {
     return const jni.JArrayType(jni.jbyteType()).fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_getBinaryValue,
-            jni.JniCallType.objectType, [bv.reference]).object);
+        .callMethodWithArgs(reference.pointer, _id_getBinaryValue,
+            jni.JniCallType.objectType, [bv.reference.pointer]).object);
   }
 
   static final _id_getBinaryValue1 = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getBinaryValue", r"()[B");
+      .getMethodIDOf(_class.reference.pointer, r"getBinaryValue", r"()[B");
 
   /// from: public byte[] getBinaryValue()
   /// The returned object must be released after use, by calling the [release] method.
@@ -2123,12 +2214,14 @@
   ///   JsonParseException for decoding problems
   jni.JArray<jni.jbyte> getBinaryValue1() {
     return const jni.JArrayType(jni.jbyteType()).fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_getBinaryValue1,
+        .callMethodWithArgs(reference.pointer, _id_getBinaryValue1,
             jni.JniCallType.objectType, []).object);
   }
 
   static final _id_readBinaryValue = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"readBinaryValue", r"(Ljava/io/OutputStream;)I");
+      _class.reference.pointer,
+      r"readBinaryValue",
+      r"(Ljava/io/OutputStream;)I");
 
   /// from: public int readBinaryValue(java.io.OutputStream out)
   ///
@@ -2146,12 +2239,15 @@
   int readBinaryValue(
     jni.JObject out,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_readBinaryValue,
-        jni.JniCallType.intType, [out.reference]).integer;
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_readBinaryValue,
+        jni.JniCallType.intType,
+        [out.reference.pointer]).integer;
   }
 
   static final _id_readBinaryValue1 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"readBinaryValue",
       r"(Lcom/fasterxml/jackson/core/Base64Variant;Ljava/io/OutputStream;)I");
 
@@ -2169,12 +2265,15 @@
     jni.JObject bv,
     jni.JObject out,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_readBinaryValue1,
-        jni.JniCallType.intType, [bv.reference, out.reference]).integer;
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_readBinaryValue1,
+        jni.JniCallType.intType,
+        [bv.reference.pointer, out.reference.pointer]).integer;
   }
 
   static final _id_getValueAsInt = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getValueAsInt", r"()I");
+      .getMethodIDOf(_class.reference.pointer, r"getValueAsInt", r"()I");
 
   /// from: public int getValueAsInt()
   ///
@@ -2192,12 +2291,12 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   int getValueAsInt() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getValueAsInt, jni.JniCallType.intType, []).integer;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_getValueAsInt, jni.JniCallType.intType, []).integer;
   }
 
   static final _id_getValueAsInt1 = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getValueAsInt", r"(I)I");
+      .getMethodIDOf(_class.reference.pointer, r"getValueAsInt", r"(I)I");
 
   /// from: public int getValueAsInt(int def)
   ///
@@ -2217,12 +2316,15 @@
   int getValueAsInt1(
     int def,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_getValueAsInt1,
-        jni.JniCallType.intType, [jni.JValueInt(def)]).integer;
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_getValueAsInt1,
+        jni.JniCallType.intType,
+        [jni.JValueInt(def)]).integer;
   }
 
   static final _id_getValueAsLong = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getValueAsLong", r"()J");
+      .getMethodIDOf(_class.reference.pointer, r"getValueAsLong", r"()J");
 
   /// from: public long getValueAsLong()
   ///
@@ -2240,12 +2342,12 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   int getValueAsLong() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getValueAsLong, jni.JniCallType.longType, []).long;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_getValueAsLong, jni.JniCallType.longType, []).long;
   }
 
   static final _id_getValueAsLong1 = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getValueAsLong", r"(J)J");
+      .getMethodIDOf(_class.reference.pointer, r"getValueAsLong", r"(J)J");
 
   /// from: public long getValueAsLong(long def)
   ///
@@ -2265,12 +2367,12 @@
   int getValueAsLong1(
     int def,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getValueAsLong1, jni.JniCallType.longType, [def]).long;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_getValueAsLong1, jni.JniCallType.longType, [def]).long;
   }
 
   static final _id_getValueAsDouble = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getValueAsDouble", r"()D");
+      .getMethodIDOf(_class.reference.pointer, r"getValueAsDouble", r"()D");
 
   /// from: public double getValueAsDouble()
   ///
@@ -2288,12 +2390,12 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   double getValueAsDouble() {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_getValueAsDouble,
-        jni.JniCallType.doubleType, []).doubleFloat;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_getValueAsDouble, jni.JniCallType.doubleType, []).doubleFloat;
   }
 
   static final _id_getValueAsDouble1 = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getValueAsDouble", r"(D)D");
+      .getMethodIDOf(_class.reference.pointer, r"getValueAsDouble", r"(D)D");
 
   /// from: public double getValueAsDouble(double def)
   ///
@@ -2313,12 +2415,12 @@
   double getValueAsDouble1(
     double def,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference,
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
         _id_getValueAsDouble1, jni.JniCallType.doubleType, [def]).doubleFloat;
   }
 
   static final _id_getValueAsBoolean = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getValueAsBoolean", r"()Z");
+      .getMethodIDOf(_class.reference.pointer, r"getValueAsBoolean", r"()Z");
 
   /// from: public boolean getValueAsBoolean()
   ///
@@ -2336,12 +2438,12 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   bool getValueAsBoolean() {
-    return jni.Jni.accessors.callMethodWithArgs(reference,
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
         _id_getValueAsBoolean, jni.JniCallType.booleanType, []).boolean;
   }
 
   static final _id_getValueAsBoolean1 = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getValueAsBoolean", r"(Z)Z");
+      .getMethodIDOf(_class.reference.pointer, r"getValueAsBoolean", r"(Z)Z");
 
   /// from: public boolean getValueAsBoolean(boolean def)
   ///
@@ -2362,14 +2464,14 @@
     bool def,
   ) {
     return jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_getValueAsBoolean1,
         jni.JniCallType.booleanType,
         [def ? 1 : 0]).boolean;
   }
 
   static final _id_getValueAsString = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"getValueAsString", r"()Ljava/lang/String;");
+      _class.reference.pointer, r"getValueAsString", r"()Ljava/lang/String;");
 
   /// from: public java.lang.String getValueAsString()
   /// The returned object must be released after use, by calling the [release] method.
@@ -2387,13 +2489,13 @@
   ///@since 2.1
   jni.JString getValueAsString() {
     return const jni.JStringType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_getValueAsString,
         jni.JniCallType.objectType, []).object);
   }
 
   static final _id_getValueAsString1 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"getValueAsString",
       r"(Ljava/lang/String;)Ljava/lang/String;");
 
@@ -2416,14 +2518,14 @@
     jni.JString def,
   ) {
     return const jni.JStringType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_getValueAsString1,
         jni.JniCallType.objectType,
-        [def.reference]).object);
+        [def.reference.pointer]).object);
   }
 
   static final _id_canReadObjectId = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"canReadObjectId", r"()Z");
+      .getMethodIDOf(_class.reference.pointer, r"canReadObjectId", r"()Z");
 
   /// from: public boolean canReadObjectId()
   ///
@@ -2439,12 +2541,12 @@
   ///    {@code false} if not
   ///@since 2.3
   bool canReadObjectId() {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_canReadObjectId,
-        jni.JniCallType.booleanType, []).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_canReadObjectId, jni.JniCallType.booleanType, []).boolean;
   }
 
   static final _id_canReadTypeId = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"canReadTypeId", r"()Z");
+      .getMethodIDOf(_class.reference.pointer, r"canReadTypeId", r"()Z");
 
   /// from: public boolean canReadTypeId()
   ///
@@ -2460,12 +2562,12 @@
   ///    {@code false} if not
   ///@since 2.3
   bool canReadTypeId() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_canReadTypeId, jni.JniCallType.booleanType, []).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_canReadTypeId, jni.JniCallType.booleanType, []).boolean;
   }
 
-  static final _id_getObjectId = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getObjectId", r"()Ljava/lang/Object;");
+  static final _id_getObjectId = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"getObjectId", r"()Ljava/lang/Object;");
 
   /// from: public java.lang.Object getObjectId()
   /// The returned object must be released after use, by calling the [release] method.
@@ -2485,11 +2587,13 @@
   ///@since 2.3
   jni.JObject getObjectId() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getObjectId, jni.JniCallType.objectType, []).object);
+        reference.pointer,
+        _id_getObjectId,
+        jni.JniCallType.objectType, []).object);
   }
 
-  static final _id_getTypeId = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getTypeId", r"()Ljava/lang/Object;");
+  static final _id_getTypeId = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"getTypeId", r"()Ljava/lang/Object;");
 
   /// from: public java.lang.Object getTypeId()
   /// The returned object must be released after use, by calling the [release] method.
@@ -2509,11 +2613,13 @@
   ///@since 2.3
   jni.JObject getTypeId() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getTypeId, jni.JniCallType.objectType, []).object);
+        reference.pointer,
+        _id_getTypeId,
+        jni.JniCallType.objectType, []).object);
   }
 
   static final _id_readValueAs = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"readValueAs",
       r"(Ljava/lang/Class;)Ljava/lang/Object;");
 
@@ -2550,14 +2656,14 @@
     required jni.JObjType<$T> T,
   }) {
     return T.fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_readValueAs,
         jni.JniCallType.objectType,
-        [valueType.reference]).object);
+        [valueType.reference.pointer]).object);
   }
 
   static final _id_readValueAs1 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"readValueAs",
       r"(Lcom/fasterxml/jackson/core/type/TypeReference;)Ljava/lang/Object;");
 
@@ -2591,14 +2697,14 @@
     required jni.JObjType<$T> T,
   }) {
     return T.fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_readValueAs1,
         jni.JniCallType.objectType,
-        [valueTypeRef.reference]).object);
+        [valueTypeRef.reference.pointer]).object);
   }
 
   static final _id_readValuesAs = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"readValuesAs",
       r"(Ljava/lang/Class;)Ljava/util/Iterator;");
 
@@ -2618,14 +2724,14 @@
     required jni.JObjType<$T> T,
   }) {
     return jni.JIteratorType(T).fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_readValuesAs,
         jni.JniCallType.objectType,
-        [valueType.reference]).object);
+        [valueType.reference.pointer]).object);
   }
 
   static final _id_readValuesAs1 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"readValuesAs",
       r"(Lcom/fasterxml/jackson/core/type/TypeReference;)Ljava/util/Iterator;");
 
@@ -2645,14 +2751,14 @@
     required jni.JObjType<$T> T,
   }) {
     return jni.JIteratorType(T).fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_readValuesAs1,
         jni.JniCallType.objectType,
-        [valueTypeRef.reference]).object);
+        [valueTypeRef.reference.pointer]).object);
   }
 
   static final _id_readValueAsTree = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"readValueAsTree",
       r"()Lcom/fasterxml/jackson/core/TreeNode;");
 
@@ -2671,8 +2777,8 @@
   $T readValueAsTree<$T extends jni.JObject>({
     required jni.JObjType<$T> T,
   }) {
-    return T.fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_readValueAsTree, jni.JniCallType.objectType, []).object);
+    return T.fromRef(jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_readValueAsTree, jni.JniCallType.objectType, []).object);
   }
 }
 
diff --git a/pkgs/jnigen/test/jackson_core_test/third_party/dart_only/dart_bindings/com/fasterxml/jackson/core/JsonToken.dart b/pkgs/jnigen/test/jackson_core_test/third_party/dart_only/dart_bindings/com/fasterxml/jackson/core/JsonToken.dart
index 4e67a2d..565278c 100644
--- a/pkgs/jnigen/test/jackson_core_test/third_party/dart_only/dart_bindings/com/fasterxml/jackson/core/JsonToken.dart
+++ b/pkgs/jnigen/test/jackson_core_test/third_party/dart_only/dart_bindings/com/fasterxml/jackson/core/JsonToken.dart
@@ -57,7 +57,7 @@
   /// The type which includes information such as the signature of this class.
   static const type = $JsonTokenType();
   static final _id_values = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"values",
       r"()[Lcom/fasterxml/jackson/core/JsonToken;");
 
@@ -65,12 +65,12 @@
   /// The returned object must be released after use, by calling the [release] method.
   static jni.JArray<JsonToken> values() {
     return const jni.JArrayType($JsonTokenType()).fromRef(jni.Jni.accessors
-        .callStaticMethodWithArgs(_class.reference, _id_values,
+        .callStaticMethodWithArgs(_class.reference.pointer, _id_values,
             jni.JniCallType.objectType, []).object);
   }
 
   static final _id_valueOf = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"valueOf",
       r"(Ljava/lang/String;)Lcom/fasterxml/jackson/core/JsonToken;");
 
@@ -80,65 +80,67 @@
     jni.JString name,
   ) {
     return const $JsonTokenType().fromRef(jni.Jni.accessors
-        .callStaticMethodWithArgs(_class.reference, _id_valueOf,
-            jni.JniCallType.objectType, [name.reference]).object);
+        .callStaticMethodWithArgs(_class.reference.pointer, _id_valueOf,
+            jni.JniCallType.objectType, [name.reference.pointer]).object);
   }
 
   static final _id_id =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"id", r"()I");
+      jni.Jni.accessors.getMethodIDOf(_class.reference.pointer, r"id", r"()I");
 
   /// from: public final int id()
   int id() {
     return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_id, jni.JniCallType.intType, []).integer;
+        reference.pointer, _id_id, jni.JniCallType.intType, []).integer;
   }
 
-  static final _id_asString = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"asString", r"()Ljava/lang/String;");
+  static final _id_asString = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"asString", r"()Ljava/lang/String;");
 
   /// from: public final java.lang.String asString()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JString asString() {
     return const jni.JStringType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_asString, jni.JniCallType.objectType, []).object);
+        reference.pointer,
+        _id_asString,
+        jni.JniCallType.objectType, []).object);
   }
 
   static final _id_asCharArray = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"asCharArray", r"()[C");
+      .getMethodIDOf(_class.reference.pointer, r"asCharArray", r"()[C");
 
   /// from: public final char[] asCharArray()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JArray<jni.jchar> asCharArray() {
     return const jni.JArrayType(jni.jcharType()).fromRef(jni.Jni.accessors
-        .callMethodWithArgs(
-            reference, _id_asCharArray, jni.JniCallType.objectType, []).object);
+        .callMethodWithArgs(reference.pointer, _id_asCharArray,
+            jni.JniCallType.objectType, []).object);
   }
 
   static final _id_asByteArray = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"asByteArray", r"()[B");
+      .getMethodIDOf(_class.reference.pointer, r"asByteArray", r"()[B");
 
   /// from: public final byte[] asByteArray()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JArray<jni.jbyte> asByteArray() {
     return const jni.JArrayType(jni.jbyteType()).fromRef(jni.Jni.accessors
-        .callMethodWithArgs(
-            reference, _id_asByteArray, jni.JniCallType.objectType, []).object);
+        .callMethodWithArgs(reference.pointer, _id_asByteArray,
+            jni.JniCallType.objectType, []).object);
   }
 
-  static final _id_isNumeric =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"isNumeric", r"()Z");
+  static final _id_isNumeric = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"isNumeric", r"()Z");
 
   /// from: public final boolean isNumeric()
   ///
   /// @return {@code True} if this token is {@code VALUE_NUMBER_INT} or {@code VALUE_NUMBER_FLOAT},
   ///   {@code false} otherwise
   bool isNumeric() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_isNumeric, jni.JniCallType.booleanType, []).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_isNumeric, jni.JniCallType.booleanType, []).boolean;
   }
 
   static final _id_isStructStart = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"isStructStart", r"()Z");
+      .getMethodIDOf(_class.reference.pointer, r"isStructStart", r"()Z");
 
   /// from: public final boolean isStructStart()
   ///
@@ -150,12 +152,12 @@
   ///   {@code false} otherwise
   ///@since 2.3
   bool isStructStart() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_isStructStart, jni.JniCallType.booleanType, []).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_isStructStart, jni.JniCallType.booleanType, []).boolean;
   }
 
-  static final _id_isStructEnd =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"isStructEnd", r"()Z");
+  static final _id_isStructEnd = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"isStructEnd", r"()Z");
 
   /// from: public final boolean isStructEnd()
   ///
@@ -167,12 +169,12 @@
   ///   {@code false} otherwise
   ///@since 2.3
   bool isStructEnd() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_isStructEnd, jni.JniCallType.booleanType, []).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_isStructEnd, jni.JniCallType.booleanType, []).boolean;
   }
 
   static final _id_isScalarValue = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"isScalarValue", r"()Z");
+      .getMethodIDOf(_class.reference.pointer, r"isScalarValue", r"()Z");
 
   /// from: public final boolean isScalarValue()
   ///
@@ -183,20 +185,20 @@
   ///@return {@code True} if this token is a scalar value token (one of
   ///   {@code VALUE_xxx} tokens), {@code false} otherwise
   bool isScalarValue() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_isScalarValue, jni.JniCallType.booleanType, []).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_isScalarValue, jni.JniCallType.booleanType, []).boolean;
   }
 
-  static final _id_isBoolean =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"isBoolean", r"()Z");
+  static final _id_isBoolean = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"isBoolean", r"()Z");
 
   /// from: public final boolean isBoolean()
   ///
   /// @return {@code True} if this token is {@code VALUE_TRUE} or {@code VALUE_FALSE},
   ///   {@code false} otherwise
   bool isBoolean() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_isBoolean, jni.JniCallType.booleanType, []).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_isBoolean, jni.JniCallType.booleanType, []).boolean;
   }
 }
 
diff --git a/pkgs/jnigen/test/kotlin_test/c_based/dart_bindings/kotlin.dart b/pkgs/jnigen/test/kotlin_test/c_based/dart_bindings/kotlin.dart
index e96d08c..68af05b 100644
--- a/pkgs/jnigen/test/kotlin_test/c_based/dart_bindings/kotlin.dart
+++ b/pkgs/jnigen/test/kotlin_test/c_based/dart_bindings/kotlin.dart
@@ -66,9 +66,9 @@
     final $p = ReceivePort();
     final $c =
         jni.JObject.fromRef(ProtectedJniExtensions.newPortContinuation($p));
-    _sayHello(reference, $c.reference).object;
+    _sayHello(reference.pointer, $c.reference.pointer).object;
     final $o = jni.JObjectPtr.fromAddress(await $p.first);
-    final $k = const jni.JStringType().getClass().reference;
+    final $k = const jni.JStringType().getClass().reference.pointer;
     if (!jni.Jni.env.IsInstanceOf($o, $k)) {
       throw "Failed";
     }
@@ -93,9 +93,11 @@
     final $p = ReceivePort();
     final $c =
         jni.JObject.fromRef(ProtectedJniExtensions.newPortContinuation($p));
-    _sayHello1(reference, string.reference, $c.reference).object;
+    _sayHello1(
+            reference.pointer, string.reference.pointer, $c.reference.pointer)
+        .object;
     final $o = jni.JObjectPtr.fromAddress(await $p.first);
-    final $k = const jni.JStringType().getClass().reference;
+    final $k = const jni.JStringType().getClass().reference.pointer;
     if (!jni.Jni.env.IsInstanceOf($o, $k)) {
       throw "Failed";
     }
diff --git a/pkgs/jnigen/test/kotlin_test/dart_only/dart_bindings/kotlin.dart b/pkgs/jnigen/test/kotlin_test/dart_only/dart_bindings/kotlin.dart
index b3a1985..b6c85ae 100644
--- a/pkgs/jnigen/test/kotlin_test/dart_only/dart_bindings/kotlin.dart
+++ b/pkgs/jnigen/test/kotlin_test/dart_only/dart_bindings/kotlin.dart
@@ -40,18 +40,20 @@
 
   /// The type which includes information such as the signature of this class.
   static const type = $SuspendFunType();
-  static final _id_new0 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"()V");
+  static final _id_new0 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"()V");
 
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory SuspendFun() {
     return SuspendFun.fromRef(jni.Jni.accessors
-        .newObjectWithArgs(_class.reference, _id_new0, []).object);
+        .newObjectWithArgs(_class.reference.pointer, _id_new0, []).object);
   }
 
-  static final _id_sayHello = jni.Jni.accessors.getMethodIDOf(_class.reference,
-      r"sayHello", r"(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;");
+  static final _id_sayHello = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer,
+      r"sayHello",
+      r"(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;");
 
   /// from: public final java.lang.Object sayHello(kotlin.coroutines.Continuation continuation)
   /// The returned object must be released after use, by calling the [release] method.
@@ -59,10 +61,10 @@
     final $p = ReceivePort();
     final $c =
         jni.JObject.fromRef(ProtectedJniExtensions.newPortContinuation($p));
-    jni.Jni.accessors.callMethodWithArgs(reference, _id_sayHello,
-        jni.JniCallType.objectType, [$c.reference]).object;
+    jni.Jni.accessors.callMethodWithArgs(reference.pointer, _id_sayHello,
+        jni.JniCallType.objectType, [$c.reference.pointer]).object;
     final $o = jni.JObjectPtr.fromAddress(await $p.first);
-    final $k = const jni.JStringType().getClass().reference;
+    final $k = const jni.JStringType().getClass().reference.pointer;
     if (!jni.Jni.env.IsInstanceOf($o, $k)) {
       throw "Failed";
     }
@@ -70,7 +72,7 @@
   }
 
   static final _id_sayHello1 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"sayHello",
       r"(Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;");
 
@@ -82,10 +84,13 @@
     final $p = ReceivePort();
     final $c =
         jni.JObject.fromRef(ProtectedJniExtensions.newPortContinuation($p));
-    jni.Jni.accessors.callMethodWithArgs(reference, _id_sayHello1,
-        jni.JniCallType.objectType, [string.reference, $c.reference]).object;
+    jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_sayHello1,
+        jni.JniCallType.objectType,
+        [string.reference.pointer, $c.reference.pointer]).object;
     final $o = jni.JObjectPtr.fromAddress(await $p.first);
-    final $k = const jni.JStringType().getClass().reference;
+    final $k = const jni.JStringType().getClass().reference.pointer;
     if (!jni.Jni.env.IsInstanceOf($o, $k)) {
       throw "Failed";
     }
diff --git a/pkgs/jnigen/test/simple_package_test/c_based/dart_bindings/simple_package.dart b/pkgs/jnigen/test/simple_package_test/c_based/dart_bindings/simple_package.dart
index bf4ecbf..e7f7b9c 100644
--- a/pkgs/jnigen/test/simple_package_test/c_based/dart_bindings/simple_package.dart
+++ b/pkgs/jnigen/test/simple_package_test/c_based/dart_bindings/simple_package.dart
@@ -129,7 +129,7 @@
 
   /// from: public void usesAnonymousInnerClass()
   void usesAnonymousInnerClass() {
-    return _usesAnonymousInnerClass(reference).check();
+    return _usesAnonymousInnerClass(reference.pointer).check();
   }
 
   static final _getValue = jniLookup<
@@ -140,7 +140,7 @@
 
   /// from: public boolean getValue()
   bool getValue() {
-    return _getValue(reference).boolean;
+    return _getValue(reference.pointer).boolean;
   }
 
   static final _setValue = jniLookup<
@@ -153,7 +153,7 @@
   void setValue(
     bool value,
   ) {
-    return _setValue(reference, value ? 1 : 0).check();
+    return _setValue(reference.pointer, value ? 1 : 0).check();
   }
 }
 
@@ -211,10 +211,10 @@
       .asFunction<jni.JniResult Function(jni.JObjectPtr, int)>();
 
   /// from: public boolean ok
-  bool get ok => _get_ok(reference).boolean;
+  bool get ok => _get_ok(reference.pointer).boolean;
 
   /// from: public boolean ok
-  set ok(bool value) => _set_ok(reference, value ? 1 : 0).check();
+  set ok(bool value) => _set_ok(reference.pointer, value ? 1 : 0).check();
 
   static final _new0 = jniLookup<
               ffi
@@ -227,7 +227,8 @@
   factory Example_NonStaticNested(
     Example $parent,
   ) {
-    return Example_NonStaticNested.fromRef(_new0($parent.reference).object);
+    return Example_NonStaticNested.fromRef(
+        _new0($parent.reference.pointer).object);
   }
 }
 
@@ -321,13 +322,13 @@
 
   /// from: protected java.util.Random protectedField
   /// The returned object must be released after use, by calling the [release] method.
-  jni.JObject get protectedField =>
-      const jni.JObjectType().fromRef(_get_protectedField(reference).object);
+  jni.JObject get protectedField => const jni.JObjectType()
+      .fromRef(_get_protectedField(reference.pointer).object);
 
   /// from: protected java.util.Random protectedField
   /// The returned object must be released after use, by calling the [release] method.
   set protectedField(jni.JObject value) =>
-      _set_protectedField(reference, value.reference).check();
+      _set_protectedField(reference.pointer, value.reference.pointer).check();
 
   static final _getAmount =
       jniLookup<ffi.NativeFunction<jni.JniResult Function()>>(
@@ -402,7 +403,7 @@
   static void setName(
     jni.JString newName,
   ) {
-    return _setName(newName.reference).check();
+    return _setName(newName.reference.pointer).check();
   }
 
   static final _setNestedInstance = jniLookup<
@@ -415,7 +416,7 @@
   static void setNestedInstance(
     Example_Nested newNested,
   ) {
-    return _setNestedInstance(newNested.reference).check();
+    return _setNestedInstance(newNested.reference.pointer).check();
   }
 
   static final _max4 = jniLookup<
@@ -463,7 +464,7 @@
 
   /// from: public int getNumber()
   int getNumber() {
-    return _getNumber(reference).integer;
+    return _getNumber(reference.pointer).integer;
   }
 
   static final _setNumber = jniLookup<
@@ -476,7 +477,7 @@
   void setNumber(
     int number,
   ) {
-    return _setNumber(reference, number).check();
+    return _setNumber(reference.pointer, number).check();
   }
 
   static final _getIsUp = jniLookup<
@@ -487,7 +488,7 @@
 
   /// from: public boolean getIsUp()
   bool getIsUp() {
-    return _getIsUp(reference).boolean;
+    return _getIsUp(reference.pointer).boolean;
   }
 
   static final _setUp = jniLookup<
@@ -500,7 +501,7 @@
   void setUp(
     bool isUp,
   ) {
-    return _setUp(reference, isUp ? 1 : 0).check();
+    return _setUp(reference.pointer, isUp ? 1 : 0).check();
   }
 
   static final _getCodename = jniLookup<
@@ -512,7 +513,8 @@
   /// from: public java.lang.String getCodename()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JString getCodename() {
-    return const jni.JStringType().fromRef(_getCodename(reference).object);
+    return const jni.JStringType()
+        .fromRef(_getCodename(reference.pointer).object);
   }
 
   static final _setCodename = jniLookup<
@@ -527,7 +529,7 @@
   void setCodename(
     jni.JString codename,
   ) {
-    return _setCodename(reference, codename.reference).check();
+    return _setCodename(reference.pointer, codename.reference.pointer).check();
   }
 
   static final _getRandom = jniLookup<
@@ -539,7 +541,8 @@
   /// from: public java.util.Random getRandom()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject getRandom() {
-    return const jni.JObjectType().fromRef(_getRandom(reference).object);
+    return const jni.JObjectType()
+        .fromRef(_getRandom(reference.pointer).object);
   }
 
   static final _setRandom = jniLookup<
@@ -554,7 +557,7 @@
   void setRandom(
     jni.JObject random,
   ) {
-    return _setRandom(reference, random.reference).check();
+    return _setRandom(reference.pointer, random.reference.pointer).check();
   }
 
   static final _getRandomLong = jniLookup<
@@ -565,7 +568,7 @@
 
   /// from: public long getRandomLong()
   int getRandomLong() {
-    return _getRandomLong(reference).long;
+    return _getRandomLong(reference.pointer).long;
   }
 
   static final _add4Longs = jniLookup<
@@ -582,7 +585,7 @@
     int c,
     int d,
   ) {
-    return _add4Longs(reference, a, b, c, d).long;
+    return _add4Longs(reference.pointer, a, b, c, d).long;
   }
 
   static final _add8Longs = jniLookup<
@@ -612,7 +615,7 @@
     int g,
     int h,
   ) {
-    return _add8Longs(reference, a, b, c, d, e, f, g, h).long;
+    return _add8Longs(reference.pointer, a, b, c, d, e, f, g, h).long;
   }
 
   static final _getRandomNumericString = jniLookup<
@@ -628,8 +631,9 @@
   jni.JString getRandomNumericString(
     jni.JObject random,
   ) {
-    return const jni.JStringType()
-        .fromRef(_getRandomNumericString(reference, random.reference).object);
+    return const jni.JStringType().fromRef(
+        _getRandomNumericString(reference.pointer, random.reference.pointer)
+            .object);
   }
 
   static final _protectedMethod = jniLookup<
@@ -647,7 +651,9 @@
     jni.JString a,
     jni.JString b,
   ) {
-    return _protectedMethod(reference, a.reference, b.reference).check();
+    return _protectedMethod(
+            reference.pointer, a.reference.pointer, b.reference.pointer)
+        .check();
   }
 
   static final _finalMethod = jniLookup<
@@ -658,7 +664,7 @@
 
   /// from: public final void finalMethod()
   void finalMethod() {
-    return _finalMethod(reference).check();
+    return _finalMethod(reference.pointer).check();
   }
 
   static final _getList = jniLookup<
@@ -671,7 +677,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni.JList<jni.JString> getList() {
     return const jni.JListType(jni.JStringType())
-        .fromRef(_getList(reference).object);
+        .fromRef(_getList(reference.pointer).object);
   }
 
   static final _joinStrings = jniLookup<
@@ -692,8 +698,9 @@
     jni.JList<jni.JString> values,
     jni.JString delim,
   ) {
-    return const jni.JStringType().fromRef(
-        _joinStrings(reference, values.reference, delim.reference).object);
+    return const jni.JStringType().fromRef(_joinStrings(reference.pointer,
+            values.reference.pointer, delim.reference.pointer)
+        .object);
   }
 
   static final _methodWithSeveralParams = jniLookup<
@@ -730,8 +737,14 @@
       (lt.$type as jni.JListType).E,
       t.$type,
     ]) as jni.JObjType<$T>;
-    return _methodWithSeveralParams(reference, ch, s.reference, a.reference,
-            t.reference, lt.reference, wm.reference)
+    return _methodWithSeveralParams(
+            reference.pointer,
+            ch,
+            s.reference.pointer,
+            a.reference.pointer,
+            t.reference.pointer,
+            lt.reference.pointer,
+            wm.reference.pointer)
         .check();
   }
 
@@ -786,7 +799,7 @@
     jni.JString codename,
   ) {
     return Example.fromRef(
-        _new3(number, isUp ? 1 : 0, codename.reference).object);
+        _new3(number, isUp ? 1 : 0, codename.reference.pointer).object);
   }
 
   static final _new4 = jniLookup<
@@ -819,7 +832,7 @@
 
   /// from: public int whichExample()
   int whichExample() {
-    return _whichExample(reference).integer;
+    return _whichExample(reference.pointer).integer;
   }
 
   static final _addInts = jniLookup<
@@ -854,7 +867,7 @@
   static int addAll(
     jni.JArray<jni.jint> arr,
   ) {
-    return _addAll(arr.reference).integer;
+    return _addAll(arr.reference.pointer).integer;
   }
 
   static final _getSelf = jniLookup<
@@ -866,7 +879,7 @@
   /// from: public com.github.dart_lang.jnigen.simple_package.Example getSelf()
   /// The returned object must be released after use, by calling the [release] method.
   Example getSelf() {
-    return const $ExampleType().fromRef(_getSelf(reference).object);
+    return const $ExampleType().fromRef(_getSelf(reference.pointer).object);
   }
 
   static final _throwException =
@@ -887,7 +900,7 @@
 
   /// from: public void overloaded()
   void overloaded() {
-    return _overloaded(reference).check();
+    return _overloaded(reference.pointer).check();
   }
 
   static final _overloaded1 = jniLookup<
@@ -903,7 +916,7 @@
     int a,
     jni.JString b,
   ) {
-    return _overloaded1(reference, a, b.reference).check();
+    return _overloaded1(reference.pointer, a, b.reference.pointer).check();
   }
 
   static final _overloaded2 = jniLookup<
@@ -916,7 +929,7 @@
   void overloaded2(
     int a,
   ) {
-    return _overloaded2(reference, a).check();
+    return _overloaded2(reference.pointer, a).check();
   }
 
   static final _overloaded3 = jniLookup<
@@ -934,7 +947,9 @@
     jni.JList<jni.JInteger> a,
     jni.JString b,
   ) {
-    return _overloaded3(reference, a.reference, b.reference).check();
+    return _overloaded3(
+            reference.pointer, a.reference.pointer, b.reference.pointer)
+        .check();
   }
 
   static final _overloaded4 = jniLookup<
@@ -949,7 +964,7 @@
   void overloaded4(
     jni.JList<jni.JInteger> a,
   ) {
-    return _overloaded4(reference, a.reference).check();
+    return _overloaded4(reference.pointer, a.reference.pointer).check();
   }
 }
 
@@ -1069,7 +1084,7 @@
 
   /// from: public int whichExample()
   int whichExample() {
-    return _whichExample(reference).integer;
+    return _whichExample(reference.pointer).integer;
   }
 }
 
@@ -1149,12 +1164,13 @@
 
   /// from: public T grandParentValue
   /// The returned object must be released after use, by calling the [release] method.
-  $T get grandParentValue => T.fromRef(_get_grandParentValue(reference).object);
+  $T get grandParentValue =>
+      T.fromRef(_get_grandParentValue(reference.pointer).object);
 
   /// from: public T grandParentValue
   /// The returned object must be released after use, by calling the [release] method.
   set grandParentValue($T value) =>
-      _set_grandParentValue(reference, value.reference).check();
+      _set_grandParentValue(reference.pointer, value.reference.pointer).check();
 
   static final _get_parentValue = jniLookup<
           ffi.NativeFunction<
@@ -1176,12 +1192,12 @@
 
   /// from: public S parentValue
   /// The returned object must be released after use, by calling the [release] method.
-  $S get parentValue => S.fromRef(_get_parentValue(reference).object);
+  $S get parentValue => S.fromRef(_get_parentValue(reference.pointer).object);
 
   /// from: public S parentValue
   /// The returned object must be released after use, by calling the [release] method.
   set parentValue($S value) =>
-      _set_parentValue(reference, value.reference).check();
+      _set_parentValue(reference.pointer, value.reference.pointer).check();
 
   static final _get_value = jniLookup<
           ffi.NativeFunction<
@@ -1203,11 +1219,12 @@
 
   /// from: public U value
   /// The returned object must be released after use, by calling the [release] method.
-  $U get value => U.fromRef(_get_value(reference).object);
+  $U get value => U.fromRef(_get_value(reference.pointer).object);
 
   /// from: public U value
   /// The returned object must be released after use, by calling the [release] method.
-  set value($U value) => _set_value(reference, value.reference).check();
+  set value($U value) =>
+      _set_value(reference.pointer, value.reference.pointer).check();
 
   static final _new0 = jniLookup<
           ffi.NativeFunction<
@@ -1235,8 +1252,8 @@
     U ??= jni.lowestCommonSuperType([
       newValue.$type,
     ]) as jni.JObjType<$U>;
-    return GrandParent_Parent_Child.fromRef(
-        T, S, U, _new0($parent.reference, newValue.reference).object);
+    return GrandParent_Parent_Child.fromRef(T, S, U,
+        _new0($parent.reference.pointer, newValue.reference.pointer).object);
   }
 }
 
@@ -1327,12 +1344,12 @@
 
   /// from: public T parentValue
   /// The returned object must be released after use, by calling the [release] method.
-  $T get parentValue => T.fromRef(_get_parentValue(reference).object);
+  $T get parentValue => T.fromRef(_get_parentValue(reference.pointer).object);
 
   /// from: public T parentValue
   /// The returned object must be released after use, by calling the [release] method.
   set parentValue($T value) =>
-      _set_parentValue(reference, value.reference).check();
+      _set_parentValue(reference.pointer, value.reference.pointer).check();
 
   static final _get_value = jniLookup<
           ffi.NativeFunction<
@@ -1353,11 +1370,12 @@
 
   /// from: public S value
   /// The returned object must be released after use, by calling the [release] method.
-  $S get value => S.fromRef(_get_value(reference).object);
+  $S get value => S.fromRef(_get_value(reference.pointer).object);
 
   /// from: public S value
   /// The returned object must be released after use, by calling the [release] method.
-  set value($S value) => _set_value(reference, value.reference).check();
+  set value($S value) =>
+      _set_value(reference.pointer, value.reference.pointer).check();
 
   static final _new0 = jniLookup<
           ffi.NativeFunction<
@@ -1381,8 +1399,8 @@
     S ??= jni.lowestCommonSuperType([
       newValue.$type,
     ]) as jni.JObjType<$S>;
-    return GrandParent_Parent.fromRef(
-        T, S, _new0($parent.reference, newValue.reference).object);
+    return GrandParent_Parent.fromRef(T, S,
+        _new0($parent.reference.pointer, newValue.reference.pointer).object);
   }
 }
 
@@ -1470,12 +1488,12 @@
 
   /// from: public S parentValue
   /// The returned object must be released after use, by calling the [release] method.
-  $S get parentValue => S.fromRef(_get_parentValue(reference).object);
+  $S get parentValue => S.fromRef(_get_parentValue(reference.pointer).object);
 
   /// from: public S parentValue
   /// The returned object must be released after use, by calling the [release] method.
   set parentValue($S value) =>
-      _set_parentValue(reference, value.reference).check();
+      _set_parentValue(reference.pointer, value.reference.pointer).check();
 
   static final _get_value = jniLookup<
           ffi.NativeFunction<
@@ -1497,11 +1515,12 @@
 
   /// from: public U value
   /// The returned object must be released after use, by calling the [release] method.
-  $U get value => U.fromRef(_get_value(reference).object);
+  $U get value => U.fromRef(_get_value(reference.pointer).object);
 
   /// from: public U value
   /// The returned object must be released after use, by calling the [release] method.
-  set value($U value) => _set_value(reference, value.reference).check();
+  set value($U value) =>
+      _set_value(reference.pointer, value.reference.pointer).check();
 
   static final _new0 = jniLookup<
               ffi.NativeFunction<
@@ -1531,7 +1550,8 @@
     return GrandParent_StaticParent_Child.fromRef(
         S,
         U,
-        _new0($parent.reference, parentValue.reference, value.reference)
+        _new0($parent.reference.pointer, parentValue.reference.pointer,
+                value.reference.pointer)
             .object);
   }
 }
@@ -1614,11 +1634,12 @@
 
   /// from: public S value
   /// The returned object must be released after use, by calling the [release] method.
-  $S get value => S.fromRef(_get_value(reference).object);
+  $S get value => S.fromRef(_get_value(reference.pointer).object);
 
   /// from: public S value
   /// The returned object must be released after use, by calling the [release] method.
-  set value($S value) => _set_value(reference, value.reference).check();
+  set value($S value) =>
+      _set_value(reference.pointer, value.reference.pointer).check();
 
   static final _new0 = jniLookup<
               ffi
@@ -1635,7 +1656,8 @@
     S ??= jni.lowestCommonSuperType([
       value.$type,
     ]) as jni.JObjType<$S>;
-    return GrandParent_StaticParent.fromRef(S, _new0(value.reference).object);
+    return GrandParent_StaticParent.fromRef(
+        S, _new0(value.reference.pointer).object);
   }
 }
 
@@ -1712,11 +1734,12 @@
 
   /// from: public T value
   /// The returned object must be released after use, by calling the [release] method.
-  $T get value => T.fromRef(_get_value(reference).object);
+  $T get value => T.fromRef(_get_value(reference.pointer).object);
 
   /// from: public T value
   /// The returned object must be released after use, by calling the [release] method.
-  set value($T value) => _set_value(reference, value.reference).check();
+  set value($T value) =>
+      _set_value(reference.pointer, value.reference.pointer).check();
 
   static final _new0 = jniLookup<
               ffi
@@ -1733,7 +1756,7 @@
     T ??= jni.lowestCommonSuperType([
       value.$type,
     ]) as jni.JObjType<$T>;
-    return GrandParent.fromRef(T, _new0(value.reference).object);
+    return GrandParent.fromRef(T, _new0(value.reference.pointer).object);
   }
 
   static final _stringParent = jniLookup<
@@ -1746,7 +1769,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   GrandParent_Parent<jni.JObject, jni.JString> stringParent() {
     return const $GrandParent_ParentType(jni.JObjectType(), jni.JStringType())
-        .fromRef(_stringParent(reference).object);
+        .fromRef(_stringParent(reference.pointer).object);
   }
 
   static final _varParent = jniLookup<
@@ -1766,8 +1789,8 @@
     S ??= jni.lowestCommonSuperType([
       nestedValue.$type,
     ]) as jni.JObjType<$S>;
-    return $GrandParent_ParentType(const jni.JObjectType(), S)
-        .fromRef(_varParent(reference, nestedValue.reference).object);
+    return $GrandParent_ParentType(const jni.JObjectType(), S).fromRef(
+        _varParent(reference.pointer, nestedValue.reference.pointer).object);
   }
 
   static final _stringStaticParent =
@@ -1798,7 +1821,7 @@
       value.$type,
     ]) as jni.JObjType<$S>;
     return $GrandParent_StaticParentType(S)
-        .fromRef(_varStaticParent(value.reference).object);
+        .fromRef(_varStaticParent(value.reference.pointer).object);
   }
 
   static final _staticParentWithSameType = jniLookup<
@@ -1811,7 +1834,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   GrandParent_StaticParent<$T> staticParentWithSameType() {
     return $GrandParent_StaticParentType(T)
-        .fromRef(_staticParentWithSameType(reference).object);
+        .fromRef(_staticParentWithSameType(reference.pointer).object);
   }
 }
 
@@ -1892,11 +1915,12 @@
 
   /// from: public K key
   /// The returned object must be released after use, by calling the [release] method.
-  $K get key => K.fromRef(_get_key(reference).object);
+  $K get key => K.fromRef(_get_key(reference.pointer).object);
 
   /// from: public K key
   /// The returned object must be released after use, by calling the [release] method.
-  set key($K value) => _set_key(reference, value.reference).check();
+  set key($K value) =>
+      _set_key(reference.pointer, value.reference.pointer).check();
 
   static final _get_value = jniLookup<
           ffi.NativeFunction<
@@ -1917,11 +1941,12 @@
 
   /// from: public V value
   /// The returned object must be released after use, by calling the [release] method.
-  $V get value => V.fromRef(_get_value(reference).object);
+  $V get value => V.fromRef(_get_value(reference.pointer).object);
 
   /// from: public V value
   /// The returned object must be released after use, by calling the [release] method.
-  set value($V value) => _set_value(reference, value.reference).check();
+  set value($V value) =>
+      _set_value(reference.pointer, value.reference.pointer).check();
 
   static final _new0 = jniLookup<
           ffi.NativeFunction<
@@ -1951,7 +1976,11 @@
       ($parent.$type as $MyMapType).V,
     ]) as jni.JObjType<$V>;
     return MyMap_MyEntry.fromRef(
-        K, V, _new0($parent.reference, key.reference, value.reference).object);
+        K,
+        V,
+        _new0($parent.reference.pointer, key.reference.pointer,
+                value.reference.pointer)
+            .object);
   }
 }
 
@@ -2044,7 +2073,7 @@
   $V get0(
     $K key,
   ) {
-    return V.fromRef(_get0(reference, key.reference).object);
+    return V.fromRef(_get0(reference.pointer, key.reference.pointer).object);
   }
 
   static final _put = jniLookup<
@@ -2061,7 +2090,9 @@
     $K key,
     $V value,
   ) {
-    return V.fromRef(_put(reference, key.reference, value.reference).object);
+    return V.fromRef(
+        _put(reference.pointer, key.reference.pointer, value.reference.pointer)
+            .object);
   }
 
   static final _entryStack = jniLookup<
@@ -2075,7 +2106,7 @@
   MyStack<MyMap_MyEntry<jni.JObject, jni.JObject>> entryStack() {
     return const $MyStackType(
             $MyMap_MyEntryType(jni.JObjectType(), jni.JObjectType()))
-        .fromRef(_entryStack(reference).object);
+        .fromRef(_entryStack(reference.pointer).object);
   }
 }
 
@@ -2161,7 +2192,7 @@
     T ??= jni.lowestCommonSuperType([
       ((arr.$type as jni.JArrayType).elementType as jni.JObjType),
     ]) as jni.JObjType<$T>;
-    return $MyStackType(T).fromRef(_fromArray(arr.reference).object);
+    return $MyStackType(T).fromRef(_fromArray(arr.reference.pointer).object);
   }
 
   static final _fromArrayOfArrayOfGrandParents = jniLookup<
@@ -2183,7 +2214,7 @@
           .T,
     ]) as jni.JObjType<$S>;
     return $MyStackType(S)
-        .fromRef(_fromArrayOfArrayOfGrandParents(arr.reference).object);
+        .fromRef(_fromArrayOfArrayOfGrandParents(arr.reference.pointer).object);
   }
 
   static final _of =
@@ -2212,7 +2243,7 @@
     T ??= jni.lowestCommonSuperType([
       obj.$type,
     ]) as jni.JObjType<$T>;
-    return $MyStackType(T).fromRef(_of1(obj.reference).object);
+    return $MyStackType(T).fromRef(_of1(obj.reference.pointer).object);
   }
 
   static final _of2 = jniLookup<
@@ -2234,7 +2265,8 @@
       obj2.$type,
       obj.$type,
     ]) as jni.JObjType<$T>;
-    return $MyStackType(T).fromRef(_of2(obj.reference, obj2.reference).object);
+    return $MyStackType(T)
+        .fromRef(_of2(obj.reference.pointer, obj2.reference.pointer).object);
   }
 
   static final _push = jniLookup<
@@ -2249,7 +2281,7 @@
   void push(
     $T item,
   ) {
-    return _push(reference, item.reference).check();
+    return _push(reference.pointer, item.reference.pointer).check();
   }
 
   static final _pop = jniLookup<
@@ -2260,7 +2292,7 @@
   /// from: public T pop()
   /// The returned object must be released after use, by calling the [release] method.
   $T pop() {
-    return T.fromRef(_pop(reference).object);
+    return T.fromRef(_pop(reference.pointer).object);
   }
 
   static final _size = jniLookup<
@@ -2270,7 +2302,7 @@
 
   /// from: public int size()
   int size() {
-    return _size(reference).integer;
+    return _size(reference.pointer).integer;
   }
 }
 
@@ -2518,7 +2550,7 @@
   void voidCallback(
     jni.JString s,
   ) {
-    return _voidCallback(reference, s.reference).check();
+    return _voidCallback(reference.pointer, s.reference.pointer).check();
   }
 
   static final _stringCallback = jniLookup<
@@ -2534,8 +2566,8 @@
   jni.JString stringCallback(
     jni.JString s,
   ) {
-    return const jni.JStringType()
-        .fromRef(_stringCallback(reference, s.reference).object);
+    return const jni.JStringType().fromRef(
+        _stringCallback(reference.pointer, s.reference.pointer).object);
   }
 
   static final _varCallback = jniLookup<
@@ -2551,7 +2583,8 @@
   $T varCallback(
     $T t,
   ) {
-    return T.fromRef(_varCallback(reference, t.reference).object);
+    return T
+        .fromRef(_varCallback(reference.pointer, t.reference.pointer).object);
   }
 
   static final _manyPrimitives = jniLookup<
@@ -2573,7 +2606,7 @@
     int c,
     double d,
   ) {
-    return _manyPrimitives(reference, a, b ? 1 : 0, c, d).long;
+    return _manyPrimitives(reference.pointer, a, b ? 1 : 0, c, d).long;
   }
 
   /// Maps a specific port to the implemented interface.
@@ -2618,13 +2651,19 @@
         final $r = _$impls[$p]!.stringCallback(
           $a[0].castTo(const jni.JStringType(), releaseOriginal: true),
         );
-        return ($r as jni.JObject).castTo(const jni.JObjectType()).toPointer();
+        return ($r as jni.JObject)
+            .castTo(const jni.JObjectType())
+            .reference
+            .toPointer();
       }
       if ($d == r"varCallback(Ljava/lang/Object;)Ljava/lang/Object;") {
         final $r = _$impls[$p]!.varCallback(
           $a[0].castTo(_$impls[$p]!.T, releaseOriginal: true),
         );
-        return ($r as jni.JObject).castTo(const jni.JObjectType()).toPointer();
+        return ($r as jni.JObject)
+            .castTo(const jni.JObjectType())
+            .reference
+            .toPointer();
       }
       if ($d == r"manyPrimitives(IZCD)J") {
         final $r = _$impls[$p]!.manyPrimitives(
@@ -2641,7 +2680,7 @@
               .castTo(const jni.JDoubleType(), releaseOriginal: true)
               .doubleValue(releaseOriginal: true),
         );
-        return jni.JLong($r).toPointer();
+        return jni.JLong($r).reference.toPointer();
       }
     } catch (e) {
       return ProtectedJniExtensions.newDartException(e.toString());
@@ -2816,8 +2855,8 @@
       t.$type,
       (myInterface.$type as $MyInterfaceType).T,
     ]) as jni.JObjType<$T>;
-    return _consumeOnAnotherThread(
-            myInterface.reference, s.reference, a, b ? 1 : 0, c, d, t.reference)
+    return _consumeOnAnotherThread(myInterface.reference.pointer,
+            s.reference.pointer, a, b ? 1 : 0, c, d, t.reference.pointer)
         .check();
   }
 
@@ -2851,8 +2890,8 @@
       t.$type,
       (myInterface.$type as $MyInterfaceType).T,
     ]) as jni.JObjType<$T>;
-    return _consumeOnSameThread(
-            myInterface.reference, s.reference, a, b ? 1 : 0, c, d, t.reference)
+    return _consumeOnSameThread(myInterface.reference.pointer,
+            s.reference.pointer, a, b ? 1 : 0, c, d, t.reference.pointer)
         .check();
   }
 }
@@ -2902,7 +2941,7 @@
 
   /// from: public abstract void run()
   void run() {
-    return _run(reference).check();
+    return _run(reference.pointer).check();
   }
 
   /// Maps a specific port to the implemented interface.
@@ -3050,12 +3089,12 @@
   /// from: public java.lang.Throwable error
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject get error =>
-      const jni.JObjectType().fromRef(_get_error(reference).object);
+      const jni.JObjectType().fromRef(_get_error(reference.pointer).object);
 
   /// from: public java.lang.Throwable error
   /// The returned object must be released after use, by calling the [release] method.
   set error(jni.JObject value) =>
-      _set_error(reference, value.reference).check();
+      _set_error(reference.pointer, value.reference.pointer).check();
 
   static final _new0 = jniLookup<
               ffi
@@ -3068,7 +3107,7 @@
   factory MyRunnableRunner(
     MyRunnable runnable,
   ) {
-    return MyRunnableRunner.fromRef(_new0(runnable.reference).object);
+    return MyRunnableRunner.fromRef(_new0(runnable.reference.pointer).object);
   }
 
   static final _runOnSameThread = jniLookup<
@@ -3079,7 +3118,7 @@
 
   /// from: public void runOnSameThread()
   void runOnSameThread() {
-    return _runOnSameThread(reference).check();
+    return _runOnSameThread(reference.pointer).check();
   }
 
   static final _runOnAnotherThread = jniLookup<
@@ -3090,7 +3129,7 @@
 
   /// from: public void runOnAnotherThread()
   void runOnAnotherThread() {
-    return _runOnAnotherThread(reference).check();
+    return _runOnAnotherThread(reference.pointer).check();
   }
 }
 
@@ -3155,7 +3194,7 @@
     jni.JString name,
   ) {
     return const $JsonSerializable_CaseType()
-        .fromRef(_valueOf(name.reference).object);
+        .fromRef(_valueOf(name.reference.pointer).object);
   }
 }
 
@@ -3207,7 +3246,8 @@
   /// from: public abstract com.github.dart_lang.jnigen.annotations.JsonSerializable$Case value()
   /// The returned object must be released after use, by calling the [release] method.
   JsonSerializable_Case value() {
-    return const $JsonSerializable_CaseType().fromRef(_value(reference).object);
+    return const $JsonSerializable_CaseType()
+        .fromRef(_value(reference.pointer).object);
   }
 
   /// Maps a specific port to the implemented interface.
@@ -3245,7 +3285,10 @@
       if ($d ==
           r"value()Lcom/github/dart_lang/jnigen/annotations/JsonSerializable$Case;") {
         final $r = _$impls[$p]!.value();
-        return ($r as jni.JObject).castTo(const jni.JObjectType()).toPointer();
+        return ($r as jni.JObject)
+            .castTo(const jni.JObjectType())
+            .reference
+            .toPointer();
       }
     } catch (e) {
       return ProtectedJniExtensions.newDartException(e.toString());
@@ -3404,7 +3447,7 @@
   static Color valueOf(
     jni.JString name,
   ) {
-    return const $ColorType().fromRef(_valueOf(name.reference).object);
+    return const $ColorType().fromRef(_valueOf(name.reference.pointer).object);
   }
 }
 
@@ -3539,7 +3582,8 @@
   /// from: public java.lang.Object objectMethod()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject objectMethod() {
-    return const jni.JObjectType().fromRef(_objectMethod(reference).object);
+    return const jni.JObjectType()
+        .fromRef(_objectMethod(reference.pointer).object);
   }
 
   static final _intMethod = jniLookup<
@@ -3550,7 +3594,7 @@
 
   /// from: public int intMethod()
   int intMethod() {
-    return _intMethod(reference).integer;
+    return _intMethod(reference.pointer).integer;
   }
 
   static final _objectArrayMethod = jniLookup<
@@ -3563,7 +3607,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni.JArray<jni.JObject> objectArrayMethod() {
     return const jni.JArrayType(jni.JObjectType())
-        .fromRef(_objectArrayMethod(reference).object);
+        .fromRef(_objectArrayMethod(reference.pointer).object);
   }
 
   static final _intArrayMethod = jniLookup<
@@ -3576,7 +3620,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni.JArray<jni.jint> intArrayMethod() {
     return const jni.JArrayType(jni.jintType())
-        .fromRef(_intArrayMethod(reference).object);
+        .fromRef(_intArrayMethod(reference.pointer).object);
   }
 
   static final _throwNullPointerException = jniLookup<
@@ -3587,7 +3631,7 @@
 
   /// from: public int throwNullPointerException()
   int throwNullPointerException() {
-    return _throwNullPointerException(reference).integer;
+    return _throwNullPointerException(reference.pointer).integer;
   }
 
   static final _throwFileNotFoundException = jniLookup<
@@ -3600,7 +3644,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject throwFileNotFoundException() {
     return const jni.JObjectType()
-        .fromRef(_throwFileNotFoundException(reference).object);
+        .fromRef(_throwFileNotFoundException(reference.pointer).object);
   }
 
   static final _throwClassCastException = jniLookup<
@@ -3613,7 +3657,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject throwClassCastException() {
     return const jni.JObjectType()
-        .fromRef(_throwClassCastException(reference).object);
+        .fromRef(_throwClassCastException(reference.pointer).object);
   }
 
   static final _throwArrayIndexException = jniLookup<
@@ -3624,7 +3668,7 @@
 
   /// from: public int throwArrayIndexException()
   int throwArrayIndexException() {
-    return _throwArrayIndexException(reference).integer;
+    return _throwArrayIndexException(reference.pointer).integer;
   }
 
   static final _throwArithmeticException = jniLookup<
@@ -3635,7 +3679,7 @@
 
   /// from: public int throwArithmeticException()
   int throwArithmeticException() {
-    return _throwArithmeticException(reference).integer;
+    return _throwArithmeticException(reference.pointer).integer;
   }
 
   static final _throwLoremIpsum =
@@ -3750,7 +3794,8 @@
 
   /// from: static public java.lang.String name
   /// The returned object must be released after use, by calling the [release] method.
-  static set name(jni.JString value) => _set_name(value.reference).check();
+  static set name(jni.JString value) =>
+      _set_name(value.reference.pointer).check();
 
   static final _get_i = jniLookup<
           ffi.NativeFunction<
@@ -3772,11 +3817,12 @@
   /// from: public java.lang.Integer i
   /// The returned object must be released after use, by calling the [release] method.
   jni.JInteger get i =>
-      const jni.JIntegerType().fromRef(_get_i(reference).object);
+      const jni.JIntegerType().fromRef(_get_i(reference.pointer).object);
 
   /// from: public java.lang.Integer i
   /// The returned object must be released after use, by calling the [release] method.
-  set i(jni.JInteger value) => _set_i(reference, value.reference).check();
+  set i(jni.JInteger value) =>
+      _set_i(reference.pointer, value.reference.pointer).check();
 
   static final _get_trillion = jniLookup<
           ffi.NativeFunction<
@@ -3795,10 +3841,10 @@
       .asFunction<jni.JniResult Function(jni.JObjectPtr, int)>();
 
   /// from: public long trillion
-  int get trillion => _get_trillion(reference).long;
+  int get trillion => _get_trillion(reference.pointer).long;
 
   /// from: public long trillion
-  set trillion(int value) => _set_trillion(reference, value).check();
+  set trillion(int value) => _set_trillion(reference.pointer, value).check();
 
   static final _get_isAchillesDead = jniLookup<
           ffi.NativeFunction<
@@ -3817,11 +3863,11 @@
       .asFunction<jni.JniResult Function(jni.JObjectPtr, int)>();
 
   /// from: public boolean isAchillesDead
-  bool get isAchillesDead => _get_isAchillesDead(reference).boolean;
+  bool get isAchillesDead => _get_isAchillesDead(reference.pointer).boolean;
 
   /// from: public boolean isAchillesDead
   set isAchillesDead(bool value) =>
-      _set_isAchillesDead(reference, value ? 1 : 0).check();
+      _set_isAchillesDead(reference.pointer, value ? 1 : 0).check();
 
   static final _get_bestFighterInGreece = jniLookup<
           ffi.NativeFunction<
@@ -3843,12 +3889,13 @@
   /// from: public java.lang.String bestFighterInGreece
   /// The returned object must be released after use, by calling the [release] method.
   jni.JString get bestFighterInGreece => const jni.JStringType()
-      .fromRef(_get_bestFighterInGreece(reference).object);
+      .fromRef(_get_bestFighterInGreece(reference.pointer).object);
 
   /// from: public java.lang.String bestFighterInGreece
   /// The returned object must be released after use, by calling the [release] method.
   set bestFighterInGreece(jni.JString value) =>
-      _set_bestFighterInGreece(reference, value.reference).check();
+      _set_bestFighterInGreece(reference.pointer, value.reference.pointer)
+          .check();
 
   static final _get_random = jniLookup<
           ffi.NativeFunction<
@@ -3870,12 +3917,12 @@
   /// from: public java.util.Random random
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject get random =>
-      const jni.JObjectType().fromRef(_get_random(reference).object);
+      const jni.JObjectType().fromRef(_get_random(reference.pointer).object);
 
   /// from: public java.util.Random random
   /// The returned object must be released after use, by calling the [release] method.
   set random(jni.JObject value) =>
-      _set_random(reference, value.reference).check();
+      _set_random(reference.pointer, value.reference.pointer).check();
 
   static final _get_euroSymbol =
       jniLookup<ffi.NativeFunction<jni.JniResult Function()>>(
@@ -3957,10 +4004,10 @@
       .asFunction<jni.JniResult Function(jni.JObjectPtr, int)>();
 
   /// from: public long hundred
-  int get hundred => _get_hundred(reference).long;
+  int get hundred => _get_hundred(reference.pointer).long;
 
   /// from: public long hundred
-  set hundred(int value) => _set_hundred(reference, value).check();
+  set hundred(int value) => _set_hundred(reference.pointer, value).check();
 
   static final _get_BEST_GOD =
       jniLookup<ffi.NativeFunction<jni.JniResult Function()>>(
@@ -3981,7 +4028,7 @@
   /// from: static public java.lang.String BEST_GOD
   /// The returned object must be released after use, by calling the [release] method.
   static set BEST_GOD(jni.JString value) =>
-      _set_BEST_GOD(value.reference).check();
+      _set_BEST_GOD(value.reference.pointer).check();
 
   static final _new0 = jniLookup<ffi.NativeFunction<jni.JniResult Function()>>(
           "Fields_Nested__new0")
diff --git a/pkgs/jnigen/test/simple_package_test/dart_only/dart_bindings/simple_package.dart b/pkgs/jnigen/test/simple_package_test/dart_only/dart_bindings/simple_package.dart
index 619d75b..ba14ad8 100644
--- a/pkgs/jnigen/test/simple_package_test/dart_only/dart_bindings/simple_package.dart
+++ b/pkgs/jnigen/test/simple_package_test/dart_only/dart_bindings/simple_package.dart
@@ -41,28 +41,29 @@
   /// The type which includes information such as the signature of this class.
   static const type = $Example_Nested_NestedTwiceType();
   static final _id_ZERO = jni.Jni.accessors.getStaticFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"ZERO",
     r"I",
   );
 
   /// from: static public int ZERO
   static int get ZERO => jni.Jni.accessors
-      .getStaticField(_class.reference, _id_ZERO, jni.JniCallType.intType)
+      .getStaticField(
+          _class.reference.pointer, _id_ZERO, jni.JniCallType.intType)
       .integer;
 
   /// from: static public int ZERO
   static set ZERO(int value) =>
-      jni.Jni.env.SetStaticIntField(_class.reference, _id_ZERO, value);
+      jni.Jni.env.SetStaticIntField(_class.reference.pointer, _id_ZERO, value);
 
-  static final _id_new0 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"()V");
+  static final _id_new0 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"()V");
 
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory Example_Nested_NestedTwice() {
     return Example_Nested_NestedTwice.fromRef(jni.Jni.accessors
-        .newObjectWithArgs(_class.reference, _id_new0, []).object);
+        .newObjectWithArgs(_class.reference.pointer, _id_new0, []).object);
   }
 }
 
@@ -108,44 +109,44 @@
 
   /// The type which includes information such as the signature of this class.
   static const type = $Example_NestedType();
-  static final _id_new0 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"(Z)V");
+  static final _id_new0 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"(Z)V");
 
   /// from: public void <init>(boolean value)
   /// The returned object must be released after use, by calling the [release] method.
   factory Example_Nested(
     bool value,
   ) {
-    return Example_Nested.fromRef(jni.Jni.accessors
-        .newObjectWithArgs(_class.reference, _id_new0, [value ? 1 : 0]).object);
+    return Example_Nested.fromRef(jni.Jni.accessors.newObjectWithArgs(
+        _class.reference.pointer, _id_new0, [value ? 1 : 0]).object);
   }
 
-  static final _id_usesAnonymousInnerClass = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"usesAnonymousInnerClass", r"()V");
+  static final _id_usesAnonymousInnerClass = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"usesAnonymousInnerClass", r"()V");
 
   /// from: public void usesAnonymousInnerClass()
   void usesAnonymousInnerClass() {
-    return jni.Jni.accessors.callMethodWithArgs(reference,
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
         _id_usesAnonymousInnerClass, jni.JniCallType.voidType, []).check();
   }
 
-  static final _id_getValue =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"getValue", r"()Z");
+  static final _id_getValue = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"getValue", r"()Z");
 
   /// from: public boolean getValue()
   bool getValue() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getValue, jni.JniCallType.booleanType, []).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer, _id_getValue,
+        jni.JniCallType.booleanType, []).boolean;
   }
 
-  static final _id_setValue =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"setValue", r"(Z)V");
+  static final _id_setValue = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"setValue", r"(Z)V");
 
   /// from: public void setValue(boolean value)
   void setValue(
     bool value,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_setValue,
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer, _id_setValue,
         jni.JniCallType.voidType, [value ? 1 : 0]).check();
   }
 }
@@ -191,22 +192,24 @@
   /// The type which includes information such as the signature of this class.
   static const type = $Example_NonStaticNestedType();
   static final _id_ok = jni.Jni.accessors.getFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"ok",
     r"Z",
   );
 
   /// from: public boolean ok
   bool get ok => jni.Jni.accessors
-      .getField(reference, _id_ok, jni.JniCallType.booleanType)
+      .getField(reference.pointer, _id_ok, jni.JniCallType.booleanType)
       .boolean;
 
   /// from: public boolean ok
   set ok(bool value) =>
-      jni.Jni.env.SetBooleanField(reference, _id_ok, value ? 1 : 0);
+      jni.Jni.env.SetBooleanField(reference.pointer, _id_ok, value ? 1 : 0);
 
-  static final _id_new0 = jni.Jni.accessors.getMethodIDOf(_class.reference,
-      r"<init>", r"(Lcom/github/dart_lang/jnigen/simple_package/Example;)V");
+  static final _id_new0 = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer,
+      r"<init>",
+      r"(Lcom/github/dart_lang/jnigen/simple_package/Example;)V");
 
   /// from: public void <init>(com.github.dart_lang.jnigen.simple_package.Example $parent)
   /// The returned object must be released after use, by calling the [release] method.
@@ -214,7 +217,9 @@
     Example $parent,
   ) {
     return Example_NonStaticNested.fromRef(jni.Jni.accessors.newObjectWithArgs(
-        _class.reference, _id_new0, [$parent.reference]).object);
+        _class.reference.pointer,
+        _id_new0,
+        [$parent.reference.pointer]).object);
   }
 }
 
@@ -273,21 +278,21 @@
   /// from: static public final char SEMICOLON
   static const SEMICOLON = 59;
   static final _id_SEMICOLON_STRING = jni.Jni.accessors.getStaticFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"SEMICOLON_STRING",
     r"Ljava/lang/String;",
   );
 
   /// from: static public final java.lang.String SEMICOLON_STRING
   /// The returned object must be released after use, by calling the [release] method.
-  static jni.JString get SEMICOLON_STRING => const jni.JStringType().fromRef(jni
-      .Jni.accessors
-      .getStaticField(
-          _class.reference, _id_SEMICOLON_STRING, jni.JniCallType.objectType)
-      .object);
+  static jni.JString get SEMICOLON_STRING =>
+      const jni.JStringType().fromRef(jni.Jni.accessors
+          .getStaticField(_class.reference.pointer, _id_SEMICOLON_STRING,
+              jni.JniCallType.objectType)
+          .object);
 
   static final _id_unusedRandom = jni.Jni.accessors.getStaticFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"unusedRandom",
     r"Ljava/util/Random;",
   );
@@ -296,12 +301,12 @@
   /// The returned object must be released after use, by calling the [release] method.
   static jni.JObject get unusedRandom =>
       const jni.JObjectType().fromRef(jni.Jni.accessors
-          .getStaticField(
-              _class.reference, _id_unusedRandom, jni.JniCallType.objectType)
+          .getStaticField(_class.reference.pointer, _id_unusedRandom,
+              jni.JniCallType.objectType)
           .object);
 
   static final _id_protectedField = jni.Jni.accessors.getFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"protectedField",
     r"Ljava/util/Random;",
   );
@@ -310,54 +315,55 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject get protectedField =>
       const jni.JObjectType().fromRef(jni.Jni.accessors
-          .getField(reference, _id_protectedField, jni.JniCallType.objectType)
+          .getField(
+              reference.pointer, _id_protectedField, jni.JniCallType.objectType)
           .object);
 
   /// from: protected java.util.Random protectedField
   /// The returned object must be released after use, by calling the [release] method.
-  set protectedField(jni.JObject value) => jni.Jni.env
-      .SetObjectField(reference, _id_protectedField, value.reference);
+  set protectedField(jni.JObject value) => jni.Jni.env.SetObjectField(
+      reference.pointer, _id_protectedField, value.reference.pointer);
 
   static final _id_getAmount = jni.Jni.accessors
-      .getStaticMethodIDOf(_class.reference, r"getAmount", r"()I");
+      .getStaticMethodIDOf(_class.reference.pointer, r"getAmount", r"()I");
 
   /// from: static public int getAmount()
   static int getAmount() {
-    return jni.Jni.accessors.callStaticMethodWithArgs(
-        _class.reference, _id_getAmount, jni.JniCallType.intType, []).integer;
+    return jni.Jni.accessors.callStaticMethodWithArgs(_class.reference.pointer,
+        _id_getAmount, jni.JniCallType.intType, []).integer;
   }
 
-  static final _id_getPi =
-      jni.Jni.accessors.getStaticMethodIDOf(_class.reference, r"getPi", r"()D");
+  static final _id_getPi = jni.Jni.accessors
+      .getStaticMethodIDOf(_class.reference.pointer, r"getPi", r"()D");
 
   /// from: static public double getPi()
   static double getPi() {
-    return jni.Jni.accessors.callStaticMethodWithArgs(_class.reference,
+    return jni.Jni.accessors.callStaticMethodWithArgs(_class.reference.pointer,
         _id_getPi, jni.JniCallType.doubleType, []).doubleFloat;
   }
 
   static final _id_getAsterisk = jni.Jni.accessors
-      .getStaticMethodIDOf(_class.reference, r"getAsterisk", r"()C");
+      .getStaticMethodIDOf(_class.reference.pointer, r"getAsterisk", r"()C");
 
   /// from: static public char getAsterisk()
   static int getAsterisk() {
-    return jni.Jni.accessors.callStaticMethodWithArgs(
-        _class.reference, _id_getAsterisk, jni.JniCallType.charType, []).char;
+    return jni.Jni.accessors.callStaticMethodWithArgs(_class.reference.pointer,
+        _id_getAsterisk, jni.JniCallType.charType, []).char;
   }
 
   static final _id_getName = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference, r"getName", r"()Ljava/lang/String;");
+      _class.reference.pointer, r"getName", r"()Ljava/lang/String;");
 
   /// from: static public java.lang.String getName()
   /// The returned object must be released after use, by calling the [release] method.
   static jni.JString getName() {
     return const jni.JStringType().fromRef(jni.Jni.accessors
-        .callStaticMethodWithArgs(_class.reference, _id_getName,
+        .callStaticMethodWithArgs(_class.reference.pointer, _id_getName,
             jni.JniCallType.objectType, []).object);
   }
 
   static final _id_getNestedInstance = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"getNestedInstance",
       r"()Lcom/github/dart_lang/jnigen/simple_package/Example$Nested;");
 
@@ -365,37 +371,40 @@
   /// The returned object must be released after use, by calling the [release] method.
   static Example_Nested getNestedInstance() {
     return const $Example_NestedType().fromRef(jni.Jni.accessors
-        .callStaticMethodWithArgs(_class.reference, _id_getNestedInstance,
-            jni.JniCallType.objectType, []).object);
+        .callStaticMethodWithArgs(_class.reference.pointer,
+            _id_getNestedInstance, jni.JniCallType.objectType, []).object);
   }
 
   static final _id_setAmount = jni.Jni.accessors
-      .getStaticMethodIDOf(_class.reference, r"setAmount", r"(I)V");
+      .getStaticMethodIDOf(_class.reference.pointer, r"setAmount", r"(I)V");
 
   /// from: static public void setAmount(int newAmount)
   static void setAmount(
     int newAmount,
   ) {
     return jni.Jni.accessors.callStaticMethodWithArgs(
-        _class.reference,
+        _class.reference.pointer,
         _id_setAmount,
         jni.JniCallType.voidType,
         [jni.JValueInt(newAmount)]).check();
   }
 
   static final _id_setName = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference, r"setName", r"(Ljava/lang/String;)V");
+      _class.reference.pointer, r"setName", r"(Ljava/lang/String;)V");
 
   /// from: static public void setName(java.lang.String newName)
   static void setName(
     jni.JString newName,
   ) {
-    return jni.Jni.accessors.callStaticMethodWithArgs(_class.reference,
-        _id_setName, jni.JniCallType.voidType, [newName.reference]).check();
+    return jni.Jni.accessors.callStaticMethodWithArgs(
+        _class.reference.pointer,
+        _id_setName,
+        jni.JniCallType.voidType,
+        [newName.reference.pointer]).check();
   }
 
   static final _id_setNestedInstance = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"setNestedInstance",
       r"(Lcom/github/dart_lang/jnigen/simple_package/Example$Nested;)V");
 
@@ -404,14 +413,14 @@
     Example_Nested newNested,
   ) {
     return jni.Jni.accessors.callStaticMethodWithArgs(
-        _class.reference,
+        _class.reference.pointer,
         _id_setNestedInstance,
         jni.JniCallType.voidType,
-        [newNested.reference]).check();
+        [newNested.reference.pointer]).check();
   }
 
   static final _id_max4 = jni.Jni.accessors
-      .getStaticMethodIDOf(_class.reference, r"max4", r"(IIII)I");
+      .getStaticMethodIDOf(_class.reference.pointer, r"max4", r"(IIII)I");
 
   /// from: static public int max4(int a, int b, int c, int d)
   static int max4(
@@ -421,7 +430,7 @@
     int d,
   ) {
     return jni.Jni.accessors.callStaticMethodWithArgs(
-        _class.reference, _id_max4, jni.JniCallType.intType, [
+        _class.reference.pointer, _id_max4, jni.JniCallType.intType, [
       jni.JValueInt(a),
       jni.JValueInt(b),
       jni.JValueInt(c),
@@ -430,7 +439,7 @@
   }
 
   static final _id_max8 = jni.Jni.accessors
-      .getStaticMethodIDOf(_class.reference, r"max8", r"(IIIIIIII)I");
+      .getStaticMethodIDOf(_class.reference.pointer, r"max8", r"(IIIIIIII)I");
 
   /// from: static public int max8(int a, int b, int c, int d, int e, int f, int g, int h)
   static int max8(
@@ -444,7 +453,7 @@
     int h,
   ) {
     return jni.Jni.accessors.callStaticMethodWithArgs(
-        _class.reference, _id_max8, jni.JniCallType.intType, [
+        _class.reference.pointer, _id_max8, jni.JniCallType.intType, [
       jni.JValueInt(a),
       jni.JValueInt(b),
       jni.JValueInt(c),
@@ -456,99 +465,112 @@
     ]).integer;
   }
 
-  static final _id_getNumber =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"getNumber", r"()I");
+  static final _id_getNumber = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"getNumber", r"()I");
 
   /// from: public int getNumber()
   int getNumber() {
     return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getNumber, jni.JniCallType.intType, []).integer;
+        reference.pointer, _id_getNumber, jni.JniCallType.intType, []).integer;
   }
 
-  static final _id_setNumber =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"setNumber", r"(I)V");
+  static final _id_setNumber = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"setNumber", r"(I)V");
 
   /// from: public void setNumber(int number)
   void setNumber(
     int number,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_setNumber,
-        jni.JniCallType.voidType, [jni.JValueInt(number)]).check();
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_setNumber,
+        jni.JniCallType.voidType,
+        [jni.JValueInt(number)]).check();
   }
 
-  static final _id_getIsUp =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"getIsUp", r"()Z");
+  static final _id_getIsUp = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"getIsUp", r"()Z");
 
   /// from: public boolean getIsUp()
   bool getIsUp() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getIsUp, jni.JniCallType.booleanType, []).boolean;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer, _id_getIsUp,
+        jni.JniCallType.booleanType, []).boolean;
   }
 
-  static final _id_setUp =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"setUp", r"(Z)V");
+  static final _id_setUp = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"setUp", r"(Z)V");
 
   /// from: public void setUp(boolean isUp)
   void setUp(
     bool isUp,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_setUp, jni.JniCallType.voidType, [isUp ? 1 : 0]).check();
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer, _id_setUp,
+        jni.JniCallType.voidType, [isUp ? 1 : 0]).check();
   }
 
-  static final _id_getCodename = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getCodename", r"()Ljava/lang/String;");
+  static final _id_getCodename = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"getCodename", r"()Ljava/lang/String;");
 
   /// from: public java.lang.String getCodename()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JString getCodename() {
     return const jni.JStringType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getCodename, jni.JniCallType.objectType, []).object);
+        reference.pointer,
+        _id_getCodename,
+        jni.JniCallType.objectType, []).object);
   }
 
   static final _id_setCodename = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"setCodename", r"(Ljava/lang/String;)V");
+      _class.reference.pointer, r"setCodename", r"(Ljava/lang/String;)V");
 
   /// from: public void setCodename(java.lang.String codename)
   void setCodename(
     jni.JString codename,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_setCodename,
-        jni.JniCallType.voidType, [codename.reference]).check();
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_setCodename,
+        jni.JniCallType.voidType,
+        [codename.reference.pointer]).check();
   }
 
-  static final _id_getRandom = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getRandom", r"()Ljava/util/Random;");
+  static final _id_getRandom = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"getRandom", r"()Ljava/util/Random;");
 
   /// from: public java.util.Random getRandom()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject getRandom() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getRandom, jni.JniCallType.objectType, []).object);
+        reference.pointer,
+        _id_getRandom,
+        jni.JniCallType.objectType, []).object);
   }
 
-  static final _id_setRandom = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"setRandom", r"(Ljava/util/Random;)V");
+  static final _id_setRandom = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"setRandom", r"(Ljava/util/Random;)V");
 
   /// from: public void setRandom(java.util.Random random)
   void setRandom(
     jni.JObject random,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_setRandom,
-        jni.JniCallType.voidType, [random.reference]).check();
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_setRandom,
+        jni.JniCallType.voidType,
+        [random.reference.pointer]).check();
   }
 
   static final _id_getRandomLong = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getRandomLong", r"()J");
+      .getMethodIDOf(_class.reference.pointer, r"getRandomLong", r"()J");
 
   /// from: public long getRandomLong()
   int getRandomLong() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getRandomLong, jni.JniCallType.longType, []).long;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_getRandomLong, jni.JniCallType.longType, []).long;
   }
 
   static final _id_add4Longs = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"add4Longs", r"(JJJJ)J");
+      .getMethodIDOf(_class.reference.pointer, r"add4Longs", r"(JJJJ)J");
 
   /// from: public long add4Longs(long a, long b, long c, long d)
   int add4Longs(
@@ -557,12 +579,12 @@
     int c,
     int d,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_add4Longs, jni.JniCallType.longType, [a, b, c, d]).long;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_add4Longs, jni.JniCallType.longType, [a, b, c, d]).long;
   }
 
   static final _id_add8Longs = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"add8Longs", r"(JJJJJJJJ)J");
+      .getMethodIDOf(_class.reference.pointer, r"add8Longs", r"(JJJJJJJJ)J");
 
   /// from: public long add8Longs(long a, long b, long c, long d, long e, long f, long g, long h)
   int add8Longs(
@@ -575,12 +597,12 @@
     int g,
     int h,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_add8Longs,
-        jni.JniCallType.longType, [a, b, c, d, e, f, g, h]).long;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_add8Longs, jni.JniCallType.longType, [a, b, c, d, e, f, g, h]).long;
   }
 
   static final _id_getRandomNumericString = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"getRandomNumericString",
       r"(Ljava/util/Random;)Ljava/lang/String;");
 
@@ -590,14 +612,14 @@
     jni.JObject random,
   ) {
     return const jni.JStringType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_getRandomNumericString,
         jni.JniCallType.objectType,
-        [random.reference]).object);
+        [random.reference.pointer]).object);
   }
 
   static final _id_protectedMethod = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"protectedMethod",
       r"(Ljava/lang/String;Ljava/lang/String;)V");
 
@@ -606,32 +628,35 @@
     jni.JString a,
     jni.JString b,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_protectedMethod,
-        jni.JniCallType.voidType, [a.reference, b.reference]).check();
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_protectedMethod,
+        jni.JniCallType.voidType,
+        [a.reference.pointer, b.reference.pointer]).check();
   }
 
-  static final _id_finalMethod =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"finalMethod", r"()V");
+  static final _id_finalMethod = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"finalMethod", r"()V");
 
   /// from: public final void finalMethod()
   void finalMethod() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_finalMethod, jni.JniCallType.voidType, []).check();
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_finalMethod, jni.JniCallType.voidType, []).check();
   }
 
-  static final _id_getList = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"getList", r"()Ljava/util/List;");
+  static final _id_getList = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"getList", r"()Ljava/util/List;");
 
   /// from: public java.util.List<java.lang.String> getList()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JList<jni.JString> getList() {
     return const jni.JListType(jni.JStringType()).fromRef(jni.Jni.accessors
-        .callMethodWithArgs(
-            reference, _id_getList, jni.JniCallType.objectType, []).object);
+        .callMethodWithArgs(reference.pointer, _id_getList,
+            jni.JniCallType.objectType, []).object);
   }
 
   static final _id_joinStrings = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"joinStrings",
       r"(Ljava/util/List;Ljava/lang/String;)Ljava/lang/String;");
 
@@ -644,14 +669,14 @@
     jni.JString delim,
   ) {
     return const jni.JStringType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_joinStrings,
         jni.JniCallType.objectType,
-        [values.reference, delim.reference]).object);
+        [values.reference.pointer, delim.reference.pointer]).object);
   }
 
   static final _id_methodWithSeveralParams = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"methodWithSeveralParams",
       r"(CLjava/lang/String;[ILjava/lang/CharSequence;Ljava/util/List;Ljava/util/Map;)V");
 
@@ -669,29 +694,29 @@
       (lt.$type as jni.JListType).E,
       t.$type,
     ]) as jni.JObjType<$T>;
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_methodWithSeveralParams, jni.JniCallType.voidType, [
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_methodWithSeveralParams, jni.JniCallType.voidType, [
       jni.JValueChar(ch),
-      s.reference,
-      a.reference,
-      t.reference,
-      lt.reference,
-      wm.reference
+      s.reference.pointer,
+      a.reference.pointer,
+      t.reference.pointer,
+      lt.reference.pointer,
+      wm.reference.pointer
     ]).check();
   }
 
-  static final _id_new0 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"()V");
+  static final _id_new0 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"()V");
 
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory Example() {
     return Example.fromRef(jni.Jni.accessors
-        .newObjectWithArgs(_class.reference, _id_new0, []).object);
+        .newObjectWithArgs(_class.reference.pointer, _id_new0, []).object);
   }
 
-  static final _id_new1 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"(I)V");
+  static final _id_new1 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"(I)V");
 
   /// from: public void <init>(int number)
   /// The returned object must be released after use, by calling the [release] method.
@@ -699,11 +724,11 @@
     int number,
   ) {
     return Example.fromRef(jni.Jni.accessors.newObjectWithArgs(
-        _class.reference, _id_new1, [jni.JValueInt(number)]).object);
+        _class.reference.pointer, _id_new1, [jni.JValueInt(number)]).object);
   }
 
-  static final _id_new2 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"(IZ)V");
+  static final _id_new2 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"(IZ)V");
 
   /// from: public void <init>(int number, boolean isUp)
   /// The returned object must be released after use, by calling the [release] method.
@@ -711,12 +736,14 @@
     int number,
     bool isUp,
   ) {
-    return Example.fromRef(jni.Jni.accessors.newObjectWithArgs(_class.reference,
-        _id_new2, [jni.JValueInt(number), isUp ? 1 : 0]).object);
+    return Example.fromRef(jni.Jni.accessors.newObjectWithArgs(
+        _class.reference.pointer,
+        _id_new2,
+        [jni.JValueInt(number), isUp ? 1 : 0]).object);
   }
 
-  static final _id_new3 = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"<init>", r"(IZLjava/lang/String;)V");
+  static final _id_new3 = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"<init>", r"(IZLjava/lang/String;)V");
 
   /// from: public void <init>(int number, boolean isUp, java.lang.String codename)
   /// The returned object must be released after use, by calling the [release] method.
@@ -726,13 +753,15 @@
     jni.JString codename,
   ) {
     return Example.fromRef(jni.Jni.accessors.newObjectWithArgs(
-        _class.reference,
-        _id_new3,
-        [jni.JValueInt(number), isUp ? 1 : 0, codename.reference]).object);
+        _class.reference.pointer, _id_new3, [
+      jni.JValueInt(number),
+      isUp ? 1 : 0,
+      codename.reference.pointer
+    ]).object);
   }
 
   static final _id_new4 = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"<init>", r"(IIIIIIII)V");
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"(IIIIIIII)V");
 
   /// from: public void <init>(int a, int b, int c, int d, int e, int f, int g, int h)
   /// The returned object must be released after use, by calling the [release] method.
@@ -746,8 +775,8 @@
     int g,
     int h,
   ) {
-    return Example.fromRef(
-        jni.Jni.accessors.newObjectWithArgs(_class.reference, _id_new4, [
+    return Example.fromRef(jni.Jni.accessors
+        .newObjectWithArgs(_class.reference.pointer, _id_new4, [
       jni.JValueInt(a),
       jni.JValueInt(b),
       jni.JValueInt(c),
@@ -760,16 +789,16 @@
   }
 
   static final _id_whichExample = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"whichExample", r"()I");
+      .getMethodIDOf(_class.reference.pointer, r"whichExample", r"()I");
 
   /// from: public int whichExample()
   int whichExample() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_whichExample, jni.JniCallType.intType, []).integer;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_whichExample, jni.JniCallType.intType, []).integer;
   }
 
   static final _id_addInts = jni.Jni.accessors
-      .getStaticMethodIDOf(_class.reference, r"addInts", r"(II)I");
+      .getStaticMethodIDOf(_class.reference.pointer, r"addInts", r"(II)I");
 
   /// from: static public int addInts(int a, int b)
   static int addInts(
@@ -777,87 +806,92 @@
     int b,
   ) {
     return jni.Jni.accessors.callStaticMethodWithArgs(
-        _class.reference,
+        _class.reference.pointer,
         _id_addInts,
         jni.JniCallType.intType,
         [jni.JValueInt(a), jni.JValueInt(b)]).integer;
   }
 
   static final _id_getArr = jni.Jni.accessors
-      .getStaticMethodIDOf(_class.reference, r"getArr", r"()[I");
+      .getStaticMethodIDOf(_class.reference.pointer, r"getArr", r"()[I");
 
   /// from: static public int[] getArr()
   /// The returned object must be released after use, by calling the [release] method.
   static jni.JArray<jni.jint> getArr() {
     return const jni.JArrayType(jni.jintType()).fromRef(jni.Jni.accessors
-        .callStaticMethodWithArgs(_class.reference, _id_getArr,
+        .callStaticMethodWithArgs(_class.reference.pointer, _id_getArr,
             jni.JniCallType.objectType, []).object);
   }
 
   static final _id_addAll = jni.Jni.accessors
-      .getStaticMethodIDOf(_class.reference, r"addAll", r"([I)I");
+      .getStaticMethodIDOf(_class.reference.pointer, r"addAll", r"([I)I");
 
   /// from: static public int addAll(int[] arr)
   static int addAll(
     jni.JArray<jni.jint> arr,
   ) {
-    return jni.Jni.accessors.callStaticMethodWithArgs(_class.reference,
-        _id_addAll, jni.JniCallType.intType, [arr.reference]).integer;
+    return jni.Jni.accessors.callStaticMethodWithArgs(_class.reference.pointer,
+        _id_addAll, jni.JniCallType.intType, [arr.reference.pointer]).integer;
   }
 
-  static final _id_getSelf = jni.Jni.accessors.getMethodIDOf(_class.reference,
-      r"getSelf", r"()Lcom/github/dart_lang/jnigen/simple_package/Example;");
+  static final _id_getSelf = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer,
+      r"getSelf",
+      r"()Lcom/github/dart_lang/jnigen/simple_package/Example;");
 
   /// from: public com.github.dart_lang.jnigen.simple_package.Example getSelf()
   /// The returned object must be released after use, by calling the [release] method.
   Example getSelf() {
     return const $ExampleType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_getSelf, jni.JniCallType.objectType, []).object);
+        reference.pointer, _id_getSelf, jni.JniCallType.objectType, []).object);
   }
 
   static final _id_throwException = jni.Jni.accessors
-      .getStaticMethodIDOf(_class.reference, r"throwException", r"()V");
+      .getStaticMethodIDOf(_class.reference.pointer, r"throwException", r"()V");
 
   /// from: static public void throwException()
   static void throwException() {
-    return jni.Jni.accessors.callStaticMethodWithArgs(_class.reference,
+    return jni.Jni.accessors.callStaticMethodWithArgs(_class.reference.pointer,
         _id_throwException, jni.JniCallType.voidType, []).check();
   }
 
-  static final _id_overloaded =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"overloaded", r"()V");
+  static final _id_overloaded = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"overloaded", r"()V");
 
   /// from: public void overloaded()
   void overloaded() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_overloaded, jni.JniCallType.voidType, []).check();
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_overloaded, jni.JniCallType.voidType, []).check();
   }
 
   static final _id_overloaded1 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"overloaded", r"(ILjava/lang/String;)V");
+      _class.reference.pointer, r"overloaded", r"(ILjava/lang/String;)V");
 
   /// from: public void overloaded(int a, java.lang.String b)
   void overloaded1(
     int a,
     jni.JString b,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_overloaded1,
-        jni.JniCallType.voidType, [jni.JValueInt(a), b.reference]).check();
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_overloaded1,
+        jni.JniCallType.voidType,
+        [jni.JValueInt(a), b.reference.pointer]).check();
   }
 
-  static final _id_overloaded2 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"overloaded", r"(I)V");
+  static final _id_overloaded2 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"overloaded", r"(I)V");
 
   /// from: public void overloaded(int a)
   void overloaded2(
     int a,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_overloaded2,
-        jni.JniCallType.voidType, [jni.JValueInt(a)]).check();
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_overloaded2, jni.JniCallType.voidType, [jni.JValueInt(a)]).check();
   }
 
   static final _id_overloaded3 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"overloaded",
       r"(Ljava/util/List;Ljava/lang/String;)V");
 
@@ -866,19 +900,25 @@
     jni.JList<jni.JInteger> a,
     jni.JString b,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_overloaded3,
-        jni.JniCallType.voidType, [a.reference, b.reference]).check();
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_overloaded3,
+        jni.JniCallType.voidType,
+        [a.reference.pointer, b.reference.pointer]).check();
   }
 
-  static final _id_overloaded4 = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"overloaded", r"(Ljava/util/List;)V");
+  static final _id_overloaded4 = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"overloaded", r"(Ljava/util/List;)V");
 
   /// from: public void overloaded(java.util.List<java.lang.Integer> a)
   void overloaded4(
     jni.JList<jni.JInteger> a,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_overloaded4,
-        jni.JniCallType.voidType, [a.reference]).check();
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_overloaded4,
+        jni.JniCallType.voidType,
+        [a.reference.pointer]).check();
   }
 }
 
@@ -922,28 +962,29 @@
   /// The type which includes information such as the signature of this class.
   static const type = $C2Type();
   static final _id_CONSTANT = jni.Jni.accessors.getStaticFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"CONSTANT",
     r"I",
   );
 
   /// from: static public int CONSTANT
   static int get CONSTANT => jni.Jni.accessors
-      .getStaticField(_class.reference, _id_CONSTANT, jni.JniCallType.intType)
+      .getStaticField(
+          _class.reference.pointer, _id_CONSTANT, jni.JniCallType.intType)
       .integer;
 
   /// from: static public int CONSTANT
-  static set CONSTANT(int value) =>
-      jni.Jni.env.SetStaticIntField(_class.reference, _id_CONSTANT, value);
+  static set CONSTANT(int value) => jni.Jni.env
+      .SetStaticIntField(_class.reference.pointer, _id_CONSTANT, value);
 
-  static final _id_new0 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"()V");
+  static final _id_new0 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"()V");
 
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory C2() {
     return C2.fromRef(jni.Jni.accessors
-        .newObjectWithArgs(_class.reference, _id_new0, []).object);
+        .newObjectWithArgs(_class.reference.pointer, _id_new0, []).object);
   }
 }
 
@@ -985,23 +1026,23 @@
 
   /// The type which includes information such as the signature of this class.
   static const type = $Example1Type();
-  static final _id_new0 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"()V");
+  static final _id_new0 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"()V");
 
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory Example1() {
     return Example1.fromRef(jni.Jni.accessors
-        .newObjectWithArgs(_class.reference, _id_new0, []).object);
+        .newObjectWithArgs(_class.reference.pointer, _id_new0, []).object);
   }
 
   static final _id_whichExample = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"whichExample", r"()I");
+      .getMethodIDOf(_class.reference.pointer, r"whichExample", r"()I");
 
   /// from: public int whichExample()
   int whichExample() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_whichExample, jni.JniCallType.intType, []).integer;
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_whichExample, jni.JniCallType.intType, []).integer;
   }
 }
 
@@ -1065,7 +1106,7 @@
   }
 
   static final _id_grandParentValue = jni.Jni.accessors.getFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"grandParentValue",
     r"Ljava/lang/Object;",
   );
@@ -1073,16 +1114,17 @@
   /// from: public T grandParentValue
   /// The returned object must be released after use, by calling the [release] method.
   $T get grandParentValue => T.fromRef(jni.Jni.accessors
-      .getField(reference, _id_grandParentValue, jni.JniCallType.objectType)
+      .getField(
+          reference.pointer, _id_grandParentValue, jni.JniCallType.objectType)
       .object);
 
   /// from: public T grandParentValue
   /// The returned object must be released after use, by calling the [release] method.
-  set grandParentValue($T value) => jni.Jni.env
-      .SetObjectField(reference, _id_grandParentValue, value.reference);
+  set grandParentValue($T value) => jni.Jni.env.SetObjectField(
+      reference.pointer, _id_grandParentValue, value.reference.pointer);
 
   static final _id_parentValue = jni.Jni.accessors.getFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"parentValue",
     r"Ljava/lang/Object;",
   );
@@ -1090,16 +1132,16 @@
   /// from: public S parentValue
   /// The returned object must be released after use, by calling the [release] method.
   $S get parentValue => S.fromRef(jni.Jni.accessors
-      .getField(reference, _id_parentValue, jni.JniCallType.objectType)
+      .getField(reference.pointer, _id_parentValue, jni.JniCallType.objectType)
       .object);
 
   /// from: public S parentValue
   /// The returned object must be released after use, by calling the [release] method.
-  set parentValue($S value) =>
-      jni.Jni.env.SetObjectField(reference, _id_parentValue, value.reference);
+  set parentValue($S value) => jni.Jni.env.SetObjectField(
+      reference.pointer, _id_parentValue, value.reference.pointer);
 
   static final _id_value = jni.Jni.accessors.getFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"value",
     r"Ljava/lang/Object;",
   );
@@ -1107,16 +1149,16 @@
   /// from: public U value
   /// The returned object must be released after use, by calling the [release] method.
   $U get value => U.fromRef(jni.Jni.accessors
-      .getField(reference, _id_value, jni.JniCallType.objectType)
+      .getField(reference.pointer, _id_value, jni.JniCallType.objectType)
       .object);
 
   /// from: public U value
   /// The returned object must be released after use, by calling the [release] method.
-  set value($U value) =>
-      jni.Jni.env.SetObjectField(reference, _id_value, value.reference);
+  set value($U value) => jni.Jni.env
+      .SetObjectField(reference.pointer, _id_value, value.reference.pointer);
 
   static final _id_new0 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"<init>",
       r"(Lcom/github/dart_lang/jnigen/generics/GrandParent$Parent;Ljava/lang/Object;)V");
 
@@ -1142,8 +1184,8 @@
         T,
         S,
         U,
-        jni.Jni.accessors.newObjectWithArgs(_class.reference, _id_new0,
-            [$parent.reference, newValue.reference]).object);
+        jni.Jni.accessors.newObjectWithArgs(_class.reference.pointer, _id_new0,
+            [$parent.reference.pointer, newValue.reference.pointer]).object);
   }
 }
 
@@ -1218,7 +1260,7 @@
   }
 
   static final _id_parentValue = jni.Jni.accessors.getFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"parentValue",
     r"Ljava/lang/Object;",
   );
@@ -1226,16 +1268,16 @@
   /// from: public T parentValue
   /// The returned object must be released after use, by calling the [release] method.
   $T get parentValue => T.fromRef(jni.Jni.accessors
-      .getField(reference, _id_parentValue, jni.JniCallType.objectType)
+      .getField(reference.pointer, _id_parentValue, jni.JniCallType.objectType)
       .object);
 
   /// from: public T parentValue
   /// The returned object must be released after use, by calling the [release] method.
-  set parentValue($T value) =>
-      jni.Jni.env.SetObjectField(reference, _id_parentValue, value.reference);
+  set parentValue($T value) => jni.Jni.env.SetObjectField(
+      reference.pointer, _id_parentValue, value.reference.pointer);
 
   static final _id_value = jni.Jni.accessors.getFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"value",
     r"Ljava/lang/Object;",
   );
@@ -1243,16 +1285,16 @@
   /// from: public S value
   /// The returned object must be released after use, by calling the [release] method.
   $S get value => S.fromRef(jni.Jni.accessors
-      .getField(reference, _id_value, jni.JniCallType.objectType)
+      .getField(reference.pointer, _id_value, jni.JniCallType.objectType)
       .object);
 
   /// from: public S value
   /// The returned object must be released after use, by calling the [release] method.
-  set value($S value) =>
-      jni.Jni.env.SetObjectField(reference, _id_value, value.reference);
+  set value($S value) => jni.Jni.env
+      .SetObjectField(reference.pointer, _id_value, value.reference.pointer);
 
   static final _id_new0 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"<init>",
       r"(Lcom/github/dart_lang/jnigen/generics/GrandParent;Ljava/lang/Object;)V");
 
@@ -1273,8 +1315,8 @@
     return GrandParent_Parent.fromRef(
         T,
         S,
-        jni.Jni.accessors.newObjectWithArgs(_class.reference, _id_new0,
-            [$parent.reference, newValue.reference]).object);
+        jni.Jni.accessors.newObjectWithArgs(_class.reference.pointer, _id_new0,
+            [$parent.reference.pointer, newValue.reference.pointer]).object);
   }
 }
 
@@ -1346,7 +1388,7 @@
   }
 
   static final _id_parentValue = jni.Jni.accessors.getFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"parentValue",
     r"Ljava/lang/Object;",
   );
@@ -1354,16 +1396,16 @@
   /// from: public S parentValue
   /// The returned object must be released after use, by calling the [release] method.
   $S get parentValue => S.fromRef(jni.Jni.accessors
-      .getField(reference, _id_parentValue, jni.JniCallType.objectType)
+      .getField(reference.pointer, _id_parentValue, jni.JniCallType.objectType)
       .object);
 
   /// from: public S parentValue
   /// The returned object must be released after use, by calling the [release] method.
-  set parentValue($S value) =>
-      jni.Jni.env.SetObjectField(reference, _id_parentValue, value.reference);
+  set parentValue($S value) => jni.Jni.env.SetObjectField(
+      reference.pointer, _id_parentValue, value.reference.pointer);
 
   static final _id_value = jni.Jni.accessors.getFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"value",
     r"Ljava/lang/Object;",
   );
@@ -1371,16 +1413,16 @@
   /// from: public U value
   /// The returned object must be released after use, by calling the [release] method.
   $U get value => U.fromRef(jni.Jni.accessors
-      .getField(reference, _id_value, jni.JniCallType.objectType)
+      .getField(reference.pointer, _id_value, jni.JniCallType.objectType)
       .object);
 
   /// from: public U value
   /// The returned object must be released after use, by calling the [release] method.
-  set value($U value) =>
-      jni.Jni.env.SetObjectField(reference, _id_value, value.reference);
+  set value($U value) => jni.Jni.env
+      .SetObjectField(reference.pointer, _id_value, value.reference.pointer);
 
   static final _id_new0 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"<init>",
       r"(Lcom/github/dart_lang/jnigen/generics/GrandParent$StaticParent;Ljava/lang/Object;Ljava/lang/Object;)V");
 
@@ -1403,10 +1445,11 @@
     return GrandParent_StaticParent_Child.fromRef(
         S,
         U,
-        jni.Jni.accessors.newObjectWithArgs(_class.reference, _id_new0, [
-          $parent.reference,
-          parentValue.reference,
-          value.reference
+        jni.Jni.accessors
+            .newObjectWithArgs(_class.reference.pointer, _id_new0, [
+          $parent.reference.pointer,
+          parentValue.reference.pointer,
+          value.reference.pointer
         ]).object);
   }
 }
@@ -1473,7 +1516,7 @@
   }
 
   static final _id_value = jni.Jni.accessors.getFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"value",
     r"Ljava/lang/Object;",
   );
@@ -1481,16 +1524,16 @@
   /// from: public S value
   /// The returned object must be released after use, by calling the [release] method.
   $S get value => S.fromRef(jni.Jni.accessors
-      .getField(reference, _id_value, jni.JniCallType.objectType)
+      .getField(reference.pointer, _id_value, jni.JniCallType.objectType)
       .object);
 
   /// from: public S value
   /// The returned object must be released after use, by calling the [release] method.
-  set value($S value) =>
-      jni.Jni.env.SetObjectField(reference, _id_value, value.reference);
+  set value($S value) => jni.Jni.env
+      .SetObjectField(reference.pointer, _id_value, value.reference.pointer);
 
-  static final _id_new0 = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"<init>", r"(Ljava/lang/Object;)V");
+  static final _id_new0 = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"<init>", r"(Ljava/lang/Object;)V");
 
   /// from: public void <init>(S value)
   /// The returned object must be released after use, by calling the [release] method.
@@ -1503,8 +1546,8 @@
     ]) as jni.JObjType<$S>;
     return GrandParent_StaticParent.fromRef(
         S,
-        jni.Jni.accessors.newObjectWithArgs(
-            _class.reference, _id_new0, [value.reference]).object);
+        jni.Jni.accessors.newObjectWithArgs(_class.reference.pointer, _id_new0,
+            [value.reference.pointer]).object);
   }
 }
 
@@ -1566,7 +1609,7 @@
   }
 
   static final _id_value = jni.Jni.accessors.getFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"value",
     r"Ljava/lang/Object;",
   );
@@ -1574,16 +1617,16 @@
   /// from: public T value
   /// The returned object must be released after use, by calling the [release] method.
   $T get value => T.fromRef(jni.Jni.accessors
-      .getField(reference, _id_value, jni.JniCallType.objectType)
+      .getField(reference.pointer, _id_value, jni.JniCallType.objectType)
       .object);
 
   /// from: public T value
   /// The returned object must be released after use, by calling the [release] method.
-  set value($T value) =>
-      jni.Jni.env.SetObjectField(reference, _id_value, value.reference);
+  set value($T value) => jni.Jni.env
+      .SetObjectField(reference.pointer, _id_value, value.reference.pointer);
 
-  static final _id_new0 = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"<init>", r"(Ljava/lang/Object;)V");
+  static final _id_new0 = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"<init>", r"(Ljava/lang/Object;)V");
 
   /// from: public void <init>(T value)
   /// The returned object must be released after use, by calling the [release] method.
@@ -1596,12 +1639,12 @@
     ]) as jni.JObjType<$T>;
     return GrandParent.fromRef(
         T,
-        jni.Jni.accessors.newObjectWithArgs(
-            _class.reference, _id_new0, [value.reference]).object);
+        jni.Jni.accessors.newObjectWithArgs(_class.reference.pointer, _id_new0,
+            [value.reference.pointer]).object);
   }
 
   static final _id_stringParent = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"stringParent",
       r"()Lcom/github/dart_lang/jnigen/generics/GrandParent$Parent;");
 
@@ -1609,12 +1652,12 @@
   /// The returned object must be released after use, by calling the [release] method.
   GrandParent_Parent<jni.JObject, jni.JString> stringParent() {
     return const $GrandParent_ParentType(jni.JObjectType(), jni.JStringType())
-        .fromRef(jni.Jni.accessors.callMethodWithArgs(reference,
+        .fromRef(jni.Jni.accessors.callMethodWithArgs(reference.pointer,
             _id_stringParent, jni.JniCallType.objectType, []).object);
   }
 
   static final _id_varParent = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"varParent",
       r"(Ljava/lang/Object;)Lcom/github/dart_lang/jnigen/generics/GrandParent$Parent;");
 
@@ -1628,12 +1671,15 @@
       nestedValue.$type,
     ]) as jni.JObjType<$S>;
     return $GrandParent_ParentType(const jni.JObjectType(), S).fromRef(
-        jni.Jni.accessors.callMethodWithArgs(reference, _id_varParent,
-            jni.JniCallType.objectType, [nestedValue.reference]).object);
+        jni.Jni.accessors.callMethodWithArgs(
+            reference.pointer,
+            _id_varParent,
+            jni.JniCallType.objectType,
+            [nestedValue.reference.pointer]).object);
   }
 
   static final _id_stringStaticParent = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"stringStaticParent",
       r"()Lcom/github/dart_lang/jnigen/generics/GrandParent$StaticParent;");
 
@@ -1641,12 +1687,12 @@
   /// The returned object must be released after use, by calling the [release] method.
   static GrandParent_StaticParent<jni.JString> stringStaticParent() {
     return const $GrandParent_StaticParentType(jni.JStringType()).fromRef(
-        jni.Jni.accessors.callStaticMethodWithArgs(_class.reference,
+        jni.Jni.accessors.callStaticMethodWithArgs(_class.reference.pointer,
             _id_stringStaticParent, jni.JniCallType.objectType, []).object);
   }
 
   static final _id_varStaticParent = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"varStaticParent",
       r"(Ljava/lang/Object;)Lcom/github/dart_lang/jnigen/generics/GrandParent$StaticParent;");
 
@@ -1660,12 +1706,12 @@
       value.$type,
     ]) as jni.JObjType<$S>;
     return $GrandParent_StaticParentType(S).fromRef(jni.Jni.accessors
-        .callStaticMethodWithArgs(_class.reference, _id_varStaticParent,
-            jni.JniCallType.objectType, [value.reference]).object);
+        .callStaticMethodWithArgs(_class.reference.pointer, _id_varStaticParent,
+            jni.JniCallType.objectType, [value.reference.pointer]).object);
   }
 
   static final _id_staticParentWithSameType = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"staticParentWithSameType",
       r"()Lcom/github/dart_lang/jnigen/generics/GrandParent$StaticParent;");
 
@@ -1673,7 +1719,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   GrandParent_StaticParent<$T> staticParentWithSameType() {
     return $GrandParent_StaticParentType(T).fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_staticParentWithSameType,
+        .callMethodWithArgs(reference.pointer, _id_staticParentWithSameType,
             jni.JniCallType.objectType, []).object);
   }
 }
@@ -1740,7 +1786,7 @@
   }
 
   static final _id_key = jni.Jni.accessors.getFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"key",
     r"Ljava/lang/Object;",
   );
@@ -1748,16 +1794,16 @@
   /// from: public K key
   /// The returned object must be released after use, by calling the [release] method.
   $K get key => K.fromRef(jni.Jni.accessors
-      .getField(reference, _id_key, jni.JniCallType.objectType)
+      .getField(reference.pointer, _id_key, jni.JniCallType.objectType)
       .object);
 
   /// from: public K key
   /// The returned object must be released after use, by calling the [release] method.
-  set key($K value) =>
-      jni.Jni.env.SetObjectField(reference, _id_key, value.reference);
+  set key($K value) => jni.Jni.env
+      .SetObjectField(reference.pointer, _id_key, value.reference.pointer);
 
   static final _id_value = jni.Jni.accessors.getFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"value",
     r"Ljava/lang/Object;",
   );
@@ -1765,16 +1811,16 @@
   /// from: public V value
   /// The returned object must be released after use, by calling the [release] method.
   $V get value => V.fromRef(jni.Jni.accessors
-      .getField(reference, _id_value, jni.JniCallType.objectType)
+      .getField(reference.pointer, _id_value, jni.JniCallType.objectType)
       .object);
 
   /// from: public V value
   /// The returned object must be released after use, by calling the [release] method.
-  set value($V value) =>
-      jni.Jni.env.SetObjectField(reference, _id_value, value.reference);
+  set value($V value) => jni.Jni.env
+      .SetObjectField(reference.pointer, _id_value, value.reference.pointer);
 
   static final _id_new0 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"<init>",
       r"(Lcom/github/dart_lang/jnigen/generics/MyMap;Ljava/lang/Object;Ljava/lang/Object;)V");
 
@@ -1798,8 +1844,12 @@
     return MyMap_MyEntry.fromRef(
         K,
         V,
-        jni.Jni.accessors.newObjectWithArgs(_class.reference, _id_new0,
-            [$parent.reference, key.reference, value.reference]).object);
+        jni.Jni.accessors.newObjectWithArgs(
+            _class.reference.pointer, _id_new0, [
+          $parent.reference.pointer,
+          key.reference.pointer,
+          value.reference.pointer
+        ]).object);
   }
 }
 
@@ -1869,8 +1919,8 @@
     );
   }
 
-  static final _id_new0 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"()V");
+  static final _id_new0 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"()V");
 
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1882,23 +1932,27 @@
         K,
         V,
         jni.Jni.accessors
-            .newObjectWithArgs(_class.reference, _id_new0, []).object);
+            .newObjectWithArgs(_class.reference.pointer, _id_new0, []).object);
   }
 
   static final _id_get0 = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"get", r"(Ljava/lang/Object;)Ljava/lang/Object;");
+      _class.reference.pointer,
+      r"get",
+      r"(Ljava/lang/Object;)Ljava/lang/Object;");
 
   /// from: public V get(K key)
   /// The returned object must be released after use, by calling the [release] method.
   $V get0(
     $K key,
   ) {
-    return V.fromRef(jni.Jni.accessors.callMethodWithArgs(reference, _id_get0,
-        jni.JniCallType.objectType, [key.reference]).object);
+    return V.fromRef(jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_get0, jni.JniCallType.objectType, [key.reference.pointer]).object);
   }
 
-  static final _id_put = jni.Jni.accessors.getMethodIDOf(_class.reference,
-      r"put", r"(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
+  static final _id_put = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer,
+      r"put",
+      r"(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
 
   /// from: public V put(K key, V value)
   /// The returned object must be released after use, by calling the [release] method.
@@ -1906,12 +1960,15 @@
     $K key,
     $V value,
   ) {
-    return V.fromRef(jni.Jni.accessors.callMethodWithArgs(reference, _id_put,
-        jni.JniCallType.objectType, [key.reference, value.reference]).object);
+    return V.fromRef(jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_put,
+        jni.JniCallType.objectType,
+        [key.reference.pointer, value.reference.pointer]).object);
   }
 
   static final _id_entryStack = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"entryStack",
       r"()Lcom/github/dart_lang/jnigen/generics/MyStack;");
 
@@ -1920,8 +1977,8 @@
   MyStack<MyMap_MyEntry<jni.JObject, jni.JObject>> entryStack() {
     return const $MyStackType(
             $MyMap_MyEntryType(jni.JObjectType(), jni.JObjectType()))
-        .fromRef(jni.Jni.accessors.callMethodWithArgs(
-            reference, _id_entryStack, jni.JniCallType.objectType, []).object);
+        .fromRef(jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+            _id_entryStack, jni.JniCallType.objectType, []).object);
   }
 }
 
@@ -1983,8 +2040,8 @@
     );
   }
 
-  static final _id_new0 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"()V");
+  static final _id_new0 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"()V");
 
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1994,11 +2051,11 @@
     return MyStack.fromRef(
         T,
         jni.Jni.accessors
-            .newObjectWithArgs(_class.reference, _id_new0, []).object);
+            .newObjectWithArgs(_class.reference.pointer, _id_new0, []).object);
   }
 
   static final _id_fromArray = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"fromArray",
       r"([Ljava/lang/Object;)Lcom/github/dart_lang/jnigen/generics/MyStack;");
 
@@ -2012,14 +2069,16 @@
       ((arr.$type as jni.JArrayType).elementType as jni.JObjType),
     ]) as jni.JObjType<$T>;
     return $MyStackType(T).fromRef(jni.Jni.accessors.callStaticMethodWithArgs(
-        _class.reference,
+        _class.reference.pointer,
         _id_fromArray,
         jni.JniCallType.objectType,
-        [arr.reference]).object);
+        [arr.reference.pointer]).object);
   }
 
   static final _id_fromArrayOfArrayOfGrandParents = jni.Jni.accessors
-      .getStaticMethodIDOf(_class.reference, r"fromArrayOfArrayOfGrandParents",
+      .getStaticMethodIDOf(
+          _class.reference.pointer,
+          r"fromArrayOfArrayOfGrandParents",
           r"([[Lcom/github/dart_lang/jnigen/generics/GrandParent;)Lcom/github/dart_lang/jnigen/generics/MyStack;");
 
   /// from: static public com.github.dart_lang.jnigen.generics.MyStack<S> fromArrayOfArrayOfGrandParents(com.github.dart_lang.jnigen.generics.GrandParent<S>[][] arr)
@@ -2035,14 +2094,16 @@
           .T,
     ]) as jni.JObjType<$S>;
     return $MyStackType(S).fromRef(jni.Jni.accessors.callStaticMethodWithArgs(
-        _class.reference,
+        _class.reference.pointer,
         _id_fromArrayOfArrayOfGrandParents,
         jni.JniCallType.objectType,
-        [arr.reference]).object);
+        [arr.reference.pointer]).object);
   }
 
-  static final _id_of = jni.Jni.accessors.getStaticMethodIDOf(_class.reference,
-      r"of", r"()Lcom/github/dart_lang/jnigen/generics/MyStack;");
+  static final _id_of = jni.Jni.accessors.getStaticMethodIDOf(
+      _class.reference.pointer,
+      r"of",
+      r"()Lcom/github/dart_lang/jnigen/generics/MyStack;");
 
   /// from: static public com.github.dart_lang.jnigen.generics.MyStack<T> of()
   /// The returned object must be released after use, by calling the [release] method.
@@ -2050,11 +2111,13 @@
     required jni.JObjType<$T> T,
   }) {
     return $MyStackType(T).fromRef(jni.Jni.accessors.callStaticMethodWithArgs(
-        _class.reference, _id_of, jni.JniCallType.objectType, []).object);
+        _class.reference.pointer,
+        _id_of,
+        jni.JniCallType.objectType, []).object);
   }
 
   static final _id_of1 = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"of",
       r"(Ljava/lang/Object;)Lcom/github/dart_lang/jnigen/generics/MyStack;");
 
@@ -2068,14 +2131,14 @@
       obj.$type,
     ]) as jni.JObjType<$T>;
     return $MyStackType(T).fromRef(jni.Jni.accessors.callStaticMethodWithArgs(
-        _class.reference,
+        _class.reference.pointer,
         _id_of1,
         jni.JniCallType.objectType,
-        [obj.reference]).object);
+        [obj.reference.pointer]).object);
   }
 
   static final _id_of2 = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"of",
       r"(Ljava/lang/Object;Ljava/lang/Object;)Lcom/github/dart_lang/jnigen/generics/MyStack;");
 
@@ -2091,40 +2154,40 @@
       obj.$type,
     ]) as jni.JObjType<$T>;
     return $MyStackType(T).fromRef(jni.Jni.accessors.callStaticMethodWithArgs(
-        _class.reference,
+        _class.reference.pointer,
         _id_of2,
         jni.JniCallType.objectType,
-        [obj.reference, obj2.reference]).object);
+        [obj.reference.pointer, obj2.reference.pointer]).object);
   }
 
-  static final _id_push = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"push", r"(Ljava/lang/Object;)V");
+  static final _id_push = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"push", r"(Ljava/lang/Object;)V");
 
   /// from: public void push(T item)
   void push(
     $T item,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_push,
-        jni.JniCallType.voidType, [item.reference]).check();
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer, _id_push,
+        jni.JniCallType.voidType, [item.reference.pointer]).check();
   }
 
   static final _id_pop = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"pop", r"()Ljava/lang/Object;");
+      .getMethodIDOf(_class.reference.pointer, r"pop", r"()Ljava/lang/Object;");
 
   /// from: public T pop()
   /// The returned object must be released after use, by calling the [release] method.
   $T pop() {
     return T.fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_pop, jni.JniCallType.objectType, []).object);
+        reference.pointer, _id_pop, jni.JniCallType.objectType, []).object);
   }
 
-  static final _id_size =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"size", r"()I");
+  static final _id_size = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"size", r"()I");
 
   /// from: public int size()
   int size() {
     return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_size, jni.JniCallType.intType, []).integer;
+        reference.pointer, _id_size, jni.JniCallType.intType, []).integer;
   }
 }
 
@@ -2183,8 +2246,8 @@
     );
   }
 
-  static final _id_new0 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"()V");
+  static final _id_new0 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"()V");
 
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
@@ -2194,7 +2257,7 @@
     return StringKeyedMap.fromRef(
         V,
         jni.Jni.accessors
-            .newObjectWithArgs(_class.reference, _id_new0, []).object);
+            .newObjectWithArgs(_class.reference.pointer, _id_new0, []).object);
   }
 }
 
@@ -2245,14 +2308,14 @@
 
   /// The type which includes information such as the signature of this class.
   static const type = $StringStackType();
-  static final _id_new0 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"()V");
+  static final _id_new0 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"()V");
 
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory StringStack() {
     return StringStack.fromRef(jni.Jni.accessors
-        .newObjectWithArgs(_class.reference, _id_new0, []).object);
+        .newObjectWithArgs(_class.reference.pointer, _id_new0, []).object);
   }
 }
 
@@ -2304,8 +2367,8 @@
     );
   }
 
-  static final _id_new0 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"()V");
+  static final _id_new0 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"()V");
 
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
@@ -2315,7 +2378,7 @@
     return StringValuedMap.fromRef(
         K,
         jni.Jni.accessors
-            .newObjectWithArgs(_class.reference, _id_new0, []).object);
+            .newObjectWithArgs(_class.reference.pointer, _id_new0, []).object);
   }
 }
 
@@ -2377,18 +2440,21 @@
   }
 
   static final _id_voidCallback = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"voidCallback", r"(Ljava/lang/String;)V");
+      _class.reference.pointer, r"voidCallback", r"(Ljava/lang/String;)V");
 
   /// from: public abstract void voidCallback(java.lang.String s)
   void voidCallback(
     jni.JString s,
   ) {
-    return jni.Jni.accessors.callMethodWithArgs(reference, _id_voidCallback,
-        jni.JniCallType.voidType, [s.reference]).check();
+    return jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_voidCallback,
+        jni.JniCallType.voidType,
+        [s.reference.pointer]).check();
   }
 
   static final _id_stringCallback = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"stringCallback",
       r"(Ljava/lang/String;)Ljava/lang/String;");
 
@@ -2398,14 +2464,14 @@
     jni.JString s,
   ) {
     return const jni.JStringType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_stringCallback,
         jni.JniCallType.objectType,
-        [s.reference]).object);
+        [s.reference.pointer]).object);
   }
 
   static final _id_varCallback = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"varCallback",
       r"(Ljava/lang/Object;)Ljava/lang/Object;");
 
@@ -2414,12 +2480,15 @@
   $T varCallback(
     $T t,
   ) {
-    return T.fromRef(jni.Jni.accessors.callMethodWithArgs(reference,
-        _id_varCallback, jni.JniCallType.objectType, [t.reference]).object);
+    return T.fromRef(jni.Jni.accessors.callMethodWithArgs(
+        reference.pointer,
+        _id_varCallback,
+        jni.JniCallType.objectType,
+        [t.reference.pointer]).object);
   }
 
   static final _id_manyPrimitives = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"manyPrimitives", r"(IZCD)J");
+      .getMethodIDOf(_class.reference.pointer, r"manyPrimitives", r"(IZCD)J");
 
   /// from: public abstract long manyPrimitives(int a, boolean b, char c, double d)
   int manyPrimitives(
@@ -2429,7 +2498,7 @@
     double d,
   ) {
     return jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_manyPrimitives,
         jni.JniCallType.longType,
         [jni.JValueInt(a), b ? 1 : 0, jni.JValueChar(c), d]).long;
@@ -2477,13 +2546,19 @@
         final $r = _$impls[$p]!.stringCallback(
           $a[0].castTo(const jni.JStringType(), releaseOriginal: true),
         );
-        return ($r as jni.JObject).castTo(const jni.JObjectType()).toPointer();
+        return ($r as jni.JObject)
+            .castTo(const jni.JObjectType())
+            .reference
+            .toPointer();
       }
       if ($d == r"varCallback(Ljava/lang/Object;)Ljava/lang/Object;") {
         final $r = _$impls[$p]!.varCallback(
           $a[0].castTo(_$impls[$p]!.T, releaseOriginal: true),
         );
-        return ($r as jni.JObject).castTo(const jni.JObjectType()).toPointer();
+        return ($r as jni.JObject)
+            .castTo(const jni.JObjectType())
+            .reference
+            .toPointer();
       }
       if ($d == r"manyPrimitives(IZCD)J") {
         final $r = _$impls[$p]!.manyPrimitives(
@@ -2500,7 +2575,7 @@
               .castTo(const jni.JDoubleType(), releaseOriginal: true)
               .doubleValue(releaseOriginal: true),
         );
-        return jni.JLong($r).toPointer();
+        return jni.JLong($r).reference.toPointer();
       }
     } catch (e) {
       return ProtectedJniExtensions.newDartException(e.toString());
@@ -2638,18 +2713,18 @@
 
   /// The type which includes information such as the signature of this class.
   static const type = $MyInterfaceConsumerType();
-  static final _id_new0 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"()V");
+  static final _id_new0 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"()V");
 
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory MyInterfaceConsumer() {
     return MyInterfaceConsumer.fromRef(jni.Jni.accessors
-        .newObjectWithArgs(_class.reference, _id_new0, []).object);
+        .newObjectWithArgs(_class.reference.pointer, _id_new0, []).object);
   }
 
   static final _id_consumeOnAnotherThread = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"consumeOnAnotherThread",
       r"(Lcom/github/dart_lang/jnigen/interfaces/MyInterface;Ljava/lang/String;IZCDLjava/lang/Object;)V");
 
@@ -2668,20 +2743,20 @@
       t.$type,
       (myInterface.$type as $MyInterfaceType).T,
     ]) as jni.JObjType<$T>;
-    return jni.Jni.accessors.callStaticMethodWithArgs(_class.reference,
+    return jni.Jni.accessors.callStaticMethodWithArgs(_class.reference.pointer,
         _id_consumeOnAnotherThread, jni.JniCallType.voidType, [
-      myInterface.reference,
-      s.reference,
+      myInterface.reference.pointer,
+      s.reference.pointer,
       jni.JValueInt(a),
       b ? 1 : 0,
       jni.JValueChar(c),
       d,
-      t.reference
+      t.reference.pointer
     ]).check();
   }
 
   static final _id_consumeOnSameThread = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"consumeOnSameThread",
       r"(Lcom/github/dart_lang/jnigen/interfaces/MyInterface;Ljava/lang/String;IZCDLjava/lang/Object;)V");
 
@@ -2700,15 +2775,15 @@
       t.$type,
       (myInterface.$type as $MyInterfaceType).T,
     ]) as jni.JObjType<$T>;
-    return jni.Jni.accessors.callStaticMethodWithArgs(
-        _class.reference, _id_consumeOnSameThread, jni.JniCallType.voidType, [
-      myInterface.reference,
-      s.reference,
+    return jni.Jni.accessors.callStaticMethodWithArgs(_class.reference.pointer,
+        _id_consumeOnSameThread, jni.JniCallType.voidType, [
+      myInterface.reference.pointer,
+      s.reference.pointer,
       jni.JValueInt(a),
       b ? 1 : 0,
       jni.JValueChar(c),
       d,
-      t.reference
+      t.reference.pointer
     ]).check();
   }
 }
@@ -2755,12 +2830,12 @@
   /// The type which includes information such as the signature of this class.
   static const type = $MyRunnableType();
   static final _id_run =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"run", r"()V");
+      jni.Jni.accessors.getMethodIDOf(_class.reference.pointer, r"run", r"()V");
 
   /// from: public abstract void run()
   void run() {
     return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_run, jni.JniCallType.voidType, []).check();
+        reference.pointer, _id_run, jni.JniCallType.voidType, []).check();
   }
 
   /// Maps a specific port to the implemented interface.
@@ -2892,7 +2967,7 @@
   /// The type which includes information such as the signature of this class.
   static const type = $MyRunnableRunnerType();
   static final _id_error = jni.Jni.accessors.getFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"error",
     r"Ljava/lang/Throwable;",
   );
@@ -2900,16 +2975,18 @@
   /// from: public java.lang.Throwable error
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject get error => const jni.JObjectType().fromRef(jni.Jni.accessors
-      .getField(reference, _id_error, jni.JniCallType.objectType)
+      .getField(reference.pointer, _id_error, jni.JniCallType.objectType)
       .object);
 
   /// from: public java.lang.Throwable error
   /// The returned object must be released after use, by calling the [release] method.
-  set error(jni.JObject value) =>
-      jni.Jni.env.SetObjectField(reference, _id_error, value.reference);
+  set error(jni.JObject value) => jni.Jni.env
+      .SetObjectField(reference.pointer, _id_error, value.reference.pointer);
 
-  static final _id_new0 = jni.Jni.accessors.getMethodIDOf(_class.reference,
-      r"<init>", r"(Lcom/github/dart_lang/jnigen/interfaces/MyRunnable;)V");
+  static final _id_new0 = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer,
+      r"<init>",
+      r"(Lcom/github/dart_lang/jnigen/interfaces/MyRunnable;)V");
 
   /// from: public void <init>(com.github.dart_lang.jnigen.interfaces.MyRunnable runnable)
   /// The returned object must be released after use, by calling the [release] method.
@@ -2917,24 +2994,26 @@
     MyRunnable runnable,
   ) {
     return MyRunnableRunner.fromRef(jni.Jni.accessors.newObjectWithArgs(
-        _class.reference, _id_new0, [runnable.reference]).object);
+        _class.reference.pointer,
+        _id_new0,
+        [runnable.reference.pointer]).object);
   }
 
   static final _id_runOnSameThread = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"runOnSameThread", r"()V");
+      .getMethodIDOf(_class.reference.pointer, r"runOnSameThread", r"()V");
 
   /// from: public void runOnSameThread()
   void runOnSameThread() {
-    return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_runOnSameThread, jni.JniCallType.voidType, []).check();
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
+        _id_runOnSameThread, jni.JniCallType.voidType, []).check();
   }
 
   static final _id_runOnAnotherThread = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"runOnAnotherThread", r"()V");
+      .getMethodIDOf(_class.reference.pointer, r"runOnAnotherThread", r"()V");
 
   /// from: public void runOnAnotherThread()
   void runOnAnotherThread() {
-    return jni.Jni.accessors.callMethodWithArgs(reference,
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
         _id_runOnAnotherThread, jni.JniCallType.voidType, []).check();
   }
 }
@@ -2980,7 +3059,7 @@
   /// The type which includes information such as the signature of this class.
   static const type = $JsonSerializable_CaseType();
   static final _id_values = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"values",
       r"()[Lcom/github/dart_lang/jnigen/annotations/JsonSerializable$Case;");
 
@@ -2988,12 +3067,12 @@
   /// The returned object must be released after use, by calling the [release] method.
   static jni.JArray<JsonSerializable_Case> values() {
     return const jni.JArrayType($JsonSerializable_CaseType()).fromRef(
-        jni.Jni.accessors.callStaticMethodWithArgs(_class.reference, _id_values,
-            jni.JniCallType.objectType, []).object);
+        jni.Jni.accessors.callStaticMethodWithArgs(_class.reference.pointer,
+            _id_values, jni.JniCallType.objectType, []).object);
   }
 
   static final _id_valueOf = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"valueOf",
       r"(Ljava/lang/String;)Lcom/github/dart_lang/jnigen/annotations/JsonSerializable$Case;");
 
@@ -3003,8 +3082,8 @@
     jni.JString name,
   ) {
     return const $JsonSerializable_CaseType().fromRef(jni.Jni.accessors
-        .callStaticMethodWithArgs(_class.reference, _id_valueOf,
-            jni.JniCallType.objectType, [name.reference]).object);
+        .callStaticMethodWithArgs(_class.reference.pointer, _id_valueOf,
+            jni.JniCallType.objectType, [name.reference.pointer]).object);
   }
 }
 
@@ -3051,7 +3130,7 @@
   /// The type which includes information such as the signature of this class.
   static const type = $JsonSerializableType();
   static final _id_value = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"value",
       r"()Lcom/github/dart_lang/jnigen/annotations/JsonSerializable$Case;");
 
@@ -3059,8 +3138,8 @@
   /// The returned object must be released after use, by calling the [release] method.
   JsonSerializable_Case value() {
     return const $JsonSerializable_CaseType().fromRef(jni.Jni.accessors
-        .callMethodWithArgs(
-            reference, _id_value, jni.JniCallType.objectType, []).object);
+        .callMethodWithArgs(reference.pointer, _id_value,
+            jni.JniCallType.objectType, []).object);
   }
 
   /// Maps a specific port to the implemented interface.
@@ -3098,7 +3177,10 @@
       if ($d ==
           r"value()Lcom/github/dart_lang/jnigen/annotations/JsonSerializable$Case;") {
         final $r = _$impls[$p]!.value();
-        return ($r as jni.JObject).castTo(const jni.JObjectType()).toPointer();
+        return ($r as jni.JObject)
+            .castTo(const jni.JObjectType())
+            .reference
+            .toPointer();
       }
     } catch (e) {
       return ProtectedJniExtensions.newDartException(e.toString());
@@ -3193,14 +3275,14 @@
 
   /// The type which includes information such as the signature of this class.
   static const type = $MyDataClassType();
-  static final _id_new0 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"()V");
+  static final _id_new0 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"()V");
 
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory MyDataClass() {
     return MyDataClass.fromRef(jni.Jni.accessors
-        .newObjectWithArgs(_class.reference, _id_new0, []).object);
+        .newObjectWithArgs(_class.reference.pointer, _id_new0, []).object);
   }
 }
 
@@ -3244,7 +3326,7 @@
   /// The type which includes information such as the signature of this class.
   static const type = $ColorType();
   static final _id_values = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"values",
       r"()[Lcom/github/dart_lang/jnigen/simple_package/Color;");
 
@@ -3252,12 +3334,12 @@
   /// The returned object must be released after use, by calling the [release] method.
   static jni.JArray<Color> values() {
     return const jni.JArrayType($ColorType()).fromRef(jni.Jni.accessors
-        .callStaticMethodWithArgs(_class.reference, _id_values,
+        .callStaticMethodWithArgs(_class.reference.pointer, _id_values,
             jni.JniCallType.objectType, []).object);
   }
 
   static final _id_valueOf = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"valueOf",
       r"(Ljava/lang/String;)Lcom/github/dart_lang/jnigen/simple_package/Color;");
 
@@ -3267,8 +3349,8 @@
     jni.JString name,
   ) {
     return const $ColorType().fromRef(jni.Jni.accessors
-        .callStaticMethodWithArgs(_class.reference, _id_valueOf,
-            jni.JniCallType.objectType, [name.reference]).object);
+        .callStaticMethodWithArgs(_class.reference.pointer, _id_valueOf,
+            jni.JniCallType.objectType, [name.reference.pointer]).object);
   }
 }
 
@@ -3310,18 +3392,18 @@
 
   /// The type which includes information such as the signature of this class.
   static const type = $ExceptionsType();
-  static final _id_new0 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"()V");
+  static final _id_new0 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"()V");
 
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory Exceptions() {
     return Exceptions.fromRef(jni.Jni.accessors
-        .newObjectWithArgs(_class.reference, _id_new0, []).object);
+        .newObjectWithArgs(_class.reference.pointer, _id_new0, []).object);
   }
 
-  static final _id_new1 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"(F)V");
+  static final _id_new1 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"(F)V");
 
   /// from: public void <init>(float x)
   /// The returned object must be released after use, by calling the [release] method.
@@ -3329,11 +3411,11 @@
     double x,
   ) {
     return Exceptions.fromRef(jni.Jni.accessors.newObjectWithArgs(
-        _class.reference, _id_new1, [jni.JValueFloat(x)]).object);
+        _class.reference.pointer, _id_new1, [jni.JValueFloat(x)]).object);
   }
 
   static final _id_new2 = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"<init>", r"(IIIIII)V");
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"(IIIIII)V");
 
   /// from: public void <init>(int a, int b, int c, int d, int e, int f)
   /// The returned object must be released after use, by calling the [release] method.
@@ -3345,8 +3427,8 @@
     int e,
     int f,
   ) {
-    return Exceptions.fromRef(
-        jni.Jni.accessors.newObjectWithArgs(_class.reference, _id_new2, [
+    return Exceptions.fromRef(jni.Jni.accessors
+        .newObjectWithArgs(_class.reference.pointer, _id_new2, [
       jni.JValueInt(a),
       jni.JValueInt(b),
       jni.JValueInt(c),
@@ -3357,100 +3439,104 @@
   }
 
   static final _id_staticObjectMethod = jni.Jni.accessors.getStaticMethodIDOf(
-      _class.reference, r"staticObjectMethod", r"()Ljava/lang/Object;");
+      _class.reference.pointer, r"staticObjectMethod", r"()Ljava/lang/Object;");
 
   /// from: static public java.lang.Object staticObjectMethod()
   /// The returned object must be released after use, by calling the [release] method.
   static jni.JObject staticObjectMethod() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors
-        .callStaticMethodWithArgs(_class.reference, _id_staticObjectMethod,
-            jni.JniCallType.objectType, []).object);
+        .callStaticMethodWithArgs(_class.reference.pointer,
+            _id_staticObjectMethod, jni.JniCallType.objectType, []).object);
   }
 
-  static final _id_staticIntMethod = jni.Jni.accessors
-      .getStaticMethodIDOf(_class.reference, r"staticIntMethod", r"()I");
+  static final _id_staticIntMethod = jni.Jni.accessors.getStaticMethodIDOf(
+      _class.reference.pointer, r"staticIntMethod", r"()I");
 
   /// from: static public int staticIntMethod()
   static int staticIntMethod() {
-    return jni.Jni.accessors.callStaticMethodWithArgs(_class.reference,
+    return jni.Jni.accessors.callStaticMethodWithArgs(_class.reference.pointer,
         _id_staticIntMethod, jni.JniCallType.intType, []).integer;
   }
 
   static final _id_staticObjectArrayMethod = jni.Jni.accessors
-      .getStaticMethodIDOf(_class.reference, r"staticObjectArrayMethod",
+      .getStaticMethodIDOf(_class.reference.pointer, r"staticObjectArrayMethod",
           r"()[Ljava/lang/Object;");
 
   /// from: static public java.lang.Object[] staticObjectArrayMethod()
   /// The returned object must be released after use, by calling the [release] method.
   static jni.JArray<jni.JObject> staticObjectArrayMethod() {
     return const jni.JArrayType(jni.JObjectType()).fromRef(jni.Jni.accessors
-        .callStaticMethodWithArgs(_class.reference, _id_staticObjectArrayMethod,
+        .callStaticMethodWithArgs(
+            _class.reference.pointer,
+            _id_staticObjectArrayMethod,
             jni.JniCallType.objectType, []).object);
   }
 
-  static final _id_staticIntArrayMethod = jni.Jni.accessors
-      .getStaticMethodIDOf(_class.reference, r"staticIntArrayMethod", r"()[I");
+  static final _id_staticIntArrayMethod = jni.Jni.accessors.getStaticMethodIDOf(
+      _class.reference.pointer, r"staticIntArrayMethod", r"()[I");
 
   /// from: static public int[] staticIntArrayMethod()
   /// The returned object must be released after use, by calling the [release] method.
   static jni.JArray<jni.jint> staticIntArrayMethod() {
     return const jni.JArrayType(jni.jintType()).fromRef(jni.Jni.accessors
-        .callStaticMethodWithArgs(_class.reference, _id_staticIntArrayMethod,
-            jni.JniCallType.objectType, []).object);
+        .callStaticMethodWithArgs(_class.reference.pointer,
+            _id_staticIntArrayMethod, jni.JniCallType.objectType, []).object);
   }
 
   static final _id_objectMethod = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"objectMethod", r"()Ljava/lang/Object;");
+      _class.reference.pointer, r"objectMethod", r"()Ljava/lang/Object;");
 
   /// from: public java.lang.Object objectMethod()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject objectMethod() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_objectMethod, jni.JniCallType.objectType, []).object);
+        reference.pointer,
+        _id_objectMethod,
+        jni.JniCallType.objectType, []).object);
   }
 
-  static final _id_intMethod =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"intMethod", r"()I");
+  static final _id_intMethod = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"intMethod", r"()I");
 
   /// from: public int intMethod()
   int intMethod() {
     return jni.Jni.accessors.callMethodWithArgs(
-        reference, _id_intMethod, jni.JniCallType.intType, []).integer;
+        reference.pointer, _id_intMethod, jni.JniCallType.intType, []).integer;
   }
 
   static final _id_objectArrayMethod = jni.Jni.accessors.getMethodIDOf(
-      _class.reference, r"objectArrayMethod", r"()[Ljava/lang/Object;");
+      _class.reference.pointer, r"objectArrayMethod", r"()[Ljava/lang/Object;");
 
   /// from: public java.lang.Object[] objectArrayMethod()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JArray<jni.JObject> objectArrayMethod() {
     return const jni.JArrayType(jni.JObjectType()).fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_objectArrayMethod,
+        .callMethodWithArgs(reference.pointer, _id_objectArrayMethod,
             jni.JniCallType.objectType, []).object);
   }
 
   static final _id_intArrayMethod = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"intArrayMethod", r"()[I");
+      .getMethodIDOf(_class.reference.pointer, r"intArrayMethod", r"()[I");
 
   /// from: public int[] intArrayMethod()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JArray<jni.jint> intArrayMethod() {
     return const jni.JArrayType(jni.jintType()).fromRef(jni.Jni.accessors
-        .callMethodWithArgs(reference, _id_intArrayMethod,
+        .callMethodWithArgs(reference.pointer, _id_intArrayMethod,
             jni.JniCallType.objectType, []).object);
   }
 
-  static final _id_throwNullPointerException = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"throwNullPointerException", r"()I");
+  static final _id_throwNullPointerException = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"throwNullPointerException", r"()I");
 
   /// from: public int throwNullPointerException()
   int throwNullPointerException() {
-    return jni.Jni.accessors.callMethodWithArgs(reference,
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
         _id_throwNullPointerException, jni.JniCallType.intType, []).integer;
   }
 
   static final _id_throwFileNotFoundException = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"throwFileNotFoundException",
       r"()Ljava/io/InputStream;");
 
@@ -3458,13 +3544,13 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject throwFileNotFoundException() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_throwFileNotFoundException,
         jni.JniCallType.objectType, []).object);
   }
 
   static final _id_throwClassCastException = jni.Jni.accessors.getMethodIDOf(
-      _class.reference,
+      _class.reference.pointer,
       r"throwClassCastException",
       r"()Ljava/io/FileInputStream;");
 
@@ -3472,35 +3558,35 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject throwClassCastException() {
     return const jni.JObjectType().fromRef(jni.Jni.accessors.callMethodWithArgs(
-        reference,
+        reference.pointer,
         _id_throwClassCastException,
         jni.JniCallType.objectType, []).object);
   }
 
-  static final _id_throwArrayIndexException = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"throwArrayIndexException", r"()I");
+  static final _id_throwArrayIndexException = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"throwArrayIndexException", r"()I");
 
   /// from: public int throwArrayIndexException()
   int throwArrayIndexException() {
-    return jni.Jni.accessors.callMethodWithArgs(reference,
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
         _id_throwArrayIndexException, jni.JniCallType.intType, []).integer;
   }
 
-  static final _id_throwArithmeticException = jni.Jni.accessors
-      .getMethodIDOf(_class.reference, r"throwArithmeticException", r"()I");
+  static final _id_throwArithmeticException = jni.Jni.accessors.getMethodIDOf(
+      _class.reference.pointer, r"throwArithmeticException", r"()I");
 
   /// from: public int throwArithmeticException()
   int throwArithmeticException() {
-    return jni.Jni.accessors.callMethodWithArgs(reference,
+    return jni.Jni.accessors.callMethodWithArgs(reference.pointer,
         _id_throwArithmeticException, jni.JniCallType.intType, []).integer;
   }
 
-  static final _id_throwLoremIpsum = jni.Jni.accessors
-      .getStaticMethodIDOf(_class.reference, r"throwLoremIpsum", r"()V");
+  static final _id_throwLoremIpsum = jni.Jni.accessors.getStaticMethodIDOf(
+      _class.reference.pointer, r"throwLoremIpsum", r"()V");
 
   /// from: static public void throwLoremIpsum()
   static void throwLoremIpsum() {
-    return jni.Jni.accessors.callStaticMethodWithArgs(_class.reference,
+    return jni.Jni.accessors.callStaticMethodWithArgs(_class.reference.pointer,
         _id_throwLoremIpsum, jni.JniCallType.voidType, []).check();
   }
 }
@@ -3545,70 +3631,74 @@
   /// The type which includes information such as the signature of this class.
   static const type = $FieldsType();
   static final _id_amount = jni.Jni.accessors.getStaticFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"amount",
     r"I",
   );
 
   /// from: static public int amount
   static int get amount => jni.Jni.accessors
-      .getStaticField(_class.reference, _id_amount, jni.JniCallType.intType)
+      .getStaticField(
+          _class.reference.pointer, _id_amount, jni.JniCallType.intType)
       .integer;
 
   /// from: static public int amount
-  static set amount(int value) =>
-      jni.Jni.env.SetStaticIntField(_class.reference, _id_amount, value);
+  static set amount(int value) => jni.Jni.env
+      .SetStaticIntField(_class.reference.pointer, _id_amount, value);
 
   static final _id_pi = jni.Jni.accessors.getStaticFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"pi",
     r"D",
   );
 
   /// from: static public double pi
   static double get pi => jni.Jni.accessors
-      .getStaticField(_class.reference, _id_pi, jni.JniCallType.doubleType)
+      .getStaticField(
+          _class.reference.pointer, _id_pi, jni.JniCallType.doubleType)
       .doubleFloat;
 
   /// from: static public double pi
   static set pi(double value) =>
-      jni.Jni.env.SetStaticDoubleField(_class.reference, _id_pi, value);
+      jni.Jni.env.SetStaticDoubleField(_class.reference.pointer, _id_pi, value);
 
   static final _id_asterisk = jni.Jni.accessors.getStaticFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"asterisk",
     r"C",
   );
 
   /// from: static public char asterisk
   static int get asterisk => jni.Jni.accessors
-      .getStaticField(_class.reference, _id_asterisk, jni.JniCallType.charType)
+      .getStaticField(
+          _class.reference.pointer, _id_asterisk, jni.JniCallType.charType)
       .char;
 
   /// from: static public char asterisk
-  static set asterisk(int value) =>
-      jni.Jni.env.SetStaticCharField(_class.reference, _id_asterisk, value);
+  static set asterisk(int value) => jni.Jni.env
+      .SetStaticCharField(_class.reference.pointer, _id_asterisk, value);
 
   static final _id_name = jni.Jni.accessors.getStaticFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"name",
     r"Ljava/lang/String;",
   );
 
   /// from: static public java.lang.String name
   /// The returned object must be released after use, by calling the [release] method.
-  static jni.JString get name => const jni.JStringType().fromRef(jni
-      .Jni.accessors
-      .getStaticField(_class.reference, _id_name, jni.JniCallType.objectType)
-      .object);
+  static jni.JString get name =>
+      const jni.JStringType().fromRef(jni.Jni.accessors
+          .getStaticField(
+              _class.reference.pointer, _id_name, jni.JniCallType.objectType)
+          .object);
 
   /// from: static public java.lang.String name
   /// The returned object must be released after use, by calling the [release] method.
-  static set name(jni.JString value) => jni.Jni.env
-      .SetStaticObjectField(_class.reference, _id_name, value.reference);
+  static set name(jni.JString value) => jni.Jni.env.SetStaticObjectField(
+      _class.reference.pointer, _id_name, value.reference.pointer);
 
   static final _id_i = jni.Jni.accessors.getFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"i",
     r"Ljava/lang/Integer;",
   );
@@ -3616,64 +3706,66 @@
   /// from: public java.lang.Integer i
   /// The returned object must be released after use, by calling the [release] method.
   jni.JInteger get i => const jni.JIntegerType().fromRef(jni.Jni.accessors
-      .getField(reference, _id_i, jni.JniCallType.objectType)
+      .getField(reference.pointer, _id_i, jni.JniCallType.objectType)
       .object);
 
   /// from: public java.lang.Integer i
   /// The returned object must be released after use, by calling the [release] method.
-  set i(jni.JInteger value) =>
-      jni.Jni.env.SetObjectField(reference, _id_i, value.reference);
+  set i(jni.JInteger value) => jni.Jni.env
+      .SetObjectField(reference.pointer, _id_i, value.reference.pointer);
 
   static final _id_trillion = jni.Jni.accessors.getFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"trillion",
     r"J",
   );
 
   /// from: public long trillion
   int get trillion => jni.Jni.accessors
-      .getField(reference, _id_trillion, jni.JniCallType.longType)
+      .getField(reference.pointer, _id_trillion, jni.JniCallType.longType)
       .long;
 
   /// from: public long trillion
   set trillion(int value) =>
-      jni.Jni.env.SetLongField(reference, _id_trillion, value);
+      jni.Jni.env.SetLongField(reference.pointer, _id_trillion, value);
 
   static final _id_isAchillesDead = jni.Jni.accessors.getFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"isAchillesDead",
     r"Z",
   );
 
   /// from: public boolean isAchillesDead
   bool get isAchillesDead => jni.Jni.accessors
-      .getField(reference, _id_isAchillesDead, jni.JniCallType.booleanType)
+      .getField(
+          reference.pointer, _id_isAchillesDead, jni.JniCallType.booleanType)
       .boolean;
 
   /// from: public boolean isAchillesDead
-  set isAchillesDead(bool value) =>
-      jni.Jni.env.SetBooleanField(reference, _id_isAchillesDead, value ? 1 : 0);
+  set isAchillesDead(bool value) => jni.Jni.env
+      .SetBooleanField(reference.pointer, _id_isAchillesDead, value ? 1 : 0);
 
   static final _id_bestFighterInGreece = jni.Jni.accessors.getFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"bestFighterInGreece",
     r"Ljava/lang/String;",
   );
 
   /// from: public java.lang.String bestFighterInGreece
   /// The returned object must be released after use, by calling the [release] method.
-  jni.JString get bestFighterInGreece => const jni.JStringType().fromRef(jni
-      .Jni.accessors
-      .getField(reference, _id_bestFighterInGreece, jni.JniCallType.objectType)
-      .object);
+  jni.JString get bestFighterInGreece =>
+      const jni.JStringType().fromRef(jni.Jni.accessors
+          .getField(reference.pointer, _id_bestFighterInGreece,
+              jni.JniCallType.objectType)
+          .object);
 
   /// from: public java.lang.String bestFighterInGreece
   /// The returned object must be released after use, by calling the [release] method.
-  set bestFighterInGreece(jni.JString value) => jni.Jni.env
-      .SetObjectField(reference, _id_bestFighterInGreece, value.reference);
+  set bestFighterInGreece(jni.JString value) => jni.Jni.env.SetObjectField(
+      reference.pointer, _id_bestFighterInGreece, value.reference.pointer);
 
   static final _id_random = jni.Jni.accessors.getFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"random",
     r"Ljava/util/Random;",
   );
@@ -3681,16 +3773,16 @@
   /// from: public java.util.Random random
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject get random => const jni.JObjectType().fromRef(jni.Jni.accessors
-      .getField(reference, _id_random, jni.JniCallType.objectType)
+      .getField(reference.pointer, _id_random, jni.JniCallType.objectType)
       .object);
 
   /// from: public java.util.Random random
   /// The returned object must be released after use, by calling the [release] method.
-  set random(jni.JObject value) =>
-      jni.Jni.env.SetObjectField(reference, _id_random, value.reference);
+  set random(jni.JObject value) => jni.Jni.env
+      .SetObjectField(reference.pointer, _id_random, value.reference.pointer);
 
   static final _id_euroSymbol = jni.Jni.accessors.getStaticFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"euroSymbol",
     r"C",
   );
@@ -3698,21 +3790,21 @@
   /// from: static public char euroSymbol
   static int get euroSymbol => jni.Jni.accessors
       .getStaticField(
-          _class.reference, _id_euroSymbol, jni.JniCallType.charType)
+          _class.reference.pointer, _id_euroSymbol, jni.JniCallType.charType)
       .char;
 
   /// from: static public char euroSymbol
-  static set euroSymbol(int value) =>
-      jni.Jni.env.SetStaticCharField(_class.reference, _id_euroSymbol, value);
+  static set euroSymbol(int value) => jni.Jni.env
+      .SetStaticCharField(_class.reference.pointer, _id_euroSymbol, value);
 
-  static final _id_new0 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"()V");
+  static final _id_new0 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"()V");
 
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory Fields() {
     return Fields.fromRef(jni.Jni.accessors
-        .newObjectWithArgs(_class.reference, _id_new0, []).object);
+        .newObjectWithArgs(_class.reference.pointer, _id_new0, []).object);
   }
 }
 
@@ -3756,47 +3848,47 @@
   /// The type which includes information such as the signature of this class.
   static const type = $Fields_NestedType();
   static final _id_hundred = jni.Jni.accessors.getFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"hundred",
     r"J",
   );
 
   /// from: public long hundred
   int get hundred => jni.Jni.accessors
-      .getField(reference, _id_hundred, jni.JniCallType.longType)
+      .getField(reference.pointer, _id_hundred, jni.JniCallType.longType)
       .long;
 
   /// from: public long hundred
   set hundred(int value) =>
-      jni.Jni.env.SetLongField(reference, _id_hundred, value);
+      jni.Jni.env.SetLongField(reference.pointer, _id_hundred, value);
 
   static final _id_BEST_GOD = jni.Jni.accessors.getStaticFieldIDOf(
-    _class.reference,
+    _class.reference.pointer,
     r"BEST_GOD",
     r"Ljava/lang/String;",
   );
 
   /// from: static public java.lang.String BEST_GOD
   /// The returned object must be released after use, by calling the [release] method.
-  static jni.JString get BEST_GOD =>
-      const jni.JStringType().fromRef(jni.Jni.accessors
-          .getStaticField(
-              _class.reference, _id_BEST_GOD, jni.JniCallType.objectType)
-          .object);
+  static jni.JString get BEST_GOD => const jni.JStringType().fromRef(jni
+      .Jni.accessors
+      .getStaticField(
+          _class.reference.pointer, _id_BEST_GOD, jni.JniCallType.objectType)
+      .object);
 
   /// from: static public java.lang.String BEST_GOD
   /// The returned object must be released after use, by calling the [release] method.
-  static set BEST_GOD(jni.JString value) => jni.Jni.env
-      .SetStaticObjectField(_class.reference, _id_BEST_GOD, value.reference);
+  static set BEST_GOD(jni.JString value) => jni.Jni.env.SetStaticObjectField(
+      _class.reference.pointer, _id_BEST_GOD, value.reference.pointer);
 
-  static final _id_new0 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"()V");
+  static final _id_new0 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"()V");
 
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory Fields_Nested() {
     return Fields_Nested.fromRef(jni.Jni.accessors
-        .newObjectWithArgs(_class.reference, _id_new0, []).object);
+        .newObjectWithArgs(_class.reference.pointer, _id_new0, []).object);
   }
 }
 
@@ -3856,8 +3948,8 @@
     );
   }
 
-  static final _id_new0 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"()V");
+  static final _id_new0 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"()V");
 
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
@@ -3869,7 +3961,7 @@
         S,
         K,
         jni.Jni.accessors
-            .newObjectWithArgs(_class.reference, _id_new0, []).object);
+            .newObjectWithArgs(_class.reference.pointer, _id_new0, []).object);
   }
 }
 
@@ -3923,14 +4015,14 @@
 
   /// The type which includes information such as the signature of this class.
   static const type = $StringMapType();
-  static final _id_new0 =
-      jni.Jni.accessors.getMethodIDOf(_class.reference, r"<init>", r"()V");
+  static final _id_new0 = jni.Jni.accessors
+      .getMethodIDOf(_class.reference.pointer, r"<init>", r"()V");
 
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory StringMap() {
     return StringMap.fromRef(jni.Jni.accessors
-        .newObjectWithArgs(_class.reference, _id_new0, []).object);
+        .newObjectWithArgs(_class.reference.pointer, _id_new0, []).object);
   }
 }
 
diff --git a/pkgs/jnigen/test/simple_package_test/runtime_test_registrant.dart b/pkgs/jnigen/test/simple_package_test/runtime_test_registrant.dart
index 3997584..629d95a 100644
--- a/pkgs/jnigen/test/simple_package_test/runtime_test_registrant.dart
+++ b/pkgs/jnigen/test/simple_package_test/runtime_test_registrant.dart
@@ -655,7 +655,7 @@
             }
             expect(
               Jni.env.IsInstanceOf(
-                runner.error.reference,
+                runner.error.reference.pointer,
                 Jni.findClass('java/lang/reflect/UndeclaredThrowableException'),
               ),
               isTrue,
@@ -664,7 +664,7 @@
                 'getCause', '()Ljava/lang/Throwable;', []);
             expect(
               Jni.env.IsInstanceOf(
-                cause.reference,
+                cause.reference.pointer,
                 Jni.findClass(
                     'com/github/dart_lang/jni/PortProxy\$DartException'),
               ),
