diff --git a/pkgs/jni/example/pubspec.lock b/pkgs/jni/example/pubspec.lock
index 4b65490..de0c5c2 100644
--- a/pkgs/jni/example/pubspec.lock
+++ b/pkgs/jni/example/pubspec.lock
@@ -200,7 +200,7 @@
       path: ".."
       relative: true
     source: path
-    version: "0.8.0-wip"
+    version: "0.8.0"
   js:
     dependency: transitive
     description:
diff --git a/pkgs/jni/ffigen.yaml b/pkgs/jni/ffigen.yaml
index 0914b40..884fdad 100644
--- a/pkgs/jni/ffigen.yaml
+++ b/pkgs/jni/ffigen.yaml
@@ -34,6 +34,10 @@
     - 'GetJniContextPtr'
     - 'setJniGetters'
     - 'jni_log'
+    # Exclude functions with VarArgs, jnigen will generate them based on the 
+    # exact arguments needed.
+    - 'globalEnv_NewObject'
+    - 'globalEnv_Call(Static|Nonvirtual|)[A-Z][a-z]+Method'
     # Inline functions
     # keep-sorted start
     - 'acquire_lock'
diff --git a/pkgs/jni/lib/src/jni.dart b/pkgs/jni/lib/src/jni.dart
index 4322fbd..e0a1fe7 100644
--- a/pkgs/jni/lib/src/jni.dart
+++ b/pkgs/jni/lib/src/jni.dart
@@ -300,6 +300,9 @@
     Jni._ensureInitialized();
     Jni._bindings.deleteFinalizableHandle(finalizableHandle, object);
   }
+
+  static Pointer<T> Function<T extends NativeType>(String) get lookup =>
+      Jni._dylib.lookup;
 }
 
 extension AdditionalEnvMethods on GlobalJniEnv {
diff --git a/pkgs/jni/src/third_party/global_jni_env.c b/pkgs/jni/src/third_party/global_jni_env.c
index 7ddc164..4718fa2 100644
--- a/pkgs/jni/src/third_party/global_jni_env.c
+++ b/pkgs/jni/src/third_party/global_jni_env.c
@@ -272,9 +272,14 @@
   return (JniResult){.value = {.l = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_NewObject(jclass clazz, jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult globalEnv_NewObject(jclass clazz,
+                                                jmethodID methodID,
+                                                ...) {
   attach_thread();
-  jobject _result = (*jniEnv)->NewObject(jniEnv, clazz, methodID);
+  va_list args;
+  va_start(args, methodID);
+  jobject _result = (*jniEnv)->NewObjectV(jniEnv, clazz, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -325,9 +330,14 @@
   return (JniPointerResult){.value = _result, .exception = NULL};
 }
 
-JniResult globalEnv_CallObjectMethod(jobject obj, jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallObjectMethod(jobject obj,
+                                                       jmethodID methodID,
+                                                       ...) {
   attach_thread();
-  jobject _result = (*jniEnv)->CallObjectMethod(jniEnv, obj, methodID);
+  va_list args;
+  va_start(args, methodID);
+  jobject _result = (*jniEnv)->CallObjectMethodV(jniEnv, obj, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -349,9 +359,14 @@
   return (JniResult){.value = {.l = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_CallBooleanMethod(jobject obj, jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallBooleanMethod(jobject obj,
+                                                        jmethodID methodID,
+                                                        ...) {
   attach_thread();
-  jboolean _result = (*jniEnv)->CallBooleanMethod(jniEnv, obj, methodID);
+  va_list args;
+  va_start(args, methodID);
+  jboolean _result = (*jniEnv)->CallBooleanMethodV(jniEnv, obj, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -371,9 +386,14 @@
   return (JniResult){.value = {.z = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_CallByteMethod(jobject obj, jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallByteMethod(jobject obj,
+                                                     jmethodID methodID,
+                                                     ...) {
   attach_thread();
-  jbyte _result = (*jniEnv)->CallByteMethod(jniEnv, obj, methodID);
+  va_list args;
+  va_start(args, methodID);
+  jbyte _result = (*jniEnv)->CallByteMethodV(jniEnv, obj, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -393,9 +413,14 @@
   return (JniResult){.value = {.b = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_CallCharMethod(jobject obj, jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallCharMethod(jobject obj,
+                                                     jmethodID methodID,
+                                                     ...) {
   attach_thread();
-  jchar _result = (*jniEnv)->CallCharMethod(jniEnv, obj, methodID);
+  va_list args;
+  va_start(args, methodID);
+  jchar _result = (*jniEnv)->CallCharMethodV(jniEnv, obj, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -415,9 +440,14 @@
   return (JniResult){.value = {.c = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_CallShortMethod(jobject obj, jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallShortMethod(jobject obj,
+                                                      jmethodID methodID,
+                                                      ...) {
   attach_thread();
-  jshort _result = (*jniEnv)->CallShortMethod(jniEnv, obj, methodID);
+  va_list args;
+  va_start(args, methodID);
+  jshort _result = (*jniEnv)->CallShortMethodV(jniEnv, obj, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -437,9 +467,14 @@
   return (JniResult){.value = {.s = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_CallIntMethod(jobject obj, jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallIntMethod(jobject obj,
+                                                    jmethodID methodID,
+                                                    ...) {
   attach_thread();
-  jint _result = (*jniEnv)->CallIntMethod(jniEnv, obj, methodID);
+  va_list args;
+  va_start(args, methodID);
+  jint _result = (*jniEnv)->CallIntMethodV(jniEnv, obj, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -459,9 +494,14 @@
   return (JniResult){.value = {.i = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_CallLongMethod(jobject obj, jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallLongMethod(jobject obj,
+                                                     jmethodID methodID,
+                                                     ...) {
   attach_thread();
-  jlong _result = (*jniEnv)->CallLongMethod(jniEnv, obj, methodID);
+  va_list args;
+  va_start(args, methodID);
+  jlong _result = (*jniEnv)->CallLongMethodV(jniEnv, obj, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -481,9 +521,14 @@
   return (JniResult){.value = {.j = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_CallFloatMethod(jobject obj, jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallFloatMethod(jobject obj,
+                                                      jmethodID methodID,
+                                                      ...) {
   attach_thread();
-  jfloat _result = (*jniEnv)->CallFloatMethod(jniEnv, obj, methodID);
+  va_list args;
+  va_start(args, methodID);
+  jfloat _result = (*jniEnv)->CallFloatMethodV(jniEnv, obj, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -503,9 +548,14 @@
   return (JniResult){.value = {.f = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_CallDoubleMethod(jobject obj, jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallDoubleMethod(jobject obj,
+                                                       jmethodID methodID,
+                                                       ...) {
   attach_thread();
-  jdouble _result = (*jniEnv)->CallDoubleMethod(jniEnv, obj, methodID);
+  va_list args;
+  va_start(args, methodID);
+  jdouble _result = (*jniEnv)->CallDoubleMethodV(jniEnv, obj, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -525,9 +575,14 @@
   return (JniResult){.value = {.d = _result}, .exception = NULL};
 }
 
-jthrowable globalEnv_CallVoidMethod(jobject obj, jmethodID methodID) {
+FFI_PLUGIN_EXPORT jthrowable globalEnv_CallVoidMethod(jobject obj,
+                                                      jmethodID methodID,
+                                                      ...) {
   attach_thread();
-  (*jniEnv)->CallVoidMethod(jniEnv, obj, methodID);
+  va_list args;
+  va_start(args, methodID);
+  (*jniEnv)->CallVoidMethodV(jniEnv, obj, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return _exception;
@@ -547,12 +602,17 @@
   return NULL;
 }
 
-JniResult globalEnv_CallNonvirtualObjectMethod(jobject obj,
-                                               jclass clazz,
-                                               jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult
+globalEnv_CallNonvirtualObjectMethod(jobject obj,
+                                     jclass clazz,
+                                     jmethodID methodID,
+                                     ...) {
   attach_thread();
-  jobject _result =
-      (*jniEnv)->CallNonvirtualObjectMethod(jniEnv, obj, clazz, methodID);
+  va_list args;
+  va_start(args, methodID);
+  jobject _result = (*jniEnv)->CallNonvirtualObjectMethodV(jniEnv, obj, clazz,
+                                                           methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -576,12 +636,17 @@
   return (JniResult){.value = {.l = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_CallNonvirtualBooleanMethod(jobject obj,
-                                                jclass clazz,
-                                                jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult
+globalEnv_CallNonvirtualBooleanMethod(jobject obj,
+                                      jclass clazz,
+                                      jmethodID methodID,
+                                      ...) {
   attach_thread();
-  jboolean _result =
-      (*jniEnv)->CallNonvirtualBooleanMethod(jniEnv, obj, clazz, methodID);
+  va_list args;
+  va_start(args, methodID);
+  jboolean _result = (*jniEnv)->CallNonvirtualBooleanMethodV(jniEnv, obj, clazz,
+                                                             methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -603,12 +668,17 @@
   return (JniResult){.value = {.z = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_CallNonvirtualByteMethod(jobject obj,
-                                             jclass clazz,
-                                             jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult
+globalEnv_CallNonvirtualByteMethod(jobject obj,
+                                   jclass clazz,
+                                   jmethodID methodID,
+                                   ...) {
   attach_thread();
+  va_list args;
+  va_start(args, methodID);
   jbyte _result =
-      (*jniEnv)->CallNonvirtualByteMethod(jniEnv, obj, clazz, methodID);
+      (*jniEnv)->CallNonvirtualByteMethodV(jniEnv, obj, clazz, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -630,12 +700,17 @@
   return (JniResult){.value = {.b = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_CallNonvirtualCharMethod(jobject obj,
-                                             jclass clazz,
-                                             jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult
+globalEnv_CallNonvirtualCharMethod(jobject obj,
+                                   jclass clazz,
+                                   jmethodID methodID,
+                                   ...) {
   attach_thread();
+  va_list args;
+  va_start(args, methodID);
   jchar _result =
-      (*jniEnv)->CallNonvirtualCharMethod(jniEnv, obj, clazz, methodID);
+      (*jniEnv)->CallNonvirtualCharMethodV(jniEnv, obj, clazz, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -657,12 +732,17 @@
   return (JniResult){.value = {.c = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_CallNonvirtualShortMethod(jobject obj,
-                                              jclass clazz,
-                                              jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult
+globalEnv_CallNonvirtualShortMethod(jobject obj,
+                                    jclass clazz,
+                                    jmethodID methodID,
+                                    ...) {
   attach_thread();
+  va_list args;
+  va_start(args, methodID);
   jshort _result =
-      (*jniEnv)->CallNonvirtualShortMethod(jniEnv, obj, clazz, methodID);
+      (*jniEnv)->CallNonvirtualShortMethodV(jniEnv, obj, clazz, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -684,12 +764,17 @@
   return (JniResult){.value = {.s = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_CallNonvirtualIntMethod(jobject obj,
-                                            jclass clazz,
-                                            jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult
+globalEnv_CallNonvirtualIntMethod(jobject obj,
+                                  jclass clazz,
+                                  jmethodID methodID,
+                                  ...) {
   attach_thread();
+  va_list args;
+  va_start(args, methodID);
   jint _result =
-      (*jniEnv)->CallNonvirtualIntMethod(jniEnv, obj, clazz, methodID);
+      (*jniEnv)->CallNonvirtualIntMethodV(jniEnv, obj, clazz, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -711,12 +796,17 @@
   return (JniResult){.value = {.i = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_CallNonvirtualLongMethod(jobject obj,
-                                             jclass clazz,
-                                             jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult
+globalEnv_CallNonvirtualLongMethod(jobject obj,
+                                   jclass clazz,
+                                   jmethodID methodID,
+                                   ...) {
   attach_thread();
+  va_list args;
+  va_start(args, methodID);
   jlong _result =
-      (*jniEnv)->CallNonvirtualLongMethod(jniEnv, obj, clazz, methodID);
+      (*jniEnv)->CallNonvirtualLongMethodV(jniEnv, obj, clazz, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -738,12 +828,17 @@
   return (JniResult){.value = {.j = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_CallNonvirtualFloatMethod(jobject obj,
-                                              jclass clazz,
-                                              jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult
+globalEnv_CallNonvirtualFloatMethod(jobject obj,
+                                    jclass clazz,
+                                    jmethodID methodID,
+                                    ...) {
   attach_thread();
+  va_list args;
+  va_start(args, methodID);
   jfloat _result =
-      (*jniEnv)->CallNonvirtualFloatMethod(jniEnv, obj, clazz, methodID);
+      (*jniEnv)->CallNonvirtualFloatMethodV(jniEnv, obj, clazz, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -765,12 +860,17 @@
   return (JniResult){.value = {.f = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_CallNonvirtualDoubleMethod(jobject obj,
-                                               jclass clazz,
-                                               jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult
+globalEnv_CallNonvirtualDoubleMethod(jobject obj,
+                                     jclass clazz,
+                                     jmethodID methodID,
+                                     ...) {
   attach_thread();
-  jdouble _result =
-      (*jniEnv)->CallNonvirtualDoubleMethod(jniEnv, obj, clazz, methodID);
+  va_list args;
+  va_start(args, methodID);
+  jdouble _result = (*jniEnv)->CallNonvirtualDoubleMethodV(jniEnv, obj, clazz,
+                                                           methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -792,11 +892,16 @@
   return (JniResult){.value = {.d = _result}, .exception = NULL};
 }
 
-jthrowable globalEnv_CallNonvirtualVoidMethod(jobject obj,
-                                              jclass clazz,
-                                              jmethodID methodID) {
+FFI_PLUGIN_EXPORT jthrowable
+globalEnv_CallNonvirtualVoidMethod(jobject obj,
+                                   jclass clazz,
+                                   jmethodID methodID,
+                                   ...) {
   attach_thread();
-  (*jniEnv)->CallNonvirtualVoidMethod(jniEnv, obj, clazz, methodID);
+  va_list args;
+  va_start(args, methodID);
+  (*jniEnv)->CallNonvirtualVoidMethodV(jniEnv, obj, clazz, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return _exception;
@@ -1026,9 +1131,15 @@
   return (JniPointerResult){.value = _result, .exception = NULL};
 }
 
-JniResult globalEnv_CallStaticObjectMethod(jclass clazz, jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallStaticObjectMethod(jclass clazz,
+                                                             jmethodID methodID,
+                                                             ...) {
   attach_thread();
-  jobject _result = (*jniEnv)->CallStaticObjectMethod(jniEnv, clazz, methodID);
+  va_list args;
+  va_start(args, methodID);
+  jobject _result =
+      (*jniEnv)->CallStaticObjectMethodV(jniEnv, clazz, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -1051,10 +1162,14 @@
   return (JniResult){.value = {.l = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_CallStaticBooleanMethod(jclass clazz, jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult
+globalEnv_CallStaticBooleanMethod(jclass clazz, jmethodID methodID, ...) {
   attach_thread();
+  va_list args;
+  va_start(args, methodID);
   jboolean _result =
-      (*jniEnv)->CallStaticBooleanMethod(jniEnv, clazz, methodID);
+      (*jniEnv)->CallStaticBooleanMethodV(jniEnv, clazz, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -1075,9 +1190,15 @@
   return (JniResult){.value = {.z = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_CallStaticByteMethod(jclass clazz, jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallStaticByteMethod(jclass clazz,
+                                                           jmethodID methodID,
+                                                           ...) {
   attach_thread();
-  jbyte _result = (*jniEnv)->CallStaticByteMethod(jniEnv, clazz, methodID);
+  va_list args;
+  va_start(args, methodID);
+  jbyte _result =
+      (*jniEnv)->CallStaticByteMethodV(jniEnv, clazz, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -1098,9 +1219,15 @@
   return (JniResult){.value = {.b = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_CallStaticCharMethod(jclass clazz, jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallStaticCharMethod(jclass clazz,
+                                                           jmethodID methodID,
+                                                           ...) {
   attach_thread();
-  jchar _result = (*jniEnv)->CallStaticCharMethod(jniEnv, clazz, methodID);
+  va_list args;
+  va_start(args, methodID);
+  jchar _result =
+      (*jniEnv)->CallStaticCharMethodV(jniEnv, clazz, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -1121,9 +1248,15 @@
   return (JniResult){.value = {.c = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_CallStaticShortMethod(jclass clazz, jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallStaticShortMethod(jclass clazz,
+                                                            jmethodID methodID,
+                                                            ...) {
   attach_thread();
-  jshort _result = (*jniEnv)->CallStaticShortMethod(jniEnv, clazz, methodID);
+  va_list args;
+  va_start(args, methodID);
+  jshort _result =
+      (*jniEnv)->CallStaticShortMethodV(jniEnv, clazz, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -1144,9 +1277,14 @@
   return (JniResult){.value = {.s = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_CallStaticIntMethod(jclass clazz, jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallStaticIntMethod(jclass clazz,
+                                                          jmethodID methodID,
+                                                          ...) {
   attach_thread();
-  jint _result = (*jniEnv)->CallStaticIntMethod(jniEnv, clazz, methodID);
+  va_list args;
+  va_start(args, methodID);
+  jint _result = (*jniEnv)->CallStaticIntMethodV(jniEnv, clazz, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -1166,9 +1304,15 @@
   return (JniResult){.value = {.i = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_CallStaticLongMethod(jclass clazz, jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallStaticLongMethod(jclass clazz,
+                                                           jmethodID methodID,
+                                                           ...) {
   attach_thread();
-  jlong _result = (*jniEnv)->CallStaticLongMethod(jniEnv, clazz, methodID);
+  va_list args;
+  va_start(args, methodID);
+  jlong _result =
+      (*jniEnv)->CallStaticLongMethodV(jniEnv, clazz, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -1189,9 +1333,15 @@
   return (JniResult){.value = {.j = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_CallStaticFloatMethod(jclass clazz, jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallStaticFloatMethod(jclass clazz,
+                                                            jmethodID methodID,
+                                                            ...) {
   attach_thread();
-  jfloat _result = (*jniEnv)->CallStaticFloatMethod(jniEnv, clazz, methodID);
+  va_list args;
+  va_start(args, methodID);
+  jfloat _result =
+      (*jniEnv)->CallStaticFloatMethodV(jniEnv, clazz, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -1212,9 +1362,15 @@
   return (JniResult){.value = {.f = _result}, .exception = NULL};
 }
 
-JniResult globalEnv_CallStaticDoubleMethod(jclass clazz, jmethodID methodID) {
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallStaticDoubleMethod(jclass clazz,
+                                                             jmethodID methodID,
+                                                             ...) {
   attach_thread();
-  jdouble _result = (*jniEnv)->CallStaticDoubleMethod(jniEnv, clazz, methodID);
+  va_list args;
+  va_start(args, methodID);
+  jdouble _result =
+      (*jniEnv)->CallStaticDoubleMethodV(jniEnv, clazz, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return (JniResult){.value = {.j = 0}, .exception = _exception};
@@ -1235,9 +1391,14 @@
   return (JniResult){.value = {.d = _result}, .exception = NULL};
 }
 
-jthrowable globalEnv_CallStaticVoidMethod(jclass clazz, jmethodID methodID) {
+FFI_PLUGIN_EXPORT jthrowable globalEnv_CallStaticVoidMethod(jclass clazz,
+                                                            jmethodID methodID,
+                                                            ...) {
   attach_thread();
-  (*jniEnv)->CallStaticVoidMethod(jniEnv, clazz, methodID);
+  va_list args;
+  va_start(args, methodID);
+  (*jniEnv)->CallStaticVoidMethodV(jniEnv, clazz, methodID, args);
+  va_end(args);
   jthrowable _exception = check_exception();
   if (_exception != NULL) {
     return _exception;
diff --git a/pkgs/jni/src/third_party/global_jni_env.h b/pkgs/jni/src/third_party/global_jni_env.h
index 562b1bf..1423c51 100644
--- a/pkgs/jni/src/third_party/global_jni_env.h
+++ b/pkgs/jni/src/third_party/global_jni_env.h
@@ -65,47 +65,48 @@
   JniResult (*NewLocalRef)(jobject obj);
   JniResult (*EnsureLocalCapacity)(jint capacity);
   JniResult (*AllocObject)(jclass clazz);
-  JniResult (*NewObject)(jclass clazz, jmethodID methodID);
+  JniResult (*NewObject)(jclass clazz, jmethodID methodID, ...);
   JniResult (*NewObjectV)(jclass, jmethodID, void*);
   JniResult (*NewObjectA)(jclass clazz, jmethodID methodID, jvalue* args);
   JniClassLookupResult (*GetObjectClass)(jobject obj);
   JniResult (*IsInstanceOf)(jobject obj, jclass clazz);
   JniPointerResult (*GetMethodID)(jclass clazz, char* name, char* sig);
-  JniResult (*CallObjectMethod)(jobject obj, jmethodID methodID);
+  JniResult (*CallObjectMethod)(jobject obj, jmethodID methodID, ...);
   JniResult (*CallObjectMethodV)(jobject, jmethodID, void*);
   JniResult (*CallObjectMethodA)(jobject obj, jmethodID methodID, jvalue* args);
-  JniResult (*CallBooleanMethod)(jobject obj, jmethodID methodID);
+  JniResult (*CallBooleanMethod)(jobject obj, jmethodID methodID, ...);
   JniResult (*CallBooleanMethodV)(jobject, jmethodID, void*);
   JniResult (*CallBooleanMethodA)(jobject obj,
                                   jmethodID methodId,
                                   jvalue* args);
-  JniResult (*CallByteMethod)(jobject obj, jmethodID methodID);
+  JniResult (*CallByteMethod)(jobject obj, jmethodID methodID, ...);
   JniResult (*CallByteMethodV)(jobject, jmethodID, void*);
   JniResult (*CallByteMethodA)(jobject obj, jmethodID methodID, jvalue* args);
-  JniResult (*CallCharMethod)(jobject obj, jmethodID methodID);
+  JniResult (*CallCharMethod)(jobject obj, jmethodID methodID, ...);
   JniResult (*CallCharMethodV)(jobject, jmethodID, void*);
   JniResult (*CallCharMethodA)(jobject obj, jmethodID methodID, jvalue* args);
-  JniResult (*CallShortMethod)(jobject obj, jmethodID methodID);
+  JniResult (*CallShortMethod)(jobject obj, jmethodID methodID, ...);
   JniResult (*CallShortMethodV)(jobject, jmethodID, void*);
   JniResult (*CallShortMethodA)(jobject obj, jmethodID methodID, jvalue* args);
-  JniResult (*CallIntMethod)(jobject obj, jmethodID methodID);
+  JniResult (*CallIntMethod)(jobject obj, jmethodID methodID, ...);
   JniResult (*CallIntMethodV)(jobject, jmethodID, void*);
   JniResult (*CallIntMethodA)(jobject obj, jmethodID methodID, jvalue* args);
-  JniResult (*CallLongMethod)(jobject obj, jmethodID methodID);
+  JniResult (*CallLongMethod)(jobject obj, jmethodID methodID, ...);
   JniResult (*CallLongMethodV)(jobject, jmethodID, void*);
   JniResult (*CallLongMethodA)(jobject obj, jmethodID methodID, jvalue* args);
-  JniResult (*CallFloatMethod)(jobject obj, jmethodID methodID);
+  JniResult (*CallFloatMethod)(jobject obj, jmethodID methodID, ...);
   JniResult (*CallFloatMethodV)(jobject, jmethodID, void*);
   JniResult (*CallFloatMethodA)(jobject obj, jmethodID methodID, jvalue* args);
-  JniResult (*CallDoubleMethod)(jobject obj, jmethodID methodID);
+  JniResult (*CallDoubleMethod)(jobject obj, jmethodID methodID, ...);
   JniResult (*CallDoubleMethodV)(jobject, jmethodID, void*);
   JniResult (*CallDoubleMethodA)(jobject obj, jmethodID methodID, jvalue* args);
-  jthrowable (*CallVoidMethod)(jobject obj, jmethodID methodID);
+  jthrowable (*CallVoidMethod)(jobject obj, jmethodID methodID, ...);
   jthrowable (*CallVoidMethodV)(jobject, jmethodID, void*);
   jthrowable (*CallVoidMethodA)(jobject obj, jmethodID methodID, jvalue* args);
   JniResult (*CallNonvirtualObjectMethod)(jobject obj,
                                           jclass clazz,
-                                          jmethodID methodID);
+                                          jmethodID methodID,
+                                          ...);
   JniResult (*CallNonvirtualObjectMethodV)(jobject, jclass, jmethodID, void*);
   JniResult (*CallNonvirtualObjectMethodA)(jobject obj,
                                            jclass clazz,
@@ -113,7 +114,8 @@
                                            jvalue* args);
   JniResult (*CallNonvirtualBooleanMethod)(jobject obj,
                                            jclass clazz,
-                                           jmethodID methodID);
+                                           jmethodID methodID,
+                                           ...);
   JniResult (*CallNonvirtualBooleanMethodV)(jobject, jclass, jmethodID, void*);
   JniResult (*CallNonvirtualBooleanMethodA)(jobject obj,
                                             jclass clazz,
@@ -121,7 +123,8 @@
                                             jvalue* args);
   JniResult (*CallNonvirtualByteMethod)(jobject obj,
                                         jclass clazz,
-                                        jmethodID methodID);
+                                        jmethodID methodID,
+                                        ...);
   JniResult (*CallNonvirtualByteMethodV)(jobject, jclass, jmethodID, void*);
   JniResult (*CallNonvirtualByteMethodA)(jobject obj,
                                          jclass clazz,
@@ -129,7 +132,8 @@
                                          jvalue* args);
   JniResult (*CallNonvirtualCharMethod)(jobject obj,
                                         jclass clazz,
-                                        jmethodID methodID);
+                                        jmethodID methodID,
+                                        ...);
   JniResult (*CallNonvirtualCharMethodV)(jobject, jclass, jmethodID, void*);
   JniResult (*CallNonvirtualCharMethodA)(jobject obj,
                                          jclass clazz,
@@ -137,7 +141,8 @@
                                          jvalue* args);
   JniResult (*CallNonvirtualShortMethod)(jobject obj,
                                          jclass clazz,
-                                         jmethodID methodID);
+                                         jmethodID methodID,
+                                         ...);
   JniResult (*CallNonvirtualShortMethodV)(jobject, jclass, jmethodID, void*);
   JniResult (*CallNonvirtualShortMethodA)(jobject obj,
                                           jclass clazz,
@@ -145,7 +150,8 @@
                                           jvalue* args);
   JniResult (*CallNonvirtualIntMethod)(jobject obj,
                                        jclass clazz,
-                                       jmethodID methodID);
+                                       jmethodID methodID,
+                                       ...);
   JniResult (*CallNonvirtualIntMethodV)(jobject, jclass, jmethodID, void*);
   JniResult (*CallNonvirtualIntMethodA)(jobject obj,
                                         jclass clazz,
@@ -153,7 +159,8 @@
                                         jvalue* args);
   JniResult (*CallNonvirtualLongMethod)(jobject obj,
                                         jclass clazz,
-                                        jmethodID methodID);
+                                        jmethodID methodID,
+                                        ...);
   JniResult (*CallNonvirtualLongMethodV)(jobject, jclass, jmethodID, void*);
   JniResult (*CallNonvirtualLongMethodA)(jobject obj,
                                          jclass clazz,
@@ -161,7 +168,8 @@
                                          jvalue* args);
   JniResult (*CallNonvirtualFloatMethod)(jobject obj,
                                          jclass clazz,
-                                         jmethodID methodID);
+                                         jmethodID methodID,
+                                         ...);
   JniResult (*CallNonvirtualFloatMethodV)(jobject, jclass, jmethodID, void*);
   JniResult (*CallNonvirtualFloatMethodA)(jobject obj,
                                           jclass clazz,
@@ -169,7 +177,8 @@
                                           jvalue* args);
   JniResult (*CallNonvirtualDoubleMethod)(jobject obj,
                                           jclass clazz,
-                                          jmethodID methodID);
+                                          jmethodID methodID,
+                                          ...);
   JniResult (*CallNonvirtualDoubleMethodV)(jobject, jclass, jmethodID, void*);
   JniResult (*CallNonvirtualDoubleMethodA)(jobject obj,
                                            jclass clazz,
@@ -177,7 +186,8 @@
                                            jvalue* args);
   jthrowable (*CallNonvirtualVoidMethod)(jobject obj,
                                          jclass clazz,
-                                         jmethodID methodID);
+                                         jmethodID methodID,
+                                         ...);
   jthrowable (*CallNonvirtualVoidMethodV)(jobject, jclass, jmethodID, void*);
   jthrowable (*CallNonvirtualVoidMethodA)(jobject obj,
                                           jclass clazz,
@@ -203,52 +213,52 @@
   jthrowable (*SetFloatField)(jobject obj, jfieldID fieldID, jfloat val);
   jthrowable (*SetDoubleField)(jobject obj, jfieldID fieldID, jdouble val);
   JniPointerResult (*GetStaticMethodID)(jclass clazz, char* name, char* sig);
-  JniResult (*CallStaticObjectMethod)(jclass clazz, jmethodID methodID);
+  JniResult (*CallStaticObjectMethod)(jclass clazz, jmethodID methodID, ...);
   JniResult (*CallStaticObjectMethodV)(jclass, jmethodID, void*);
   JniResult (*CallStaticObjectMethodA)(jclass clazz,
                                        jmethodID methodID,
                                        jvalue* args);
-  JniResult (*CallStaticBooleanMethod)(jclass clazz, jmethodID methodID);
+  JniResult (*CallStaticBooleanMethod)(jclass clazz, jmethodID methodID, ...);
   JniResult (*CallStaticBooleanMethodV)(jclass, jmethodID, void*);
   JniResult (*CallStaticBooleanMethodA)(jclass clazz,
                                         jmethodID methodID,
                                         jvalue* args);
-  JniResult (*CallStaticByteMethod)(jclass clazz, jmethodID methodID);
+  JniResult (*CallStaticByteMethod)(jclass clazz, jmethodID methodID, ...);
   JniResult (*CallStaticByteMethodV)(jclass, jmethodID, void*);
   JniResult (*CallStaticByteMethodA)(jclass clazz,
                                      jmethodID methodID,
                                      jvalue* args);
-  JniResult (*CallStaticCharMethod)(jclass clazz, jmethodID methodID);
+  JniResult (*CallStaticCharMethod)(jclass clazz, jmethodID methodID, ...);
   JniResult (*CallStaticCharMethodV)(jclass, jmethodID, void*);
   JniResult (*CallStaticCharMethodA)(jclass clazz,
                                      jmethodID methodID,
                                      jvalue* args);
-  JniResult (*CallStaticShortMethod)(jclass clazz, jmethodID methodID);
+  JniResult (*CallStaticShortMethod)(jclass clazz, jmethodID methodID, ...);
   JniResult (*CallStaticShortMethodV)(jclass, jmethodID, void*);
   JniResult (*CallStaticShortMethodA)(jclass clazz,
                                       jmethodID methodID,
                                       jvalue* args);
-  JniResult (*CallStaticIntMethod)(jclass clazz, jmethodID methodID);
+  JniResult (*CallStaticIntMethod)(jclass clazz, jmethodID methodID, ...);
   JniResult (*CallStaticIntMethodV)(jclass, jmethodID, void*);
   JniResult (*CallStaticIntMethodA)(jclass clazz,
                                     jmethodID methodID,
                                     jvalue* args);
-  JniResult (*CallStaticLongMethod)(jclass clazz, jmethodID methodID);
+  JniResult (*CallStaticLongMethod)(jclass clazz, jmethodID methodID, ...);
   JniResult (*CallStaticLongMethodV)(jclass, jmethodID, void*);
   JniResult (*CallStaticLongMethodA)(jclass clazz,
                                      jmethodID methodID,
                                      jvalue* args);
-  JniResult (*CallStaticFloatMethod)(jclass clazz, jmethodID methodID);
+  JniResult (*CallStaticFloatMethod)(jclass clazz, jmethodID methodID, ...);
   JniResult (*CallStaticFloatMethodV)(jclass, jmethodID, void*);
   JniResult (*CallStaticFloatMethodA)(jclass clazz,
                                       jmethodID methodID,
                                       jvalue* args);
-  JniResult (*CallStaticDoubleMethod)(jclass clazz, jmethodID methodID);
+  JniResult (*CallStaticDoubleMethod)(jclass clazz, jmethodID methodID, ...);
   JniResult (*CallStaticDoubleMethodV)(jclass, jmethodID, void*);
   JniResult (*CallStaticDoubleMethodA)(jclass clazz,
                                        jmethodID methodID,
                                        jvalue* args);
-  jthrowable (*CallStaticVoidMethod)(jclass clazz, jmethodID methodID);
+  jthrowable (*CallStaticVoidMethod)(jclass clazz, jmethodID methodID, ...);
   jthrowable (*CallStaticVoidMethodV)(jclass, jmethodID, void*);
   jthrowable (*CallStaticVoidMethodA)(jclass clazz,
                                       jmethodID methodID,
@@ -432,3 +442,115 @@
   JniResult (*GetObjectRefType)(jobject obj);
 } GlobalJniEnvStruct;
 FFI_PLUGIN_EXPORT GlobalJniEnvStruct* GetGlobalEnv();
+FFI_PLUGIN_EXPORT JniResult globalEnv_NewObject(jclass clazz,
+                                                jmethodID methodID,
+                                                ...);
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallObjectMethod(jobject obj,
+                                                       jmethodID methodID,
+                                                       ...);
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallBooleanMethod(jobject obj,
+                                                        jmethodID methodID,
+                                                        ...);
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallByteMethod(jobject obj,
+                                                     jmethodID methodID,
+                                                     ...);
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallCharMethod(jobject obj,
+                                                     jmethodID methodID,
+                                                     ...);
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallShortMethod(jobject obj,
+                                                      jmethodID methodID,
+                                                      ...);
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallIntMethod(jobject obj,
+                                                    jmethodID methodID,
+                                                    ...);
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallLongMethod(jobject obj,
+                                                     jmethodID methodID,
+                                                     ...);
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallFloatMethod(jobject obj,
+                                                      jmethodID methodID,
+                                                      ...);
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallDoubleMethod(jobject obj,
+                                                       jmethodID methodID,
+                                                       ...);
+FFI_PLUGIN_EXPORT jthrowable globalEnv_CallVoidMethod(jobject obj,
+                                                      jmethodID methodID,
+                                                      ...);
+FFI_PLUGIN_EXPORT JniResult
+globalEnv_CallNonvirtualObjectMethod(jobject obj,
+                                     jclass clazz,
+                                     jmethodID methodID,
+                                     ...);
+FFI_PLUGIN_EXPORT JniResult
+globalEnv_CallNonvirtualBooleanMethod(jobject obj,
+                                      jclass clazz,
+                                      jmethodID methodID,
+                                      ...);
+FFI_PLUGIN_EXPORT JniResult
+globalEnv_CallNonvirtualByteMethod(jobject obj,
+                                   jclass clazz,
+                                   jmethodID methodID,
+                                   ...);
+FFI_PLUGIN_EXPORT JniResult
+globalEnv_CallNonvirtualCharMethod(jobject obj,
+                                   jclass clazz,
+                                   jmethodID methodID,
+                                   ...);
+FFI_PLUGIN_EXPORT JniResult
+globalEnv_CallNonvirtualShortMethod(jobject obj,
+                                    jclass clazz,
+                                    jmethodID methodID,
+                                    ...);
+FFI_PLUGIN_EXPORT JniResult
+globalEnv_CallNonvirtualIntMethod(jobject obj,
+                                  jclass clazz,
+                                  jmethodID methodID,
+                                  ...);
+FFI_PLUGIN_EXPORT JniResult
+globalEnv_CallNonvirtualLongMethod(jobject obj,
+                                   jclass clazz,
+                                   jmethodID methodID,
+                                   ...);
+FFI_PLUGIN_EXPORT JniResult
+globalEnv_CallNonvirtualFloatMethod(jobject obj,
+                                    jclass clazz,
+                                    jmethodID methodID,
+                                    ...);
+FFI_PLUGIN_EXPORT JniResult
+globalEnv_CallNonvirtualDoubleMethod(jobject obj,
+                                     jclass clazz,
+                                     jmethodID methodID,
+                                     ...);
+FFI_PLUGIN_EXPORT jthrowable
+globalEnv_CallNonvirtualVoidMethod(jobject obj,
+                                   jclass clazz,
+                                   jmethodID methodID,
+                                   ...);
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallStaticObjectMethod(jclass clazz,
+                                                             jmethodID methodID,
+                                                             ...);
+FFI_PLUGIN_EXPORT JniResult
+globalEnv_CallStaticBooleanMethod(jclass clazz, jmethodID methodID, ...);
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallStaticByteMethod(jclass clazz,
+                                                           jmethodID methodID,
+                                                           ...);
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallStaticCharMethod(jclass clazz,
+                                                           jmethodID methodID,
+                                                           ...);
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallStaticShortMethod(jclass clazz,
+                                                            jmethodID methodID,
+                                                            ...);
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallStaticIntMethod(jclass clazz,
+                                                          jmethodID methodID,
+                                                          ...);
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallStaticLongMethod(jclass clazz,
+                                                           jmethodID methodID,
+                                                           ...);
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallStaticFloatMethod(jclass clazz,
+                                                            jmethodID methodID,
+                                                            ...);
+FFI_PLUGIN_EXPORT JniResult globalEnv_CallStaticDoubleMethod(jclass clazz,
+                                                             jmethodID methodID,
+                                                             ...);
+FFI_PLUGIN_EXPORT jthrowable globalEnv_CallStaticVoidMethod(jclass clazz,
+                                                            jmethodID methodID,
+                                                            ...);
diff --git a/pkgs/jni/tool/wrapper_generators/generate_c_extensions.dart b/pkgs/jni/tool/wrapper_generators/generate_c_extensions.dart
index f1e15b2..96abd23 100644
--- a/pkgs/jni/tool/wrapper_generators/generate_c_extensions.dart
+++ b/pkgs/jni/tool/wrapper_generators/generate_c_extensions.dart
@@ -56,6 +56,11 @@
 FFI_PLUGIN_EXPORT $wrapperName* GetGlobalEnv();
 ''';
 
+bool hasVarArgs(String name) {
+  return name == 'NewObject' ||
+      RegExp(r'^Call(Static|Nonvirtual|)[A-Z][a-z]+Method$').hasMatch(name);
+}
+
 /// Get C name of a type from its ffigen representation.
 String getCType(Type type) {
   if (type is PointerType) {
@@ -81,19 +86,24 @@
 }
 
 // Returns declaration of function field in GlobalJniEnv struct
-String getFunctionFieldDecl(
-  Member field,
-) {
+String getFunctionFieldDecl(Member field, {required bool isField}) {
   final fieldType = field.type;
   if (fieldType is PointerType && fieldType.child is NativeFunc) {
     final nativeFunc = fieldType.child as NativeFunc;
     final functionType = getGlobalJniEnvFunctionType(nativeFunc.type);
     final resultWrapper = getResultWrapper(getCType(functionType.returnType));
     final name = field.name;
+    final withVarArgs = hasVarArgs(name);
     final params = functionType.parameters
-        .map((param) => '${getCType(param.type)} ${param.name}')
-        .join(', ');
-    return ('${resultWrapper.returnType} (*$name)($params);');
+            .map((param) => '${getCType(param.type)} ${param.name}')
+            .join(', ') +
+        (withVarArgs ? ', ...' : '');
+    final willExport = withVarArgs ? 'FFI_PLUGIN_EXPORT ' : '';
+    if (isField) {
+      return '${resultWrapper.returnType} (*$name)($params);';
+    }
+    return '$willExport${resultWrapper.returnType} '
+        '${getWrapperFuncName(field)}($params);';
   } else {
     return 'void* ${field.name};';
   }
@@ -222,16 +232,20 @@
     final outerFunctionType = getGlobalJniEnvFunctionType(functionType);
     final wrapperName = getWrapperFuncName(field);
     final returnType = getCType(outerFunctionType.returnType);
-    final params = outerFunctionType.parameters
-        .map((param) => '${getCType(param.type)} ${param.name}')
-        .join(', ');
+    final withVarArgs = hasVarArgs(field.name);
+    final params = [
+      ...outerFunctionType.parameters
+          .map((param) => '${getCType(param.type)} ${param.name}'),
+      if (withVarArgs) '...',
+    ].join(', ');
     var returnCapture = returnType == 'void' ? '' : '$returnType $resultVar =';
     if (constBufferReturningFunctions.contains(field.name)) {
       returnCapture = 'const $returnCapture';
     }
     final callParams = [
       'jniEnv',
-      ...(outerFunctionType.parameters.map((param) => param.name).toList())
+      ...(outerFunctionType.parameters.map((param) => param.name).toList()),
+      if (withVarArgs) 'args',
     ].join(', ');
     final resultWrapper = getResultWrapper(returnType);
 
@@ -239,15 +253,29 @@
     if (isJRefType(returnType) && !refFunctions.contains(field.name)) {
       convertRef = '  $resultVar = to_global_ref($resultVar);\n';
     }
+    final callee = field.name + (withVarArgs ? 'V' : '');
+    final varArgsInit = withVarArgs
+        ? '''
+  va_list args;
+  va_start(args, methodID);
+'''
+        : '';
+    final varArgsEnd = withVarArgs ? 'va_end(args);\n' : '';
     final exceptionCheck = _noCheckException.contains(field.name)
         ? ''
-        : '  jthrowable $errorVar = check_exception();\n'
-            '  if ($errorVar != NULL) {\n'
-            '    return ${resultWrapper.onError};\n'
-            '  }\n';
-    return '${resultWrapper.returnType} $wrapperName($params) {\n'
+        : '''
+  jthrowable $errorVar = check_exception();
+  if ($errorVar != NULL) {
+    return ${resultWrapper.onError};
+  }
+''';
+    final willExport = withVarArgs ? 'FFI_PLUGIN_EXPORT ' : '';
+    return '$willExport'
+        '${resultWrapper.returnType} $wrapperName($params) {\n'
         '  attach_thread();\n'
-        '  $returnCapture (*jniEnv)->${field.name}($callParams);\n'
+        '$varArgsInit'
+        '  $returnCapture (*jniEnv)->$callee($callParams);\n'
+        '$varArgsEnd'
         '$exceptionCheck'
         '$convertRef'
         '  return ${resultWrapper.onResult};\n'
@@ -259,11 +287,20 @@
 void writeGlobalJniEnvWrapper(Library library) {
   final jniEnvType = findCompound(library, envType);
 
-  final fieldDecls = jniEnvType.members.map(getFunctionFieldDecl).join('\n');
+  final fieldDecls = jniEnvType.members
+      .map((member) => getFunctionFieldDecl(member, isField: true))
+      .join('\n');
+  final varArgsFunctions = jniEnvType.members
+      .where((member) => hasVarArgs(member.name))
+      .map((member) => getFunctionFieldDecl(member, isField: false))
+      .join('\n');
   final structDecl =
       'typedef struct $wrapperName {\n$fieldDecls\n} $wrapperName;\n';
-  File.fromUri(Paths.globalJniEnvH).writeAsStringSync(
-      '$preamble$wrapperDeclIncludes$structDecl$wrapperGetterDecl');
+  File.fromUri(Paths.globalJniEnvH).writeAsStringSync('$preamble'
+      '$wrapperDeclIncludes'
+      '$structDecl'
+      '$wrapperGetterDecl'
+      '$varArgsFunctions\n');
 
   final functionWrappers = StringBuffer();
   final structInst = StringBuffer('$wrapperName globalJniEnv = {\n');
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 95fc505..f6933b4 100644
--- a/pkgs/jnigen/example/in_app_java/lib/android_utils.dart
+++ b/pkgs/jnigen/example/in_app_java/lib/android_utils.dart
@@ -369,10 +369,14 @@
   }
 
   static final _getMetadataRepoLoader = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "EmojiCompat_Config__getMetadataRepoLoader")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("EmojiCompat_Config__getMetadataRepoLoader")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: protected final androidx.emoji2.text.EmojiCompat.MetadataRepoLoader getMetadataRepoLoader()
   /// The returned object must be released after use, by calling the [release] method.
@@ -610,10 +614,14 @@
   }
 
   static final _onInitialized = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "EmojiCompat_InitCallback__onInitialized")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("EmojiCompat_InitCallback__onInitialized")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public void onInitialized()
   ///
@@ -1385,10 +1393,14 @@
   }
 
   static final _load = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "EmojiCompat__load")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("EmojiCompat__load")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public void load()
   ///
@@ -1456,10 +1468,14 @@
   }
 
   static final _getLoadState = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "EmojiCompat__getLoadState")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("EmojiCompat__getLoadState")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public int getLoadState()
   ///
@@ -1472,10 +1488,14 @@
   }
 
   static final _isEmojiSpanIndicatorEnabled = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "EmojiCompat__isEmojiSpanIndicatorEnabled")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("EmojiCompat__isEmojiSpanIndicatorEnabled")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean isEmojiSpanIndicatorEnabled()
   ///
@@ -1486,10 +1506,14 @@
   }
 
   static final _getEmojiSpanIndicatorColor = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "EmojiCompat__getEmojiSpanIndicatorColor")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("EmojiCompat__getEmojiSpanIndicatorColor")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public int getEmojiSpanIndicatorColor()
   ///
@@ -1897,10 +1921,14 @@
   }
 
   static final _getAssetSignature = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "EmojiCompat__getAssetSignature")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("EmojiCompat__getAssetSignature")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String getAssetSignature()
   /// The returned object must be released after use, by calling the [release] method.
@@ -2509,10 +2537,14 @@
       _get_PARTITION_NAME_SYSTEM().object(const jni.JStringType());
 
   static final _getName = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Build_Partition__getName")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Build_Partition__getName")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String getName()
   /// The returned object must be released after use, by calling the [release] method.
@@ -2521,10 +2553,14 @@
   }
 
   static final _getFingerprint = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Build_Partition__getFingerprint")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Build_Partition__getFingerprint")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String getFingerprint()
   /// The returned object must be released after use, by calling the [release] method.
@@ -2533,10 +2569,14 @@
   }
 
   static final _getBuildTimeMillis = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Build_Partition__getBuildTimeMillis")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Build_Partition__getBuildTimeMillis")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public long getBuildTimeMillis()
   int getBuildTimeMillis() {
@@ -2559,10 +2599,14 @@
   }
 
   static final _hashCode1 = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Build_Partition__hashCode1")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Build_Partition__hashCode1")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public int hashCode()
   int hashCode1() {
@@ -3336,8 +3380,13 @@
 
   static final _size = jniLookup<
           ffi.NativeFunction<
-              jni.JniResult Function(ffi.Pointer<ffi.Void>)>>("HashMap__size")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("HashMap__size")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public int size()
   int size() {
@@ -3345,10 +3394,14 @@
   }
 
   static final _isEmpty = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "HashMap__isEmpty")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("HashMap__isEmpty")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean isEmpty()
   bool isEmpty() {
@@ -3440,8 +3493,13 @@
 
   static final _clear = jniLookup<
           ffi.NativeFunction<
-              jni.JniResult Function(ffi.Pointer<ffi.Void>)>>("HashMap__clear")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("HashMap__clear")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public void clear()
   void clear() {
@@ -3465,8 +3523,13 @@
 
   static final _keySet = jniLookup<
           ffi.NativeFunction<
-              jni.JniResult Function(ffi.Pointer<ffi.Void>)>>("HashMap__keySet")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("HashMap__keySet")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.util.Set keySet()
   /// The returned object must be released after use, by calling the [release] method.
@@ -3476,8 +3539,13 @@
 
   static final _values = jniLookup<
           ffi.NativeFunction<
-              jni.JniResult Function(ffi.Pointer<ffi.Void>)>>("HashMap__values")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("HashMap__values")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.util.Collection values()
   /// The returned object must be released after use, by calling the [release] method.
@@ -3486,10 +3554,14 @@
   }
 
   static final _entrySet = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "HashMap__entrySet")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("HashMap__entrySet")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.util.Set entrySet()
   /// The returned object must be released after use, by calling the [release] method.
@@ -3721,8 +3793,13 @@
 
   static final _clone = jniLookup<
           ffi.NativeFunction<
-              jni.JniResult Function(ffi.Pointer<ffi.Void>)>>("HashMap__clone")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("HashMap__clone")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.Object clone()
   /// The returned object must be released after use, by calling the [release] method.
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 76f8c59..e63e471 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
@@ -406,10 +406,14 @@
   }
 
   static final _getDocument = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocument__getDocument")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocument__getDocument")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public org.apache.pdfbox.cos.COSDocument getDocument()
   /// The returned object must be released after use, by calling the [release] method.
@@ -421,10 +425,14 @@
   }
 
   static final _getDocumentInformation = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocument__getDocumentInformation")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocument__getDocumentInformation")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public org.apache.pdfbox.pdmodel.PDDocumentInformation getDocumentInformation()
   /// The returned object must be released after use, by calling the [release] method.
@@ -464,10 +472,14 @@
   }
 
   static final _getDocumentCatalog = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocument__getDocumentCatalog")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocument__getDocumentCatalog")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public org.apache.pdfbox.pdmodel.PDDocumentCatalog getDocumentCatalog()
   /// The returned object must be released after use, by calling the [release] method.
@@ -480,10 +492,14 @@
   }
 
   static final _isEncrypted = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocument__isEncrypted")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocument__isEncrypted")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean isEncrypted()
   ///
@@ -494,10 +510,14 @@
   }
 
   static final _getEncryption = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocument__getEncryption")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocument__getEncryption")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public org.apache.pdfbox.pdmodel.encryption.PDEncryption getEncryption()
   /// The returned object must be released after use, by calling the [release] method.
@@ -533,10 +553,14 @@
   }
 
   static final _getLastSignatureDictionary = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocument__getLastSignatureDictionary")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocument__getLastSignatureDictionary")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature getLastSignatureDictionary()
   /// The returned object must be released after use, by calling the [release] method.
@@ -551,10 +575,14 @@
   }
 
   static final _getSignatureFields = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocument__getSignatureFields")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocument__getSignatureFields")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.util.List<org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField> getSignatureFields()
   /// The returned object must be released after use, by calling the [release] method.
@@ -568,10 +596,14 @@
   }
 
   static final _getSignatureDictionaries = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocument__getSignatureDictionaries")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocument__getSignatureDictionaries")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.util.List<org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature> getSignatureDictionaries()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1304,10 +1336,14 @@
   }
 
   static final _getPages = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocument__getPages")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocument__getPages")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public org.apache.pdfbox.pdmodel.PDPageTree getPages()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1319,10 +1355,14 @@
   }
 
   static final _getNumberOfPages = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocument__getNumberOfPages")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocument__getNumberOfPages")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public int getNumberOfPages()
   ///
@@ -1333,10 +1373,14 @@
   }
 
   static final _close = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocument__close")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocument__close")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public void close()
   ///
@@ -1373,10 +1417,14 @@
   }
 
   static final _getCurrentAccessPermission = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocument__getCurrentAccessPermission")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocument__getCurrentAccessPermission")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public org.apache.pdfbox.pdmodel.encryption.AccessPermission getCurrentAccessPermission()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1392,10 +1440,14 @@
   }
 
   static final _isAllSecurityToBeRemoved = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocument__isAllSecurityToBeRemoved")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocument__isAllSecurityToBeRemoved")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean isAllSecurityToBeRemoved()
   ///
@@ -1423,10 +1475,14 @@
   }
 
   static final _getDocumentId = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocument__getDocumentId")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocument__getDocumentId")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.Long getDocumentId()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1456,10 +1512,14 @@
   }
 
   static final _getVersion = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocument__getVersion")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocument__getVersion")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public float getVersion()
   ///
@@ -1486,10 +1546,14 @@
   }
 
   static final _getResourceCache = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocument__getResourceCache")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocument__getResourceCache")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public org.apache.pdfbox.pdmodel.ResourceCache getResourceCache()
   /// The returned object must be released after use, by calling the [release] method.
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 99b1e7f..37a3a48 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
@@ -91,10 +91,14 @@
   }
 
   static final _getCOSObject = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocumentInformation__getCOSObject")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocumentInformation__getCOSObject")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public org.apache.pdfbox.cos.COSDictionary getCOSObject()
   /// The returned object must be released after use, by calling the [release] method.
@@ -134,10 +138,14 @@
   }
 
   static final _getTitle = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocumentInformation__getTitle")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocumentInformation__getTitle")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String getTitle()
   /// The returned object must be released after use, by calling the [release] method.
@@ -167,10 +175,14 @@
   }
 
   static final _getAuthor = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocumentInformation__getAuthor")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocumentInformation__getAuthor")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String getAuthor()
   /// The returned object must be released after use, by calling the [release] method.
@@ -200,10 +212,14 @@
   }
 
   static final _getSubject = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocumentInformation__getSubject")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocumentInformation__getSubject")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String getSubject()
   /// The returned object must be released after use, by calling the [release] method.
@@ -233,10 +249,14 @@
   }
 
   static final _getKeywords = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocumentInformation__getKeywords")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocumentInformation__getKeywords")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String getKeywords()
   /// The returned object must be released after use, by calling the [release] method.
@@ -266,10 +286,14 @@
   }
 
   static final _getCreator = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocumentInformation__getCreator")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocumentInformation__getCreator")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String getCreator()
   /// The returned object must be released after use, by calling the [release] method.
@@ -299,10 +323,14 @@
   }
 
   static final _getProducer = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocumentInformation__getProducer")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocumentInformation__getProducer")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String getProducer()
   /// The returned object must be released after use, by calling the [release] method.
@@ -332,10 +360,14 @@
   }
 
   static final _getCreationDate = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocumentInformation__getCreationDate")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocumentInformation__getCreationDate")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.util.Calendar getCreationDate()
   /// The returned object must be released after use, by calling the [release] method.
@@ -366,10 +398,14 @@
   }
 
   static final _getModificationDate = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocumentInformation__getModificationDate")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocumentInformation__getModificationDate")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.util.Calendar getModificationDate()
   /// The returned object must be released after use, by calling the [release] method.
@@ -401,10 +437,14 @@
   }
 
   static final _getTrapped = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocumentInformation__getTrapped")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocumentInformation__getTrapped")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String getTrapped()
   /// The returned object must be released after use, by calling the [release] method.
@@ -417,10 +457,14 @@
   }
 
   static final _getMetadataKeys = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDDocumentInformation__getMetadataKeys")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDDocumentInformation__getMetadataKeys")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.util.Set<java.lang.String> getMetadataKeys()
   /// The returned object must be released after use, by calling the [release] method.
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 d7d5595..a412b06 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
@@ -334,10 +334,14 @@
   }
 
   static final _startArticle = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__startArticle")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__startArticle")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: protected void startArticle()
   ///
@@ -368,10 +372,14 @@
   }
 
   static final _endArticle = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__endArticle")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__endArticle")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: protected void endArticle()
   ///
@@ -420,10 +428,14 @@
   }
 
   static final _writePage = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__writePage")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__writePage")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: protected void writePage()
   ///
@@ -436,10 +448,14 @@
   }
 
   static final _writeLineSeparator = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__writeLineSeparator")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__writeLineSeparator")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: protected void writeLineSeparator()
   ///
@@ -450,10 +466,14 @@
   }
 
   static final _writeWordSeparator = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__writeWordSeparator")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__writeWordSeparator")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: protected void writeWordSeparator()
   ///
@@ -548,10 +568,14 @@
   }
 
   static final _getStartPage = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__getStartPage")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__getStartPage")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public int getStartPage()
   ///
@@ -580,10 +604,14 @@
   }
 
   static final _getEndPage = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__getEndPage")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__getEndPage")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public int getEndPage()
   ///
@@ -631,10 +659,14 @@
   }
 
   static final _getLineSeparator = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__getLineSeparator")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__getLineSeparator")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String getLineSeparator()
   /// The returned object must be released after use, by calling the [release] method.
@@ -646,10 +678,14 @@
   }
 
   static final _getWordSeparator = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__getWordSeparator")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__getWordSeparator")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String getWordSeparator()
   /// The returned object must be released after use, by calling the [release] method.
@@ -682,10 +718,14 @@
   }
 
   static final _getSuppressDuplicateOverlappingText = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__getSuppressDuplicateOverlappingText")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__getSuppressDuplicateOverlappingText")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean getSuppressDuplicateOverlappingText()
   ///
@@ -695,10 +735,14 @@
   }
 
   static final _getCurrentPageNo = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__getCurrentPageNo")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__getCurrentPageNo")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: protected int getCurrentPageNo()
   ///
@@ -709,10 +753,14 @@
   }
 
   static final _getOutput = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__getOutput")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__getOutput")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: protected java.io.Writer getOutput()
   /// The returned object must be released after use, by calling the [release] method.
@@ -724,10 +772,14 @@
   }
 
   static final _getCharactersByArticle = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__getCharactersByArticle")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__getCharactersByArticle")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: protected java.util.List<java.util.List<org.apache.pdfbox.text.TextPosition>> getCharactersByArticle()
   /// The returned object must be released after use, by calling the [release] method.
@@ -761,10 +813,14 @@
   }
 
   static final _getSeparateByBeads = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__getSeparateByBeads")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__getSeparateByBeads")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean getSeparateByBeads()
   ///
@@ -792,10 +848,14 @@
   }
 
   static final _getEndBookmark = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__getEndBookmark")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__getEndBookmark")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineItem getEndBookmark()
   /// The returned object must be released after use, by calling the [release] method.
@@ -825,10 +885,14 @@
   }
 
   static final _getStartBookmark = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__getStartBookmark")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__getStartBookmark")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineItem getStartBookmark()
   /// The returned object must be released after use, by calling the [release] method.
@@ -859,10 +923,14 @@
   }
 
   static final _getAddMoreFormatting = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__getAddMoreFormatting")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__getAddMoreFormatting")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean getAddMoreFormatting()
   ///
@@ -890,10 +958,14 @@
   }
 
   static final _getSortByPosition = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__getSortByPosition")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__getSortByPosition")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean getSortByPosition()
   ///
@@ -926,10 +998,14 @@
   }
 
   static final _getSpacingTolerance = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__getSpacingTolerance")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__getSpacingTolerance")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public float getSpacingTolerance()
   ///
@@ -959,10 +1035,14 @@
   }
 
   static final _getAverageCharTolerance = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__getAverageCharTolerance")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__getAverageCharTolerance")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public float getAverageCharTolerance()
   ///
@@ -993,10 +1073,14 @@
   }
 
   static final _getIndentThreshold = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__getIndentThreshold")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__getIndentThreshold")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public float getIndentThreshold()
   ///
@@ -1026,10 +1110,14 @@
   }
 
   static final _getDropThreshold = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__getDropThreshold")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__getDropThreshold")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public float getDropThreshold()
   ///
@@ -1059,10 +1147,14 @@
   }
 
   static final _getParagraphStart = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__getParagraphStart")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__getParagraphStart")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String getParagraphStart()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1093,10 +1185,14 @@
   }
 
   static final _getParagraphEnd = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__getParagraphEnd")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__getParagraphEnd")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String getParagraphEnd()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1126,10 +1222,14 @@
   }
 
   static final _getPageStart = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__getPageStart")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__getPageStart")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String getPageStart()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1159,10 +1259,14 @@
   }
 
   static final _getPageEnd = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__getPageEnd")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__getPageEnd")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String getPageEnd()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1192,10 +1296,14 @@
   }
 
   static final _getArticleStart = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__getArticleStart")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__getArticleStart")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String getArticleStart()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1226,10 +1334,14 @@
   }
 
   static final _getArticleEnd = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__getArticleEnd")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__getArticleEnd")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String getArticleEnd()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1260,10 +1372,14 @@
   }
 
   static final _writeParagraphSeparator = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__writeParagraphSeparator")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__writeParagraphSeparator")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: protected void writeParagraphSeparator()
   ///
@@ -1274,10 +1390,14 @@
   }
 
   static final _writeParagraphStart = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__writeParagraphStart")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__writeParagraphStart")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: protected void writeParagraphStart()
   ///
@@ -1288,10 +1408,14 @@
   }
 
   static final _writeParagraphEnd = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__writeParagraphEnd")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__writeParagraphEnd")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: protected void writeParagraphEnd()
   ///
@@ -1302,10 +1426,14 @@
   }
 
   static final _writePageStart = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__writePageStart")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__writePageStart")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: protected void writePageStart()
   ///
@@ -1316,10 +1444,14 @@
   }
 
   static final _writePageEnd = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__writePageEnd")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__writePageEnd")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: protected void writePageEnd()
   ///
@@ -1349,10 +1481,14 @@
   }
 
   static final _getListItemPatterns = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "PDFTextStripper__getListItemPatterns")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("PDFTextStripper__getListItemPatterns")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: protected java.util.List<java.util.regex.Pattern> getListItemPatterns()
   /// The returned object must be released after use, by calling the [release] method.
diff --git a/pkgs/jnigen/lib/src/bindings/dart_generator.dart b/pkgs/jnigen/lib/src/bindings/dart_generator.dart
index 79f093b..eeac075 100644
--- a/pkgs/jnigen/lib/src/bindings/dart_generator.dart
+++ b/pkgs/jnigen/lib/src/bindings/dart_generator.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:ffi';
 import 'dart:io';
 
 import 'package:meta/meta.dart';
@@ -27,6 +28,7 @@
 const _jArray = '$_jni.JArray';
 const _jObject = '$_jni.JObject';
 const _jResult = '$_jni.JniResult';
+const _jThrowable = '$_jni.JThrowablePtr';
 
 // package:ffi types.
 const _voidPointer = '$_ffi.Pointer<$_ffi.Void>';
@@ -903,11 +905,21 @@
 /// ```
 class _TypeSig extends TypeVisitor<String> {
   final bool isFfi;
+  final bool isCBased;
 
-  const _TypeSig({required this.isFfi});
+  const _TypeSig({required this.isFfi, required this.isCBased});
 
   @override
   String visitPrimitiveType(PrimitiveType node) {
+    if (!isCBased && isFfi) {
+      // TODO(https://github.com/dart-lang/sdk/issues/55471): Once this lands in
+      // the stable, use the actual types instead.
+      if (node.name == 'float' || node.name == 'double') {
+        return '$_ffi.Double';
+      } else {
+        return '$_ffi.Int64';
+      }
+    }
     if (isFfi) return '$_ffi.${node.ffiType}';
     if (node.name == 'boolean') return 'int';
     return node.dartType;
@@ -957,8 +969,10 @@
 ''');
 
     if (!node.isFinal) {
-      final ffiSig = node.type.accept(const _TypeSig(isFfi: true));
-      final dartSig = node.type.accept(const _TypeSig(isFfi: false));
+      final ffiSig =
+          node.type.accept(const _TypeSig(isFfi: true, isCBased: true));
+      final dartSig =
+          node.type.accept(const _TypeSig(isFfi: false, isCBased: true));
       s.write('''
   static final _set_$name =
       $_lookup<$_ffi.NativeFunction<$_jResult Function($ifRef$ffiSig)>>(
@@ -1059,18 +1073,27 @@
 
 class _MethodTypeSig extends Visitor<Method, String> {
   final bool isFfi;
+  final bool isCBased;
 
-  const _MethodTypeSig({required this.isFfi});
+  const _MethodTypeSig({required this.isFfi, required this.isCBased});
 
   @override
   String visit(Method node) {
+    final callParams = node.params
+        .map((param) => param.type)
+        .accept(_TypeSig(isFfi: isFfi, isCBased: isCBased))
+        .join(', ');
     final args = [
-      if (!node.isCtor && !node.isStatic) _voidPointer,
-      ...node.params.map((param) => param.type).accept(
-            _TypeSig(isFfi: isFfi),
-          )
+      if ((!node.isCtor && !node.isStatic) || !isCBased) _voidPointer,
+      if (!isCBased) '$_jni.JMethodIDPtr',
+      !isCBased && isFfi && callParams.isNotEmpty
+          ? '$_ffi.VarArgs<($callParams${node.params.length == 1 ? ',' : ''})>'
+          : callParams
     ].join(', ');
-    return '$_jResult Function($args)';
+    final isCtor = node.isCtor;
+    final isVoid = node.returnType.name == 'void';
+    final returnType = !isCBased && !isCtor && isVoid ? _jThrowable : _jResult;
+    return '$returnType Function($args)';
   }
 }
 
@@ -1085,8 +1108,10 @@
   void writeCAccessor(Method node) {
     final name = node.finalName;
     final cName = node.accept(const CMethodName());
-    final ffiSig = node.accept(const _MethodTypeSig(isFfi: true));
-    final dartSig = node.accept(const _MethodTypeSig(isFfi: false));
+    final ffiSig =
+        node.accept(const _MethodTypeSig(isFfi: true, isCBased: true));
+    final dartSig =
+        node.accept(const _MethodTypeSig(isFfi: false, isCBased: true));
     s.write('''
   static final _$name =
           $_lookup<$_ffi.NativeFunction<$ffiSig>>("$cName")
@@ -1111,6 +1136,17 @@
     r"$descriptor",
   );
 ''');
+    final ffiSig =
+        node.accept(const _MethodTypeSig(isFfi: true, isCBased: false));
+    final dartSig =
+        node.accept(const _MethodTypeSig(isFfi: false, isCBased: false));
+    final methodName = node.accept(const _CallMethodName());
+    s.write('''
+
+  static final _$name = $_protectedExtension
+    .lookup<$_ffi.NativeFunction<$ffiSig>>("$methodName")
+    .asFunction<$dartSig>();
+''');
   }
 
   bool isSuspendFun(Method node) {
@@ -1119,23 +1155,25 @@
 
   String cCtor(Method node) {
     final name = node.finalName;
-    final params =
-        node.params.accept(const _ParamCall(isCBased: true)).join(', ');
+    final params = node.params.accept(const _ParamCall()).join(', ');
     return '_$name($params).reference';
   }
 
   String dartOnlyCtor(Method node) {
     final name = node.finalName;
-    final params =
-        node.params.accept(const _ParamCall(isCBased: false)).join(', ');
-    return '_id_$name($_classRef, referenceType, [$params])';
+    final params = [
+      '$_classRef.reference.pointer',
+      '_id_$name as $_jni.JMethodIDPtr',
+      ...node.params.accept(const _ParamCall()),
+    ].join(', ');
+    return '_$name($params).reference';
   }
 
   String cMethodCall(Method node) {
     final name = node.finalName;
     final params = [
       if (!node.isStatic) _selfPointer,
-      ...node.params.accept(const _ParamCall(isCBased: true)),
+      ...node.params.accept(const _ParamCall()),
     ].join(', ');
     final resultGetter = node.returnType.accept(_JniResultGetter(resolver));
     return '_$name($params).$resultGetter';
@@ -1143,11 +1181,13 @@
 
   String dartOnlyMethodCall(Method node) {
     final name = node.finalName;
-    final self = node.isStatic ? _classRef : _self;
-    final params =
-        node.params.accept(const _ParamCall(isCBased: false)).join(', ');
-    final type = node.returnType.accept(_TypeClassGenerator(resolver)).name;
-    return '_id_$name($self, $type, [$params])';
+    final params = [
+      node.isStatic ? '$_classRef.reference.pointer' : _selfPointer,
+      '_id_$name as $_jni.JMethodIDPtr',
+      ...node.params.accept(const _ParamCall()),
+    ].join(', ');
+    final resultGetter = node.returnType.accept(_JniResultGetter(resolver));
+    return '_$name($params).$resultGetter';
   }
 
   @override
@@ -1348,47 +1388,16 @@
 /// void bar(Foo foo) => _bar(foo.reference.pointer);
 /// ```
 class _ParamCall extends Visitor<Param, String> {
-  final bool isCBased;
-
-  const _ParamCall({required this.isCBased});
+  const _ParamCall();
 
   @override
   String visit(Param node) {
     final nativeSuffix = node.type.accept(const _ToNativeSuffix());
     final paramCall = '${node.finalName}$nativeSuffix';
-    if (!isCBased) {
-      // We need to wrap [paramCall] in the appropriate wrapper class.
-      return node.type.accept(_JValueWrapper(paramCall));
-    }
     return paramCall;
   }
 }
 
-/// Wraps the parameter in the appropriate JValue wrapper class.
-///
-/// For instance, `int` in Dart can be mapped to `long` or `int` or ... in Java.
-/// The wrapper class is how we identify the type in pure dart bindings.
-class _JValueWrapper extends TypeVisitor<String> {
-  final String param;
-
-  _JValueWrapper(this.param);
-
-  @override
-  String visitNonPrimitiveType(ReferredType node) {
-    return param;
-  }
-
-  @override
-  String visitPrimitiveType(PrimitiveType node) {
-    if (node.name == 'long' ||
-        node.name == 'double' ||
-        node.name == 'boolean') {
-      return param;
-    }
-    return '$_jni.JValue${node.name.capitalize()}($param)';
-  }
-}
-
 /// A pair of [StringBuffer]s that can create an expression from the outer layer
 /// inwards.
 ///
@@ -1681,3 +1690,21 @@
     return '$_jni.J${node.boxedName}(\$r).reference.toPointer()';
   }
 }
+
+class _CallMethodName extends Visitor<Method, String> {
+  const _CallMethodName();
+
+  @override
+  String visit(Method node) {
+    if (node.isCtor) {
+      return 'globalEnv_NewObject';
+    }
+    final String type;
+    if (node.returnType.kind == Kind.primitive) {
+      type = (node.returnType.type as PrimitiveType).name.capitalize();
+    } else {
+      type = 'Object';
+    }
+    return 'globalEnv_Call${node.isStatic ? 'Static' : ''}${type}Method';
+  }
+}
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 de3f0e1..49c8a12 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
@@ -98,10 +98,14 @@
   }
 
   static final _enabledByDefault = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonFactory_Feature__enabledByDefault")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonFactory_Feature__enabledByDefault")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean enabledByDefault()
   bool enabledByDefault() {
@@ -122,10 +126,14 @@
   }
 
   static final _getMask = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonFactory_Feature__getMask")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonFactory_Feature__getMask")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public int getMask()
   int getMask() {
@@ -343,10 +351,14 @@
   }
 
   static final _rebuild = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonFactory__rebuild")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonFactory__rebuild")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public com.fasterxml.jackson.core.TSFBuilder<?,?> rebuild()
   /// The returned object must be released after use, by calling the [release] method.
@@ -380,10 +392,14 @@
   }
 
   static final _copy = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonFactory__copy")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonFactory__copy")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public com.fasterxml.jackson.core.JsonFactory copy()
   /// The returned object must be released after use, by calling the [release] method.
@@ -405,10 +421,14 @@
   }
 
   static final _readResolve = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonFactory__readResolve")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonFactory__readResolve")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: protected java.lang.Object readResolve()
   /// The returned object must be released after use, by calling the [release] method.
@@ -424,10 +444,14 @@
   }
 
   static final _requiresPropertyOrdering = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonFactory__requiresPropertyOrdering")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonFactory__requiresPropertyOrdering")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean requiresPropertyOrdering()
   ///
@@ -450,10 +474,14 @@
   }
 
   static final _canHandleBinaryNatively = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonFactory__canHandleBinaryNatively")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonFactory__canHandleBinaryNatively")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean canHandleBinaryNatively()
   ///
@@ -473,10 +501,14 @@
   }
 
   static final _canUseCharArrays = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonFactory__canUseCharArrays")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonFactory__canUseCharArrays")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean canUseCharArrays()
   ///
@@ -496,10 +528,14 @@
   }
 
   static final _canParseAsync = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonFactory__canParseAsync")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonFactory__canParseAsync")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean canParseAsync()
   ///
@@ -515,10 +551,14 @@
   }
 
   static final _getFormatReadFeatureType = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonFactory__getFormatReadFeatureType")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonFactory__getFormatReadFeatureType")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// 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.
@@ -528,10 +568,14 @@
   }
 
   static final _getFormatWriteFeatureType = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonFactory__getFormatWriteFeatureType")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonFactory__getFormatWriteFeatureType")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// 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.
@@ -566,10 +610,14 @@
   }
 
   static final _getFormatName = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonFactory__getFormatName")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonFactory__getFormatName")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String getFormatName()
   /// The returned object must be released after use, by calling the [release] method.
@@ -602,10 +650,14 @@
   }
 
   static final _requiresCustomCodec = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonFactory__requiresCustomCodec")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonFactory__requiresCustomCodec")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean requiresCustomCodec()
   ///
@@ -640,10 +692,14 @@
   }
 
   static final _version = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonFactory__version")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonFactory__version")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public com.fasterxml.jackson.core.Version version()
   /// The returned object must be released after use, by calling the [release] method.
@@ -742,10 +798,14 @@
   }
 
   static final _getParserFeatures = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonFactory__getParserFeatures")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonFactory__getParserFeatures")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public final int getParserFeatures()
   int getParserFeatures() {
@@ -753,10 +813,14 @@
   }
 
   static final _getGeneratorFeatures = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonFactory__getGeneratorFeatures")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonFactory__getGeneratorFeatures")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public final int getGeneratorFeatures()
   int getGeneratorFeatures() {
@@ -764,10 +828,14 @@
   }
 
   static final _getFormatParserFeatures = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonFactory__getFormatParserFeatures")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonFactory__getFormatParserFeatures")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public int getFormatParserFeatures()
   int getFormatParserFeatures() {
@@ -775,10 +843,14 @@
   }
 
   static final _getFormatGeneratorFeatures = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonFactory__getFormatGeneratorFeatures")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonFactory__getFormatGeneratorFeatures")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public int getFormatGeneratorFeatures()
   int getFormatGeneratorFeatures() {
@@ -893,10 +965,14 @@
   }
 
   static final _getInputDecorator = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonFactory__getInputDecorator")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonFactory__getInputDecorator")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public com.fasterxml.jackson.core.io.InputDecorator getInputDecorator()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1039,10 +1115,14 @@
   }
 
   static final _getCharacterEscapes = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonFactory__getCharacterEscapes")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonFactory__getCharacterEscapes")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public com.fasterxml.jackson.core.io.CharacterEscapes getCharacterEscapes()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1078,10 +1158,14 @@
   }
 
   static final _getOutputDecorator = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonFactory__getOutputDecorator")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonFactory__getOutputDecorator")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public com.fasterxml.jackson.core.io.OutputDecorator getOutputDecorator()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1141,10 +1225,14 @@
   }
 
   static final _getRootValueSeparator = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonFactory__getRootValueSeparator")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonFactory__getRootValueSeparator")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String getRootValueSeparator()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1181,10 +1269,14 @@
   }
 
   static final _getCodec = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonFactory__getCodec")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonFactory__getCodec")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public com.fasterxml.jackson.core.ObjectCodec getCodec()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1465,10 +1557,14 @@
   }
 
   static final _createNonBlockingByteArrayParser = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonFactory__createNonBlockingByteArrayParser")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonFactory__createNonBlockingByteArrayParser")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public com.fasterxml.jackson.core.JsonParser createNonBlockingByteArrayParser()
   /// The returned object must be released after use, by calling the [release] method.
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 75389bc..49368b3 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
@@ -97,10 +97,14 @@
   }
 
   static final _enabledByDefault = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser_Feature__enabledByDefault")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser_Feature__enabledByDefault")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean enabledByDefault()
   bool enabledByDefault() {
@@ -121,10 +125,14 @@
   }
 
   static final _getMask = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser_Feature__getMask")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser_Feature__getMask")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public int getMask()
   int getMask() {
@@ -281,10 +289,14 @@
   }
 
   static final _getCodec = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getCodec")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getCodec")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract com.fasterxml.jackson.core.ObjectCodec getCodec()
   /// The returned object must be released after use, by calling the [release] method.
@@ -318,10 +330,14 @@
   }
 
   static final _getInputSource = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getInputSource")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getInputSource")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.Object getInputSource()
   /// The returned object must be released after use, by calling the [release] method.
@@ -437,10 +453,14 @@
   }
 
   static final _getSchema = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getSchema")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getSchema")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public com.fasterxml.jackson.core.FormatSchema getSchema()
   /// The returned object must be released after use, by calling the [release] method.
@@ -474,10 +494,14 @@
   }
 
   static final _requiresCustomCodec = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__requiresCustomCodec")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__requiresCustomCodec")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean requiresCustomCodec()
   ///
@@ -494,10 +518,14 @@
   }
 
   static final _canParseAsync = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__canParseAsync")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__canParseAsync")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean canParseAsync()
   ///
@@ -517,10 +545,14 @@
   }
 
   static final _getNonBlockingInputFeeder = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getNonBlockingInputFeeder")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getNonBlockingInputFeeder")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public com.fasterxml.jackson.core.async.NonBlockingInputFeeder getNonBlockingInputFeeder()
   /// The returned object must be released after use, by calling the [release] method.
@@ -536,10 +568,14 @@
   }
 
   static final _getReadCapabilities = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getReadCapabilities")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getReadCapabilities")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public com.fasterxml.jackson.core.util.JacksonFeatureSet<com.fasterxml.jackson.core.StreamReadCapability> getReadCapabilities()
   /// The returned object must be released after use, by calling the [release] method.
@@ -554,10 +590,14 @@
   }
 
   static final _version = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__version")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__version")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract com.fasterxml.jackson.core.Version version()
   /// The returned object must be released after use, by calling the [release] method.
@@ -571,10 +611,14 @@
   }
 
   static final _close = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__close")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__close")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract void close()
   ///
@@ -597,10 +641,14 @@
   }
 
   static final _isClosed = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__isClosed")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__isClosed")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract boolean isClosed()
   ///
@@ -616,10 +664,14 @@
   }
 
   static final _getParsingContext = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getParsingContext")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getParsingContext")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract com.fasterxml.jackson.core.JsonStreamContext getParsingContext()
   /// The returned object must be released after use, by calling the [release] method.
@@ -639,10 +691,14 @@
   }
 
   static final _currentLocation = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__currentLocation")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__currentLocation")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public com.fasterxml.jackson.core.JsonLocation currentLocation()
   /// The returned object must be released after use, by calling the [release] method.
@@ -664,10 +720,14 @@
   }
 
   static final _currentTokenLocation = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__currentTokenLocation")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__currentTokenLocation")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public com.fasterxml.jackson.core.JsonLocation currentTokenLocation()
   /// The returned object must be released after use, by calling the [release] method.
@@ -690,10 +750,14 @@
   }
 
   static final _getCurrentLocation = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getCurrentLocation")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getCurrentLocation")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract com.fasterxml.jackson.core.JsonLocation getCurrentLocation()
   /// The returned object must be released after use, by calling the [release] method.
@@ -707,10 +771,14 @@
   }
 
   static final _getTokenLocation = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getTokenLocation")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getTokenLocation")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract com.fasterxml.jackson.core.JsonLocation getTokenLocation()
   /// The returned object must be released after use, by calling the [release] method.
@@ -723,10 +791,14 @@
   }
 
   static final _currentValue = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__currentValue")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__currentValue")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.Object currentValue()
   /// The returned object must be released after use, by calling the [release] method.
@@ -769,10 +841,14 @@
   }
 
   static final _getCurrentValue = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getCurrentValue")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getCurrentValue")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.Object getCurrentValue()
   /// The returned object must be released after use, by calling the [release] method.
@@ -966,10 +1042,14 @@
   }
 
   static final _getFeatureMask = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getFeatureMask")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getFeatureMask")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public int getFeatureMask()
   ///
@@ -1031,10 +1111,14 @@
   }
 
   static final _getFormatFeatures = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getFormatFeatures")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getFormatFeatures")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public int getFormatFeatures()
   ///
@@ -1074,10 +1158,14 @@
   }
 
   static final _nextToken = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__nextToken")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__nextToken")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract com.fasterxml.jackson.core.JsonToken nextToken()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1096,10 +1184,14 @@
   }
 
   static final _nextValue = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__nextValue")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__nextValue")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract com.fasterxml.jackson.core.JsonToken nextValue()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1157,10 +1249,14 @@
   }
 
   static final _nextFieldName1 = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__nextFieldName1")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__nextFieldName1")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String nextFieldName()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1178,10 +1274,14 @@
   }
 
   static final _nextTextValue = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__nextTextValue")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__nextTextValue")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String nextTextValue()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1266,10 +1366,14 @@
   }
 
   static final _nextBooleanValue = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__nextBooleanValue")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__nextBooleanValue")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.Boolean nextBooleanValue()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1296,10 +1400,14 @@
   }
 
   static final _skipChildren = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__skipChildren")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__skipChildren")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract com.fasterxml.jackson.core.JsonParser skipChildren()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1324,10 +1432,14 @@
   }
 
   static final _finishToken = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__finishToken")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__finishToken")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public void finishToken()
   ///
@@ -1349,10 +1461,14 @@
   }
 
   static final _currentToken = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__currentToken")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__currentToken")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public com.fasterxml.jackson.core.JsonToken currentToken()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1372,10 +1488,14 @@
   }
 
   static final _currentTokenId = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__currentTokenId")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__currentTokenId")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public int currentTokenId()
   ///
@@ -1393,10 +1513,14 @@
   }
 
   static final _getCurrentToken = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getCurrentToken")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getCurrentToken")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract com.fasterxml.jackson.core.JsonToken getCurrentToken()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1411,10 +1535,14 @@
   }
 
   static final _getCurrentTokenId = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getCurrentTokenId")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getCurrentTokenId")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract int getCurrentTokenId()
   ///
@@ -1426,10 +1554,14 @@
   }
 
   static final _hasCurrentToken = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__hasCurrentToken")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__hasCurrentToken")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract boolean hasCurrentToken()
   ///
@@ -1500,10 +1632,14 @@
   }
 
   static final _isExpectedStartArrayToken = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__isExpectedStartArrayToken")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__isExpectedStartArrayToken")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean isExpectedStartArrayToken()
   ///
@@ -1528,10 +1664,14 @@
   }
 
   static final _isExpectedStartObjectToken = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__isExpectedStartObjectToken")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__isExpectedStartObjectToken")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean isExpectedStartObjectToken()
   ///
@@ -1546,10 +1686,14 @@
   }
 
   static final _isExpectedNumberIntToken = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__isExpectedNumberIntToken")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__isExpectedNumberIntToken")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean isExpectedNumberIntToken()
   ///
@@ -1567,10 +1711,14 @@
   }
 
   static final _isNaN = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__isNaN")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__isNaN")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean isNaN()
   ///
@@ -1591,10 +1739,14 @@
   }
 
   static final _clearCurrentToken = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__clearCurrentToken")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__clearCurrentToken")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract void clearCurrentToken()
   ///
@@ -1613,10 +1765,14 @@
   }
 
   static final _getLastClearedToken = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getLastClearedToken")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getLastClearedToken")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract com.fasterxml.jackson.core.JsonToken getLastClearedToken()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1657,10 +1813,14 @@
   }
 
   static final _getCurrentName = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getCurrentName")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getCurrentName")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract java.lang.String getCurrentName()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1674,10 +1834,14 @@
   }
 
   static final _currentName = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__currentName")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__currentName")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String currentName()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1696,10 +1860,14 @@
   }
 
   static final _getText = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getText")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getText")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract java.lang.String getText()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1748,10 +1916,14 @@
   }
 
   static final _getTextCharacters = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getTextCharacters")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getTextCharacters")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract char[] getTextCharacters()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1789,10 +1961,14 @@
   }
 
   static final _getTextLength = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getTextLength")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getTextLength")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract int getTextLength()
   ///
@@ -1808,10 +1984,14 @@
   }
 
   static final _getTextOffset = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getTextOffset")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getTextOffset")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract int getTextOffset()
   ///
@@ -1827,10 +2007,14 @@
   }
 
   static final _hasTextCharacters = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__hasTextCharacters")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__hasTextCharacters")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract boolean hasTextCharacters()
   ///
@@ -1853,10 +2037,14 @@
   }
 
   static final _getNumberValue = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getNumberValue")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getNumberValue")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract java.lang.Number getNumberValue()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1876,10 +2064,14 @@
   }
 
   static final _getNumberValueExact = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getNumberValueExact")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getNumberValueExact")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.Number getNumberValueExact()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1904,10 +2096,14 @@
   }
 
   static final _getNumberType = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getNumberType")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getNumberType")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract com.fasterxml.jackson.core.JsonParser.NumberType getNumberType()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1925,10 +2121,14 @@
   }
 
   static final _getByteValue = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getByteValue")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getByteValue")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public byte getByteValue()
   ///
@@ -1958,10 +2158,14 @@
   }
 
   static final _getShortValue = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getShortValue")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getShortValue")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public short getShortValue()
   ///
@@ -1985,10 +2189,14 @@
   }
 
   static final _getIntValue = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getIntValue")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getIntValue")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract int getIntValue()
   ///
@@ -2012,10 +2220,14 @@
   }
 
   static final _getLongValue = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getLongValue")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getLongValue")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract long getLongValue()
   ///
@@ -2039,10 +2251,14 @@
   }
 
   static final _getBigIntegerValue = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getBigIntegerValue")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getBigIntegerValue")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract java.math.BigInteger getBigIntegerValue()
   /// The returned object must be released after use, by calling the [release] method.
@@ -2064,10 +2280,14 @@
   }
 
   static final _getFloatValue = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getFloatValue")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getFloatValue")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract float getFloatValue()
   ///
@@ -2091,10 +2311,14 @@
   }
 
   static final _getDoubleValue = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getDoubleValue")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getDoubleValue")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract double getDoubleValue()
   ///
@@ -2118,10 +2342,14 @@
   }
 
   static final _getDecimalValue = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getDecimalValue")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getDecimalValue")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract java.math.BigDecimal getDecimalValue()
   /// The returned object must be released after use, by calling the [release] method.
@@ -2139,10 +2367,14 @@
   }
 
   static final _getBooleanValue = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getBooleanValue")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getBooleanValue")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean getBooleanValue()
   ///
@@ -2162,10 +2394,14 @@
   }
 
   static final _getEmbeddedObject = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getEmbeddedObject")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getEmbeddedObject")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.Object getEmbeddedObject()
   /// The returned object must be released after use, by calling the [release] method.
@@ -2228,10 +2464,14 @@
   }
 
   static final _getBinaryValue1 = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getBinaryValue1")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getBinaryValue1")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public byte[] getBinaryValue()
   /// The returned object must be released after use, by calling the [release] method.
@@ -2304,10 +2544,14 @@
   }
 
   static final _getValueAsInt = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getValueAsInt")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getValueAsInt")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public int getValueAsInt()
   ///
@@ -2356,10 +2600,14 @@
   }
 
   static final _getValueAsLong = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getValueAsLong")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getValueAsLong")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public long getValueAsLong()
   ///
@@ -2408,10 +2656,14 @@
   }
 
   static final _getValueAsDouble = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getValueAsDouble")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getValueAsDouble")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public double getValueAsDouble()
   ///
@@ -2460,10 +2712,14 @@
   }
 
   static final _getValueAsBoolean = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getValueAsBoolean")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getValueAsBoolean")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean getValueAsBoolean()
   ///
@@ -2512,10 +2768,14 @@
   }
 
   static final _getValueAsString = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getValueAsString")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getValueAsString")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String getValueAsString()
   /// The returned object must be released after use, by calling the [release] method.
@@ -2566,10 +2826,14 @@
   }
 
   static final _canReadObjectId = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__canReadObjectId")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__canReadObjectId")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean canReadObjectId()
   ///
@@ -2589,10 +2853,14 @@
   }
 
   static final _canReadTypeId = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__canReadTypeId")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__canReadTypeId")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean canReadTypeId()
   ///
@@ -2612,10 +2880,14 @@
   }
 
   static final _getObjectId = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getObjectId")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getObjectId")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.Object getObjectId()
   /// The returned object must be released after use, by calling the [release] method.
@@ -2638,10 +2910,14 @@
   }
 
   static final _getTypeId = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__getTypeId")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__getTypeId")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.Object getTypeId()
   /// The returned object must be released after use, by calling the [release] method.
@@ -2803,10 +3079,14 @@
   }
 
   static final _readValueAsTree = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonParser__readValueAsTree")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonParser__readValueAsTree")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public T readValueAsTree()
   /// The returned object must be released after use, by calling the [release] method.
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 ea4122e..a9da47b 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
@@ -83,8 +83,13 @@
 
   static final _id = jniLookup<
           ffi.NativeFunction<
-              jni.JniResult Function(ffi.Pointer<ffi.Void>)>>("JsonToken__id")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonToken__id")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public final int id()
   int id() {
@@ -92,10 +97,14 @@
   }
 
   static final _asString = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonToken__asString")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonToken__asString")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public final java.lang.String asString()
   /// The returned object must be released after use, by calling the [release] method.
@@ -104,10 +113,14 @@
   }
 
   static final _asCharArray = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonToken__asCharArray")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonToken__asCharArray")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public final char[] asCharArray()
   /// The returned object must be released after use, by calling the [release] method.
@@ -117,10 +130,14 @@
   }
 
   static final _asByteArray = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonToken__asByteArray")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonToken__asByteArray")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public final byte[] asByteArray()
   /// The returned object must be released after use, by calling the [release] method.
@@ -130,10 +147,14 @@
   }
 
   static final _isNumeric = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonToken__isNumeric")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonToken__isNumeric")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public final boolean isNumeric()
   ///
@@ -144,10 +165,14 @@
   }
 
   static final _isStructStart = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonToken__isStructStart")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonToken__isStructStart")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public final boolean isStructStart()
   ///
@@ -163,10 +188,14 @@
   }
 
   static final _isStructEnd = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonToken__isStructEnd")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonToken__isStructEnd")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public final boolean isStructEnd()
   ///
@@ -182,10 +211,14 @@
   }
 
   static final _isScalarValue = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonToken__isScalarValue")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonToken__isScalarValue")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public final boolean isScalarValue()
   ///
@@ -200,10 +233,14 @@
   }
 
   static final _isBoolean = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonToken__isBoolean")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonToken__isBoolean")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public final boolean isBoolean()
   ///
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 bd94fa8..2b11545 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
@@ -64,11 +64,23 @@
     r"()[Lcom/fasterxml/jackson/core/JsonFactory$Feature;",
   );
 
+  static final _values = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: static public com.fasterxml.jackson.core.JsonFactory.Feature[] values()
   /// The returned object must be released after use, by calling the [release] method.
   static jni.JArray<JsonFactory_Feature> values() {
-    return _id_values(
-        _class, const jni.JArrayType($JsonFactory_FeatureType()), []);
+    return _values(_class.reference.pointer, _id_values as jni.JMethodIDPtr)
+        .object(const jni.JArrayType($JsonFactory_FeatureType()));
   }
 
   static final _id_valueOf = _class.staticMethodId(
@@ -76,13 +88,25 @@
     r"(Ljava/lang/String;)Lcom/fasterxml/jackson/core/JsonFactory$Feature;",
   );
 
+  static final _valueOf = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: static public com.fasterxml.jackson.core.JsonFactory.Feature valueOf(java.lang.String name)
   /// The returned object must be released after use, by calling the [release] method.
   static JsonFactory_Feature valueOf(
     jni.JString name,
   ) {
-    return _id_valueOf(
-        _class, const $JsonFactory_FeatureType(), [name.reference.pointer]);
+    return _valueOf(_class.reference.pointer, _id_valueOf as jni.JMethodIDPtr,
+            name.reference.pointer)
+        .object(const $JsonFactory_FeatureType());
   }
 
   static final _id_collectDefaults = _class.staticMethodId(
@@ -90,13 +114,27 @@
     r"()I",
   );
 
+  static final _collectDefaults = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallStaticIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: static public int collectDefaults()
   ///
   /// Method that calculates bit set (flags) of all features that
   /// are enabled by default.
   ///@return Bit field of features enabled by default
   static int collectDefaults() {
-    return _id_collectDefaults(_class, const jni.jintType(), []);
+    return _collectDefaults(
+            _class.reference.pointer, _id_collectDefaults as jni.JMethodIDPtr)
+        .integer;
   }
 
   static final _id_enabledByDefault = _class.instanceMethodId(
@@ -104,9 +142,23 @@
     r"()Z",
   );
 
+  static final _enabledByDefault = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public boolean enabledByDefault()
   bool enabledByDefault() {
-    return _id_enabledByDefault(this, const jni.jbooleanType(), []);
+    return _enabledByDefault(
+            reference.pointer, _id_enabledByDefault as jni.JMethodIDPtr)
+        .boolean;
   }
 
   static final _id_enabledIn = _class.instanceMethodId(
@@ -114,12 +166,21 @@
     r"(I)Z",
   );
 
+  static final _enabledIn = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+                  ffi.VarArgs<(ffi.Int64,)>)>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
+
   /// from: public boolean enabledIn(int flags)
   bool enabledIn(
     int flags,
   ) {
-    return _id_enabledIn(
-        this, const jni.jbooleanType(), [jni.JValueInt(flags)]);
+    return _enabledIn(
+            reference.pointer, _id_enabledIn as jni.JMethodIDPtr, flags)
+        .boolean;
   }
 
   static final _id_getMask = _class.instanceMethodId(
@@ -127,9 +188,21 @@
     r"()I",
   );
 
+  static final _getMask = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public int getMask()
   int getMask() {
-    return _id_getMask(this, const jni.jintType(), []);
+    return _getMask(reference.pointer, _id_getMask as jni.JMethodIDPtr).integer;
   }
 }
 
@@ -253,6 +326,18 @@
     r"()V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -265,26 +350,54 @@
   /// and this reuse only works within context of a single
   /// factory instance.
   factory JsonFactory() {
-    return JsonFactory.fromReference(_id_new0(_class, referenceType, []));
+    return JsonFactory.fromReference(
+        _new0(_class.reference.pointer, _id_new0 as jni.JMethodIDPtr)
+            .reference);
   }
 
   static final _id_new1 = _class.constructorId(
     r"(Lcom/fasterxml/jackson/core/ObjectCodec;)V",
   );
 
+  static final _new1 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// 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.fromReference(
-        _id_new1(_class, referenceType, [oc.reference.pointer]));
+    return JsonFactory.fromReference(_new1(_class.reference.pointer,
+            _id_new1 as jni.JMethodIDPtr, oc.reference.pointer)
+        .reference);
   }
 
   static final _id_new2 = _class.constructorId(
     r"(Lcom/fasterxml/jackson/core/JsonFactory;Lcom/fasterxml/jackson/core/ObjectCodec;)V",
   );
 
+  static final _new2 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>
+                      )>)>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
+
   /// from: protected void <init>(com.fasterxml.jackson.core.JsonFactory src, com.fasterxml.jackson.core.ObjectCodec codec)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -296,14 +409,29 @@
     JsonFactory src,
     jni.JObject codec,
   ) {
-    return JsonFactory.fromReference(_id_new2(_class, referenceType,
-        [src.reference.pointer, codec.reference.pointer]));
+    return JsonFactory.fromReference(_new2(
+            _class.reference.pointer,
+            _id_new2 as jni.JMethodIDPtr,
+            src.reference.pointer,
+            codec.reference.pointer)
+        .reference);
   }
 
   static final _id_new3 = _class.constructorId(
     r"(Lcom/fasterxml/jackson/core/JsonFactoryBuilder;)V",
   );
 
+  static final _new3 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public void <init>(com.fasterxml.jackson.core.JsonFactoryBuilder b)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -313,14 +441,26 @@
   factory JsonFactory.new3(
     jni.JObject b,
   ) {
-    return JsonFactory.fromReference(
-        _id_new3(_class, referenceType, [b.reference.pointer]));
+    return JsonFactory.fromReference(_new3(_class.reference.pointer,
+            _id_new3 as jni.JMethodIDPtr, b.reference.pointer)
+        .reference);
   }
 
   static final _id_new4 = _class.constructorId(
     r"(Lcom/fasterxml/jackson/core/TSFBuilder;Z)V",
   );
 
+  static final _new4 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>, ffi.Int64)>)>>(
+          "globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>, int)>();
+
   /// 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.
   ///
@@ -333,8 +473,9 @@
     jni.JObject b,
     bool bogus,
   ) {
-    return JsonFactory.fromReference(
-        _id_new4(_class, referenceType, [b.reference.pointer, bogus ? 1 : 0]));
+    return JsonFactory.fromReference(_new4(_class.reference.pointer,
+            _id_new4 as jni.JMethodIDPtr, b.reference.pointer, bogus ? 1 : 0)
+        .reference);
   }
 
   static final _id_rebuild = _class.instanceMethodId(
@@ -342,6 +483,18 @@
     r"()Lcom/fasterxml/jackson/core/TSFBuilder;",
   );
 
+  static final _rebuild = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public com.fasterxml.jackson.core.TSFBuilder<?,?> rebuild()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -350,7 +503,8 @@
   ///@return Builder instance to use
   ///@since 2.10
   jni.JObject rebuild() {
-    return _id_rebuild(this, const jni.JObjectType(), []);
+    return _rebuild(reference.pointer, _id_rebuild as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_builder = _class.staticMethodId(
@@ -358,6 +512,18 @@
     r"()Lcom/fasterxml/jackson/core/TSFBuilder;",
   );
 
+  static final _builder = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: static public com.fasterxml.jackson.core.TSFBuilder<?,?> builder()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -370,7 +536,8 @@
   /// will be fixed in 3.0.
   ///@return Builder instance to use
   static jni.JObject builder() {
-    return _id_builder(_class, const jni.JObjectType(), []);
+    return _builder(_class.reference.pointer, _id_builder as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_copy = _class.instanceMethodId(
@@ -378,6 +545,18 @@
     r"()Lcom/fasterxml/jackson/core/JsonFactory;",
   );
 
+  static final _copy = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public com.fasterxml.jackson.core.JsonFactory copy()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -394,7 +573,8 @@
   ///@return Copy of this factory instance
   ///@since 2.1
   JsonFactory copy() {
-    return _id_copy(this, const $JsonFactoryType(), []);
+    return _copy(reference.pointer, _id_copy as jni.JMethodIDPtr)
+        .object(const $JsonFactoryType());
   }
 
   static final _id_readResolve = _class.instanceMethodId(
@@ -402,6 +582,18 @@
     r"()Ljava/lang/Object;",
   );
 
+  static final _readResolve = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: protected java.lang.Object readResolve()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -412,7 +604,8 @@
   /// Note: must be overridden by sub-classes as well.
   ///@return Newly constructed instance
   jni.JObject readResolve() {
-    return _id_readResolve(this, const jni.JObjectType(), []);
+    return _readResolve(reference.pointer, _id_readResolve as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_requiresPropertyOrdering = _class.instanceMethodId(
@@ -420,6 +613,18 @@
     r"()Z",
   );
 
+  static final _requiresPropertyOrdering = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public boolean requiresPropertyOrdering()
   ///
   /// Introspection method that higher-level functionality may call
@@ -437,7 +642,9 @@
   ///   requires Object properties to be ordered.
   ///@since 2.3
   bool requiresPropertyOrdering() {
-    return _id_requiresPropertyOrdering(this, const jni.jbooleanType(), []);
+    return _requiresPropertyOrdering(
+            reference.pointer, _id_requiresPropertyOrdering as jni.JMethodIDPtr)
+        .boolean;
   }
 
   static final _id_canHandleBinaryNatively = _class.instanceMethodId(
@@ -445,6 +652,18 @@
     r"()Z",
   );
 
+  static final _canHandleBinaryNatively = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public boolean canHandleBinaryNatively()
   ///
   /// Introspection method that higher-level functionality may call
@@ -459,7 +678,9 @@
   ///    supports native binary content
   ///@since 2.3
   bool canHandleBinaryNatively() {
-    return _id_canHandleBinaryNatively(this, const jni.jbooleanType(), []);
+    return _canHandleBinaryNatively(
+            reference.pointer, _id_canHandleBinaryNatively as jni.JMethodIDPtr)
+        .boolean;
   }
 
   static final _id_canUseCharArrays = _class.instanceMethodId(
@@ -467,6 +688,18 @@
     r"()Z",
   );
 
+  static final _canUseCharArrays = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public boolean canUseCharArrays()
   ///
   /// Introspection method that can be used by base factory to check
@@ -481,7 +714,9 @@
   ///   accessed using parser method {@code getTextCharacters()}.
   ///@since 2.4
   bool canUseCharArrays() {
-    return _id_canUseCharArrays(this, const jni.jbooleanType(), []);
+    return _canUseCharArrays(
+            reference.pointer, _id_canUseCharArrays as jni.JMethodIDPtr)
+        .boolean;
   }
 
   static final _id_canParseAsync = _class.instanceMethodId(
@@ -489,6 +724,18 @@
     r"()Z",
   );
 
+  static final _canParseAsync = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public boolean canParseAsync()
   ///
   /// Introspection method that can be used to check whether this
@@ -499,7 +746,9 @@
   ///    not (and consequently whether {@code createNonBlockingXxx()} method(s) work)
   ///@since 2.9
   bool canParseAsync() {
-    return _id_canParseAsync(this, const jni.jbooleanType(), []);
+    return _canParseAsync(
+            reference.pointer, _id_canParseAsync as jni.JMethodIDPtr)
+        .boolean;
   }
 
   static final _id_getFormatReadFeatureType = _class.instanceMethodId(
@@ -507,10 +756,24 @@
     r"()Ljava/lang/Class;",
   );
 
+  static final _getFormatReadFeatureType = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// 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 _id_getFormatReadFeatureType(this, const jni.JObjectType(), []);
+    return _getFormatReadFeatureType(
+            reference.pointer, _id_getFormatReadFeatureType as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_getFormatWriteFeatureType = _class.instanceMethodId(
@@ -518,10 +781,24 @@
     r"()Ljava/lang/Class;",
   );
 
+  static final _getFormatWriteFeatureType = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// 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 _id_getFormatWriteFeatureType(this, const jni.JObjectType(), []);
+    return _getFormatWriteFeatureType(reference.pointer,
+            _id_getFormatWriteFeatureType as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_canUseSchema = _class.instanceMethodId(
@@ -529,6 +806,17 @@
     r"(Lcom/fasterxml/jackson/core/FormatSchema;)Z",
   );
 
+  static final _canUseSchema = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public boolean canUseSchema(com.fasterxml.jackson.core.FormatSchema schema)
   ///
   /// Method that can be used to quickly check whether given schema
@@ -543,8 +831,9 @@
   bool canUseSchema(
     jni.JObject schema,
   ) {
-    return _id_canUseSchema(
-        this, const jni.jbooleanType(), [schema.reference.pointer]);
+    return _canUseSchema(reference.pointer,
+            _id_canUseSchema as jni.JMethodIDPtr, schema.reference.pointer)
+        .boolean;
   }
 
   static final _id_getFormatName = _class.instanceMethodId(
@@ -552,6 +841,18 @@
     r"()Ljava/lang/String;",
   );
 
+  static final _getFormatName = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public java.lang.String getFormatName()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -562,7 +863,9 @@
   /// implementation will return null for all sub-classes
   ///@return Name of the format handled by parsers, generators this factory creates
   jni.JString getFormatName() {
-    return _id_getFormatName(this, const jni.JStringType(), []);
+    return _getFormatName(
+            reference.pointer, _id_getFormatName as jni.JMethodIDPtr)
+        .object(const jni.JStringType());
   }
 
   static final _id_hasFormat = _class.instanceMethodId(
@@ -570,13 +873,25 @@
     r"(Lcom/fasterxml/jackson/core/format/InputAccessor;)Lcom/fasterxml/jackson/core/format/MatchStrength;",
   );
 
+  static final _hasFormat = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.format.MatchStrength hasFormat(com.fasterxml.jackson.core.format.InputAccessor acc)
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject hasFormat(
     jni.JObject acc,
   ) {
-    return _id_hasFormat(
-        this, const jni.JObjectType(), [acc.reference.pointer]);
+    return _hasFormat(reference.pointer, _id_hasFormat as jni.JMethodIDPtr,
+            acc.reference.pointer)
+        .object(const jni.JObjectType());
   }
 
   static final _id_requiresCustomCodec = _class.instanceMethodId(
@@ -584,6 +899,18 @@
     r"()Z",
   );
 
+  static final _requiresCustomCodec = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public boolean requiresCustomCodec()
   ///
   /// Method that can be called to determine if a custom
@@ -596,7 +923,9 @@
   ///   ObjectCodec is enough
   ///@since 2.1
   bool requiresCustomCodec() {
-    return _id_requiresCustomCodec(this, const jni.jbooleanType(), []);
+    return _requiresCustomCodec(
+            reference.pointer, _id_requiresCustomCodec as jni.JMethodIDPtr)
+        .boolean;
   }
 
   static final _id_hasJSONFormat = _class.instanceMethodId(
@@ -604,13 +933,25 @@
     r"(Lcom/fasterxml/jackson/core/format/InputAccessor;)Lcom/fasterxml/jackson/core/format/MatchStrength;",
   );
 
+  static final _hasJSONFormat = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: protected com.fasterxml.jackson.core.format.MatchStrength hasJSONFormat(com.fasterxml.jackson.core.format.InputAccessor acc)
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject hasJSONFormat(
     jni.JObject acc,
   ) {
-    return _id_hasJSONFormat(
-        this, const jni.JObjectType(), [acc.reference.pointer]);
+    return _hasJSONFormat(reference.pointer,
+            _id_hasJSONFormat as jni.JMethodIDPtr, acc.reference.pointer)
+        .object(const jni.JObjectType());
   }
 
   static final _id_version = _class.instanceMethodId(
@@ -618,10 +959,23 @@
     r"()Lcom/fasterxml/jackson/core/Version;",
   );
 
+  static final _version = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// 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 _id_version(this, const jni.JObjectType(), []);
+    return _version(reference.pointer, _id_version as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_configure = _class.instanceMethodId(
@@ -629,6 +983,17 @@
     r"(Lcom/fasterxml/jackson/core/JsonFactory$Feature;Z)Lcom/fasterxml/jackson/core/JsonFactory;",
   );
 
+  static final _configure = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>, ffi.Int64)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>, int)>();
+
   /// from: public final com.fasterxml.jackson.core.JsonFactory configure(com.fasterxml.jackson.core.JsonFactory.Feature f, boolean state)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -642,8 +1007,9 @@
     JsonFactory_Feature f,
     bool state,
   ) {
-    return _id_configure(
-        this, const $JsonFactoryType(), [f.reference.pointer, state ? 1 : 0]);
+    return _configure(reference.pointer, _id_configure as jni.JMethodIDPtr,
+            f.reference.pointer, state ? 1 : 0)
+        .object(const $JsonFactoryType());
   }
 
   static final _id_enable = _class.instanceMethodId(
@@ -651,6 +1017,17 @@
     r"(Lcom/fasterxml/jackson/core/JsonFactory$Feature;)Lcom/fasterxml/jackson/core/JsonFactory;",
   );
 
+  static final _enable = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonFactory enable(com.fasterxml.jackson.core.JsonFactory.Feature f)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -662,7 +1039,9 @@
   JsonFactory enable(
     JsonFactory_Feature f,
   ) {
-    return _id_enable(this, const $JsonFactoryType(), [f.reference.pointer]);
+    return _enable(reference.pointer, _id_enable as jni.JMethodIDPtr,
+            f.reference.pointer)
+        .object(const $JsonFactoryType());
   }
 
   static final _id_disable = _class.instanceMethodId(
@@ -670,6 +1049,17 @@
     r"(Lcom/fasterxml/jackson/core/JsonFactory$Feature;)Lcom/fasterxml/jackson/core/JsonFactory;",
   );
 
+  static final _disable = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonFactory disable(com.fasterxml.jackson.core.JsonFactory.Feature f)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -681,7 +1071,9 @@
   JsonFactory disable(
     JsonFactory_Feature f,
   ) {
-    return _id_disable(this, const $JsonFactoryType(), [f.reference.pointer]);
+    return _disable(reference.pointer, _id_disable as jni.JMethodIDPtr,
+            f.reference.pointer)
+        .object(const $JsonFactoryType());
   }
 
   static final _id_isEnabled = _class.instanceMethodId(
@@ -689,6 +1081,17 @@
     r"(Lcom/fasterxml/jackson/core/JsonFactory$Feature;)Z",
   );
 
+  static final _isEnabled = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public final boolean isEnabled(com.fasterxml.jackson.core.JsonFactory.Feature f)
   ///
   /// Checked whether specified parser feature is enabled.
@@ -697,7 +1100,9 @@
   bool isEnabled(
     JsonFactory_Feature f,
   ) {
-    return _id_isEnabled(this, const jni.jbooleanType(), [f.reference.pointer]);
+    return _isEnabled(reference.pointer, _id_isEnabled as jni.JMethodIDPtr,
+            f.reference.pointer)
+        .boolean;
   }
 
   static final _id_getParserFeatures = _class.instanceMethodId(
@@ -705,9 +1110,23 @@
     r"()I",
   );
 
+  static final _getParserFeatures = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public final int getParserFeatures()
   int getParserFeatures() {
-    return _id_getParserFeatures(this, const jni.jintType(), []);
+    return _getParserFeatures(
+            reference.pointer, _id_getParserFeatures as jni.JMethodIDPtr)
+        .integer;
   }
 
   static final _id_getGeneratorFeatures = _class.instanceMethodId(
@@ -715,9 +1134,23 @@
     r"()I",
   );
 
+  static final _getGeneratorFeatures = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public final int getGeneratorFeatures()
   int getGeneratorFeatures() {
-    return _id_getGeneratorFeatures(this, const jni.jintType(), []);
+    return _getGeneratorFeatures(
+            reference.pointer, _id_getGeneratorFeatures as jni.JMethodIDPtr)
+        .integer;
   }
 
   static final _id_getFormatParserFeatures = _class.instanceMethodId(
@@ -725,9 +1158,23 @@
     r"()I",
   );
 
+  static final _getFormatParserFeatures = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public int getFormatParserFeatures()
   int getFormatParserFeatures() {
-    return _id_getFormatParserFeatures(this, const jni.jintType(), []);
+    return _getFormatParserFeatures(
+            reference.pointer, _id_getFormatParserFeatures as jni.JMethodIDPtr)
+        .integer;
   }
 
   static final _id_getFormatGeneratorFeatures = _class.instanceMethodId(
@@ -735,9 +1182,23 @@
     r"()I",
   );
 
+  static final _getFormatGeneratorFeatures = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public int getFormatGeneratorFeatures()
   int getFormatGeneratorFeatures() {
-    return _id_getFormatGeneratorFeatures(this, const jni.jintType(), []);
+    return _getFormatGeneratorFeatures(reference.pointer,
+            _id_getFormatGeneratorFeatures as jni.JMethodIDPtr)
+        .integer;
   }
 
   static final _id_configure1 = _class.instanceMethodId(
@@ -745,6 +1206,17 @@
     r"(Lcom/fasterxml/jackson/core/JsonParser$Feature;Z)Lcom/fasterxml/jackson/core/JsonFactory;",
   );
 
+  static final _configure1 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>, ffi.Int64)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>, int)>();
+
   /// from: public final com.fasterxml.jackson.core.JsonFactory configure(com.fasterxml.jackson.core.JsonParser.Feature f, boolean state)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -757,8 +1229,9 @@
     jsonparser_.JsonParser_Feature f,
     bool state,
   ) {
-    return _id_configure1(
-        this, const $JsonFactoryType(), [f.reference.pointer, state ? 1 : 0]);
+    return _configure1(reference.pointer, _id_configure1 as jni.JMethodIDPtr,
+            f.reference.pointer, state ? 1 : 0)
+        .object(const $JsonFactoryType());
   }
 
   static final _id_enable1 = _class.instanceMethodId(
@@ -766,6 +1239,17 @@
     r"(Lcom/fasterxml/jackson/core/JsonParser$Feature;)Lcom/fasterxml/jackson/core/JsonFactory;",
   );
 
+  static final _enable1 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonFactory enable(com.fasterxml.jackson.core.JsonParser.Feature f)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -776,7 +1260,9 @@
   JsonFactory enable1(
     jsonparser_.JsonParser_Feature f,
   ) {
-    return _id_enable1(this, const $JsonFactoryType(), [f.reference.pointer]);
+    return _enable1(reference.pointer, _id_enable1 as jni.JMethodIDPtr,
+            f.reference.pointer)
+        .object(const $JsonFactoryType());
   }
 
   static final _id_disable1 = _class.instanceMethodId(
@@ -784,6 +1270,17 @@
     r"(Lcom/fasterxml/jackson/core/JsonParser$Feature;)Lcom/fasterxml/jackson/core/JsonFactory;",
   );
 
+  static final _disable1 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonFactory disable(com.fasterxml.jackson.core.JsonParser.Feature f)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -794,7 +1291,9 @@
   JsonFactory disable1(
     jsonparser_.JsonParser_Feature f,
   ) {
-    return _id_disable1(this, const $JsonFactoryType(), [f.reference.pointer]);
+    return _disable1(reference.pointer, _id_disable1 as jni.JMethodIDPtr,
+            f.reference.pointer)
+        .object(const $JsonFactoryType());
   }
 
   static final _id_isEnabled1 = _class.instanceMethodId(
@@ -802,6 +1301,17 @@
     r"(Lcom/fasterxml/jackson/core/JsonParser$Feature;)Z",
   );
 
+  static final _isEnabled1 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public final boolean isEnabled(com.fasterxml.jackson.core.JsonParser.Feature f)
   ///
   /// Method for checking if the specified parser feature is enabled.
@@ -810,8 +1320,9 @@
   bool isEnabled1(
     jsonparser_.JsonParser_Feature f,
   ) {
-    return _id_isEnabled1(
-        this, const jni.jbooleanType(), [f.reference.pointer]);
+    return _isEnabled1(reference.pointer, _id_isEnabled1 as jni.JMethodIDPtr,
+            f.reference.pointer)
+        .boolean;
   }
 
   static final _id_isEnabled2 = _class.instanceMethodId(
@@ -819,6 +1330,17 @@
     r"(Lcom/fasterxml/jackson/core/StreamReadFeature;)Z",
   );
 
+  static final _isEnabled2 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public final boolean isEnabled(com.fasterxml.jackson.core.StreamReadFeature f)
   ///
   /// Method for checking if the specified stream read feature is enabled.
@@ -828,8 +1350,9 @@
   bool isEnabled2(
     jni.JObject f,
   ) {
-    return _id_isEnabled2(
-        this, const jni.jbooleanType(), [f.reference.pointer]);
+    return _isEnabled2(reference.pointer, _id_isEnabled2 as jni.JMethodIDPtr,
+            f.reference.pointer)
+        .boolean;
   }
 
   static final _id_getInputDecorator = _class.instanceMethodId(
@@ -837,6 +1360,18 @@
     r"()Lcom/fasterxml/jackson/core/io/InputDecorator;",
   );
 
+  static final _getInputDecorator = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public com.fasterxml.jackson.core.io.InputDecorator getInputDecorator()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -844,7 +1379,9 @@
   /// there is no default decorator).
   ///@return InputDecorator configured, if any
   jni.JObject getInputDecorator() {
-    return _id_getInputDecorator(this, const jni.JObjectType(), []);
+    return _getInputDecorator(
+            reference.pointer, _id_getInputDecorator as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_setInputDecorator = _class.instanceMethodId(
@@ -852,6 +1389,17 @@
     r"(Lcom/fasterxml/jackson/core/io/InputDecorator;)Lcom/fasterxml/jackson/core/JsonFactory;",
   );
 
+  static final _setInputDecorator = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonFactory setInputDecorator(com.fasterxml.jackson.core.io.InputDecorator d)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -862,8 +1410,9 @@
   JsonFactory setInputDecorator(
     jni.JObject d,
   ) {
-    return _id_setInputDecorator(
-        this, const $JsonFactoryType(), [d.reference.pointer]);
+    return _setInputDecorator(reference.pointer,
+            _id_setInputDecorator as jni.JMethodIDPtr, d.reference.pointer)
+        .object(const $JsonFactoryType());
   }
 
   static final _id_configure2 = _class.instanceMethodId(
@@ -871,6 +1420,17 @@
     r"(Lcom/fasterxml/jackson/core/JsonGenerator$Feature;Z)Lcom/fasterxml/jackson/core/JsonFactory;",
   );
 
+  static final _configure2 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>, ffi.Int64)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>, int)>();
+
   /// from: public final com.fasterxml.jackson.core.JsonFactory configure(com.fasterxml.jackson.core.JsonGenerator.Feature f, boolean state)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -883,8 +1443,9 @@
     jni.JObject f,
     bool state,
   ) {
-    return _id_configure2(
-        this, const $JsonFactoryType(), [f.reference.pointer, state ? 1 : 0]);
+    return _configure2(reference.pointer, _id_configure2 as jni.JMethodIDPtr,
+            f.reference.pointer, state ? 1 : 0)
+        .object(const $JsonFactoryType());
   }
 
   static final _id_enable2 = _class.instanceMethodId(
@@ -892,6 +1453,17 @@
     r"(Lcom/fasterxml/jackson/core/JsonGenerator$Feature;)Lcom/fasterxml/jackson/core/JsonFactory;",
   );
 
+  static final _enable2 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonFactory enable(com.fasterxml.jackson.core.JsonGenerator.Feature f)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -902,7 +1474,9 @@
   JsonFactory enable2(
     jni.JObject f,
   ) {
-    return _id_enable2(this, const $JsonFactoryType(), [f.reference.pointer]);
+    return _enable2(reference.pointer, _id_enable2 as jni.JMethodIDPtr,
+            f.reference.pointer)
+        .object(const $JsonFactoryType());
   }
 
   static final _id_disable2 = _class.instanceMethodId(
@@ -910,6 +1484,17 @@
     r"(Lcom/fasterxml/jackson/core/JsonGenerator$Feature;)Lcom/fasterxml/jackson/core/JsonFactory;",
   );
 
+  static final _disable2 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonFactory disable(com.fasterxml.jackson.core.JsonGenerator.Feature f)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -920,7 +1505,9 @@
   JsonFactory disable2(
     jni.JObject f,
   ) {
-    return _id_disable2(this, const $JsonFactoryType(), [f.reference.pointer]);
+    return _disable2(reference.pointer, _id_disable2 as jni.JMethodIDPtr,
+            f.reference.pointer)
+        .object(const $JsonFactoryType());
   }
 
   static final _id_isEnabled3 = _class.instanceMethodId(
@@ -928,6 +1515,17 @@
     r"(Lcom/fasterxml/jackson/core/JsonGenerator$Feature;)Z",
   );
 
+  static final _isEnabled3 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public final boolean isEnabled(com.fasterxml.jackson.core.JsonGenerator.Feature f)
   ///
   /// Check whether specified generator feature is enabled.
@@ -936,8 +1534,9 @@
   bool isEnabled3(
     jni.JObject f,
   ) {
-    return _id_isEnabled3(
-        this, const jni.jbooleanType(), [f.reference.pointer]);
+    return _isEnabled3(reference.pointer, _id_isEnabled3 as jni.JMethodIDPtr,
+            f.reference.pointer)
+        .boolean;
   }
 
   static final _id_isEnabled4 = _class.instanceMethodId(
@@ -945,6 +1544,17 @@
     r"(Lcom/fasterxml/jackson/core/StreamWriteFeature;)Z",
   );
 
+  static final _isEnabled4 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public final boolean isEnabled(com.fasterxml.jackson.core.StreamWriteFeature f)
   ///
   /// Check whether specified stream write feature is enabled.
@@ -954,8 +1564,9 @@
   bool isEnabled4(
     jni.JObject f,
   ) {
-    return _id_isEnabled4(
-        this, const jni.jbooleanType(), [f.reference.pointer]);
+    return _isEnabled4(reference.pointer, _id_isEnabled4 as jni.JMethodIDPtr,
+            f.reference.pointer)
+        .boolean;
   }
 
   static final _id_getCharacterEscapes = _class.instanceMethodId(
@@ -963,6 +1574,18 @@
     r"()Lcom/fasterxml/jackson/core/io/CharacterEscapes;",
   );
 
+  static final _getCharacterEscapes = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public com.fasterxml.jackson.core.io.CharacterEscapes getCharacterEscapes()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -970,7 +1593,9 @@
   /// it creates.
   ///@return Configured {@code CharacterEscapes}, if any; {@code null} if none
   jni.JObject getCharacterEscapes() {
-    return _id_getCharacterEscapes(this, const jni.JObjectType(), []);
+    return _getCharacterEscapes(
+            reference.pointer, _id_getCharacterEscapes as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_setCharacterEscapes = _class.instanceMethodId(
@@ -978,6 +1603,17 @@
     r"(Lcom/fasterxml/jackson/core/io/CharacterEscapes;)Lcom/fasterxml/jackson/core/JsonFactory;",
   );
 
+  static final _setCharacterEscapes = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonFactory setCharacterEscapes(com.fasterxml.jackson.core.io.CharacterEscapes esc)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -988,8 +1624,9 @@
   JsonFactory setCharacterEscapes(
     jni.JObject esc,
   ) {
-    return _id_setCharacterEscapes(
-        this, const $JsonFactoryType(), [esc.reference.pointer]);
+    return _setCharacterEscapes(reference.pointer,
+            _id_setCharacterEscapes as jni.JMethodIDPtr, esc.reference.pointer)
+        .object(const $JsonFactoryType());
   }
 
   static final _id_getOutputDecorator = _class.instanceMethodId(
@@ -997,6 +1634,18 @@
     r"()Lcom/fasterxml/jackson/core/io/OutputDecorator;",
   );
 
+  static final _getOutputDecorator = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public com.fasterxml.jackson.core.io.OutputDecorator getOutputDecorator()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1005,7 +1654,9 @@
   ///@return OutputDecorator configured for generators factory creates, if any;
   ///    {@code null} if none.
   jni.JObject getOutputDecorator() {
-    return _id_getOutputDecorator(this, const jni.JObjectType(), []);
+    return _getOutputDecorator(
+            reference.pointer, _id_getOutputDecorator as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_setOutputDecorator = _class.instanceMethodId(
@@ -1013,6 +1664,17 @@
     r"(Lcom/fasterxml/jackson/core/io/OutputDecorator;)Lcom/fasterxml/jackson/core/JsonFactory;",
   );
 
+  static final _setOutputDecorator = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonFactory setOutputDecorator(com.fasterxml.jackson.core.io.OutputDecorator d)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1023,8 +1685,9 @@
   JsonFactory setOutputDecorator(
     jni.JObject d,
   ) {
-    return _id_setOutputDecorator(
-        this, const $JsonFactoryType(), [d.reference.pointer]);
+    return _setOutputDecorator(reference.pointer,
+            _id_setOutputDecorator as jni.JMethodIDPtr, d.reference.pointer)
+        .object(const $JsonFactoryType());
   }
 
   static final _id_setRootValueSeparator = _class.instanceMethodId(
@@ -1032,6 +1695,17 @@
     r"(Ljava/lang/String;)Lcom/fasterxml/jackson/core/JsonFactory;",
   );
 
+  static final _setRootValueSeparator = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonFactory setRootValueSeparator(java.lang.String sep)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1043,8 +1717,11 @@
   JsonFactory setRootValueSeparator(
     jni.JString sep,
   ) {
-    return _id_setRootValueSeparator(
-        this, const $JsonFactoryType(), [sep.reference.pointer]);
+    return _setRootValueSeparator(
+            reference.pointer,
+            _id_setRootValueSeparator as jni.JMethodIDPtr,
+            sep.reference.pointer)
+        .object(const $JsonFactoryType());
   }
 
   static final _id_getRootValueSeparator = _class.instanceMethodId(
@@ -1052,12 +1729,26 @@
     r"()Ljava/lang/String;",
   );
 
+  static final _getRootValueSeparator = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public java.lang.String getRootValueSeparator()
   /// The returned object must be released after use, by calling the [release] method.
   ///
   /// @return Root value separator configured, if any
   jni.JString getRootValueSeparator() {
-    return _id_getRootValueSeparator(this, const jni.JStringType(), []);
+    return _getRootValueSeparator(
+            reference.pointer, _id_getRootValueSeparator as jni.JMethodIDPtr)
+        .object(const jni.JStringType());
   }
 
   static final _id_setCodec = _class.instanceMethodId(
@@ -1065,6 +1756,17 @@
     r"(Lcom/fasterxml/jackson/core/ObjectCodec;)Lcom/fasterxml/jackson/core/JsonFactory;",
   );
 
+  static final _setCodec = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonFactory setCodec(com.fasterxml.jackson.core.ObjectCodec oc)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1078,7 +1780,9 @@
   JsonFactory setCodec(
     jni.JObject oc,
   ) {
-    return _id_setCodec(this, const $JsonFactoryType(), [oc.reference.pointer]);
+    return _setCodec(reference.pointer, _id_setCodec as jni.JMethodIDPtr,
+            oc.reference.pointer)
+        .object(const $JsonFactoryType());
   }
 
   static final _id_getCodec = _class.instanceMethodId(
@@ -1086,10 +1790,23 @@
     r"()Lcom/fasterxml/jackson/core/ObjectCodec;",
   );
 
+  static final _getCodec = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// 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 _id_getCodec(this, const jni.JObjectType(), []);
+    return _getCodec(reference.pointer, _id_getCodec as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_createParser = _class.instanceMethodId(
@@ -1097,6 +1814,17 @@
     r"(Ljava/io/File;)Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _createParser = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonParser createParser(java.io.File f)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1119,8 +1847,9 @@
   jsonparser_.JsonParser createParser(
     jni.JObject f,
   ) {
-    return _id_createParser(
-        this, const jsonparser_.$JsonParserType(), [f.reference.pointer]);
+    return _createParser(reference.pointer,
+            _id_createParser as jni.JMethodIDPtr, f.reference.pointer)
+        .object(const jsonparser_.$JsonParserType());
   }
 
   static final _id_createParser1 = _class.instanceMethodId(
@@ -1128,6 +1857,17 @@
     r"(Ljava/net/URL;)Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _createParser1 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonParser createParser(java.net.URL url)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1148,8 +1888,9 @@
   jsonparser_.JsonParser createParser1(
     jni.JObject url,
   ) {
-    return _id_createParser1(
-        this, const jsonparser_.$JsonParserType(), [url.reference.pointer]);
+    return _createParser1(reference.pointer,
+            _id_createParser1 as jni.JMethodIDPtr, url.reference.pointer)
+        .object(const jsonparser_.$JsonParserType());
   }
 
   static final _id_createParser2 = _class.instanceMethodId(
@@ -1157,6 +1898,17 @@
     r"(Ljava/io/InputStream;)Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _createParser2 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonParser createParser(java.io.InputStream in)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1180,8 +1932,9 @@
   jsonparser_.JsonParser createParser2(
     jni.JObject in0,
   ) {
-    return _id_createParser2(
-        this, const jsonparser_.$JsonParserType(), [in0.reference.pointer]);
+    return _createParser2(reference.pointer,
+            _id_createParser2 as jni.JMethodIDPtr, in0.reference.pointer)
+        .object(const jsonparser_.$JsonParserType());
   }
 
   static final _id_createParser3 = _class.instanceMethodId(
@@ -1189,6 +1942,17 @@
     r"(Ljava/io/Reader;)Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _createParser3 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonParser createParser(java.io.Reader r)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1205,8 +1969,9 @@
   jsonparser_.JsonParser createParser3(
     jni.JObject r,
   ) {
-    return _id_createParser3(
-        this, const jsonparser_.$JsonParserType(), [r.reference.pointer]);
+    return _createParser3(reference.pointer,
+            _id_createParser3 as jni.JMethodIDPtr, r.reference.pointer)
+        .object(const jsonparser_.$JsonParserType());
   }
 
   static final _id_createParser4 = _class.instanceMethodId(
@@ -1214,6 +1979,17 @@
     r"([B)Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _createParser4 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonParser createParser(byte[] data)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1223,8 +1999,9 @@
   jsonparser_.JsonParser createParser4(
     jni.JArray<jni.jbyte> data,
   ) {
-    return _id_createParser4(
-        this, const jsonparser_.$JsonParserType(), [data.reference.pointer]);
+    return _createParser4(reference.pointer,
+            _id_createParser4 as jni.JMethodIDPtr, data.reference.pointer)
+        .object(const jsonparser_.$JsonParserType());
   }
 
   static final _id_createParser5 = _class.instanceMethodId(
@@ -1232,6 +2009,21 @@
     r"([BII)Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _createParser5 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Int64,
+                        ffi.Int64
+                      )>)>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>, int, int)>();
+
   /// from: public com.fasterxml.jackson.core.JsonParser createParser(byte[] data, int offset, int len)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1246,8 +2038,13 @@
     int offset,
     int len,
   ) {
-    return _id_createParser5(this, const jsonparser_.$JsonParserType(),
-        [data.reference.pointer, jni.JValueInt(offset), jni.JValueInt(len)]);
+    return _createParser5(
+            reference.pointer,
+            _id_createParser5 as jni.JMethodIDPtr,
+            data.reference.pointer,
+            offset,
+            len)
+        .object(const jsonparser_.$JsonParserType());
   }
 
   static final _id_createParser6 = _class.instanceMethodId(
@@ -1255,6 +2052,17 @@
     r"(Ljava/lang/String;)Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _createParser6 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonParser createParser(java.lang.String content)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1264,8 +2072,9 @@
   jsonparser_.JsonParser createParser6(
     jni.JString content,
   ) {
-    return _id_createParser6(
-        this, const jsonparser_.$JsonParserType(), [content.reference.pointer]);
+    return _createParser6(reference.pointer,
+            _id_createParser6 as jni.JMethodIDPtr, content.reference.pointer)
+        .object(const jsonparser_.$JsonParserType());
   }
 
   static final _id_createParser7 = _class.instanceMethodId(
@@ -1273,6 +2082,17 @@
     r"([C)Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _createParser7 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonParser createParser(char[] content)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1282,8 +2102,9 @@
   jsonparser_.JsonParser createParser7(
     jni.JArray<jni.jchar> content,
   ) {
-    return _id_createParser7(
-        this, const jsonparser_.$JsonParserType(), [content.reference.pointer]);
+    return _createParser7(reference.pointer,
+            _id_createParser7 as jni.JMethodIDPtr, content.reference.pointer)
+        .object(const jsonparser_.$JsonParserType());
   }
 
   static final _id_createParser8 = _class.instanceMethodId(
@@ -1291,6 +2112,21 @@
     r"([CII)Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _createParser8 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Int64,
+                        ffi.Int64
+                      )>)>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>, int, int)>();
+
   /// from: public com.fasterxml.jackson.core.JsonParser createParser(char[] content, int offset, int len)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1301,8 +2137,13 @@
     int offset,
     int len,
   ) {
-    return _id_createParser8(this, const jsonparser_.$JsonParserType(),
-        [content.reference.pointer, jni.JValueInt(offset), jni.JValueInt(len)]);
+    return _createParser8(
+            reference.pointer,
+            _id_createParser8 as jni.JMethodIDPtr,
+            content.reference.pointer,
+            offset,
+            len)
+        .object(const jsonparser_.$JsonParserType());
   }
 
   static final _id_createParser9 = _class.instanceMethodId(
@@ -1310,6 +2151,17 @@
     r"(Ljava/io/DataInput;)Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _createParser9 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonParser createParser(java.io.DataInput in)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1322,8 +2174,9 @@
   jsonparser_.JsonParser createParser9(
     jni.JObject in0,
   ) {
-    return _id_createParser9(
-        this, const jsonparser_.$JsonParserType(), [in0.reference.pointer]);
+    return _createParser9(reference.pointer,
+            _id_createParser9 as jni.JMethodIDPtr, in0.reference.pointer)
+        .object(const jsonparser_.$JsonParserType());
   }
 
   static final _id_createNonBlockingByteArrayParser = _class.instanceMethodId(
@@ -1331,6 +2184,19 @@
     r"()Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _createNonBlockingByteArrayParser =
+      ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                    ffi.Pointer<ffi.Void>,
+                    jni.JMethodIDPtr,
+                  )>>("globalEnv_CallObjectMethod")
+          .asFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>();
+
   /// from: public com.fasterxml.jackson.core.JsonParser createNonBlockingByteArrayParser()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1348,8 +2214,9 @@
   /// at this point.
   ///@since 2.9
   jsonparser_.JsonParser createNonBlockingByteArrayParser() {
-    return _id_createNonBlockingByteArrayParser(
-        this, const jsonparser_.$JsonParserType(), []);
+    return _createNonBlockingByteArrayParser(reference.pointer,
+            _id_createNonBlockingByteArrayParser as jni.JMethodIDPtr)
+        .object(const jsonparser_.$JsonParserType());
   }
 
   static final _id_createGenerator = _class.instanceMethodId(
@@ -1357,6 +2224,20 @@
     r"(Ljava/io/OutputStream;Lcom/fasterxml/jackson/core/JsonEncoding;)Lcom/fasterxml/jackson/core/JsonGenerator;",
   );
 
+  static final _createGenerator = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>
+                      )>)>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonGenerator createGenerator(java.io.OutputStream out, com.fasterxml.jackson.core.JsonEncoding enc)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1382,8 +2263,12 @@
     jni.JObject out,
     jni.JObject enc,
   ) {
-    return _id_createGenerator(this, const jni.JObjectType(),
-        [out.reference.pointer, enc.reference.pointer]);
+    return _createGenerator(
+            reference.pointer,
+            _id_createGenerator as jni.JMethodIDPtr,
+            out.reference.pointer,
+            enc.reference.pointer)
+        .object(const jni.JObjectType());
   }
 
   static final _id_createGenerator1 = _class.instanceMethodId(
@@ -1391,6 +2276,17 @@
     r"(Ljava/io/OutputStream;)Lcom/fasterxml/jackson/core/JsonGenerator;",
   );
 
+  static final _createGenerator1 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonGenerator createGenerator(java.io.OutputStream out)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1402,8 +2298,9 @@
   jni.JObject createGenerator1(
     jni.JObject out,
   ) {
-    return _id_createGenerator1(
-        this, const jni.JObjectType(), [out.reference.pointer]);
+    return _createGenerator1(reference.pointer,
+            _id_createGenerator1 as jni.JMethodIDPtr, out.reference.pointer)
+        .object(const jni.JObjectType());
   }
 
   static final _id_createGenerator2 = _class.instanceMethodId(
@@ -1411,6 +2308,17 @@
     r"(Ljava/io/Writer;)Lcom/fasterxml/jackson/core/JsonGenerator;",
   );
 
+  static final _createGenerator2 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonGenerator createGenerator(java.io.Writer w)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1428,8 +2336,9 @@
   jni.JObject createGenerator2(
     jni.JObject w,
   ) {
-    return _id_createGenerator2(
-        this, const jni.JObjectType(), [w.reference.pointer]);
+    return _createGenerator2(reference.pointer,
+            _id_createGenerator2 as jni.JMethodIDPtr, w.reference.pointer)
+        .object(const jni.JObjectType());
   }
 
   static final _id_createGenerator3 = _class.instanceMethodId(
@@ -1437,6 +2346,20 @@
     r"(Ljava/io/File;Lcom/fasterxml/jackson/core/JsonEncoding;)Lcom/fasterxml/jackson/core/JsonGenerator;",
   );
 
+  static final _createGenerator3 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>
+                      )>)>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonGenerator createGenerator(java.io.File f, com.fasterxml.jackson.core.JsonEncoding enc)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1456,8 +2379,12 @@
     jni.JObject f,
     jni.JObject enc,
   ) {
-    return _id_createGenerator3(this, const jni.JObjectType(),
-        [f.reference.pointer, enc.reference.pointer]);
+    return _createGenerator3(
+            reference.pointer,
+            _id_createGenerator3 as jni.JMethodIDPtr,
+            f.reference.pointer,
+            enc.reference.pointer)
+        .object(const jni.JObjectType());
   }
 
   static final _id_createGenerator4 = _class.instanceMethodId(
@@ -1465,6 +2392,20 @@
     r"(Ljava/io/DataOutput;Lcom/fasterxml/jackson/core/JsonEncoding;)Lcom/fasterxml/jackson/core/JsonGenerator;",
   );
 
+  static final _createGenerator4 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>
+                      )>)>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonGenerator createGenerator(java.io.DataOutput out, com.fasterxml.jackson.core.JsonEncoding enc)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1475,8 +2416,12 @@
     jni.JObject out,
     jni.JObject enc,
   ) {
-    return _id_createGenerator4(this, const jni.JObjectType(),
-        [out.reference.pointer, enc.reference.pointer]);
+    return _createGenerator4(
+            reference.pointer,
+            _id_createGenerator4 as jni.JMethodIDPtr,
+            out.reference.pointer,
+            enc.reference.pointer)
+        .object(const jni.JObjectType());
   }
 
   static final _id_createGenerator5 = _class.instanceMethodId(
@@ -1484,6 +2429,17 @@
     r"(Ljava/io/DataOutput;)Lcom/fasterxml/jackson/core/JsonGenerator;",
   );
 
+  static final _createGenerator5 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonGenerator createGenerator(java.io.DataOutput out)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1495,8 +2451,9 @@
   jni.JObject createGenerator5(
     jni.JObject out,
   ) {
-    return _id_createGenerator5(
-        this, const jni.JObjectType(), [out.reference.pointer]);
+    return _createGenerator5(reference.pointer,
+            _id_createGenerator5 as jni.JMethodIDPtr, out.reference.pointer)
+        .object(const jni.JObjectType());
   }
 
   static final _id_createJsonParser = _class.instanceMethodId(
@@ -1504,6 +2461,17 @@
     r"(Ljava/io/File;)Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _createJsonParser = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonParser createJsonParser(java.io.File f)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1528,8 +2496,9 @@
   jsonparser_.JsonParser createJsonParser(
     jni.JObject f,
   ) {
-    return _id_createJsonParser(
-        this, const jsonparser_.$JsonParserType(), [f.reference.pointer]);
+    return _createJsonParser(reference.pointer,
+            _id_createJsonParser as jni.JMethodIDPtr, f.reference.pointer)
+        .object(const jsonparser_.$JsonParserType());
   }
 
   static final _id_createJsonParser1 = _class.instanceMethodId(
@@ -1537,6 +2506,17 @@
     r"(Ljava/net/URL;)Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _createJsonParser1 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonParser createJsonParser(java.net.URL url)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1560,8 +2540,9 @@
   jsonparser_.JsonParser createJsonParser1(
     jni.JObject url,
   ) {
-    return _id_createJsonParser1(
-        this, const jsonparser_.$JsonParserType(), [url.reference.pointer]);
+    return _createJsonParser1(reference.pointer,
+            _id_createJsonParser1 as jni.JMethodIDPtr, url.reference.pointer)
+        .object(const jsonparser_.$JsonParserType());
   }
 
   static final _id_createJsonParser2 = _class.instanceMethodId(
@@ -1569,6 +2550,17 @@
     r"(Ljava/io/InputStream;)Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _createJsonParser2 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonParser createJsonParser(java.io.InputStream in)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1595,8 +2587,9 @@
   jsonparser_.JsonParser createJsonParser2(
     jni.JObject in0,
   ) {
-    return _id_createJsonParser2(
-        this, const jsonparser_.$JsonParserType(), [in0.reference.pointer]);
+    return _createJsonParser2(reference.pointer,
+            _id_createJsonParser2 as jni.JMethodIDPtr, in0.reference.pointer)
+        .object(const jsonparser_.$JsonParserType());
   }
 
   static final _id_createJsonParser3 = _class.instanceMethodId(
@@ -1604,6 +2597,17 @@
     r"(Ljava/io/Reader;)Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _createJsonParser3 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonParser createJsonParser(java.io.Reader r)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1623,8 +2627,9 @@
   jsonparser_.JsonParser createJsonParser3(
     jni.JObject r,
   ) {
-    return _id_createJsonParser3(
-        this, const jsonparser_.$JsonParserType(), [r.reference.pointer]);
+    return _createJsonParser3(reference.pointer,
+            _id_createJsonParser3 as jni.JMethodIDPtr, r.reference.pointer)
+        .object(const jsonparser_.$JsonParserType());
   }
 
   static final _id_createJsonParser4 = _class.instanceMethodId(
@@ -1632,6 +2637,17 @@
     r"([B)Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _createJsonParser4 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonParser createJsonParser(byte[] data)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1644,8 +2660,9 @@
   jsonparser_.JsonParser createJsonParser4(
     jni.JArray<jni.jbyte> data,
   ) {
-    return _id_createJsonParser4(
-        this, const jsonparser_.$JsonParserType(), [data.reference.pointer]);
+    return _createJsonParser4(reference.pointer,
+            _id_createJsonParser4 as jni.JMethodIDPtr, data.reference.pointer)
+        .object(const jsonparser_.$JsonParserType());
   }
 
   static final _id_createJsonParser5 = _class.instanceMethodId(
@@ -1653,6 +2670,21 @@
     r"([BII)Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _createJsonParser5 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Int64,
+                        ffi.Int64
+                      )>)>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>, int, int)>();
+
   /// from: public com.fasterxml.jackson.core.JsonParser createJsonParser(byte[] data, int offset, int len)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1670,8 +2702,13 @@
     int offset,
     int len,
   ) {
-    return _id_createJsonParser5(this, const jsonparser_.$JsonParserType(),
-        [data.reference.pointer, jni.JValueInt(offset), jni.JValueInt(len)]);
+    return _createJsonParser5(
+            reference.pointer,
+            _id_createJsonParser5 as jni.JMethodIDPtr,
+            data.reference.pointer,
+            offset,
+            len)
+        .object(const jsonparser_.$JsonParserType());
   }
 
   static final _id_createJsonParser6 = _class.instanceMethodId(
@@ -1679,6 +2716,17 @@
     r"(Ljava/lang/String;)Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _createJsonParser6 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonParser createJsonParser(java.lang.String content)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1692,8 +2740,11 @@
   jsonparser_.JsonParser createJsonParser6(
     jni.JString content,
   ) {
-    return _id_createJsonParser6(
-        this, const jsonparser_.$JsonParserType(), [content.reference.pointer]);
+    return _createJsonParser6(
+            reference.pointer,
+            _id_createJsonParser6 as jni.JMethodIDPtr,
+            content.reference.pointer)
+        .object(const jsonparser_.$JsonParserType());
   }
 
   static final _id_createJsonGenerator = _class.instanceMethodId(
@@ -1701,6 +2752,20 @@
     r"(Ljava/io/OutputStream;Lcom/fasterxml/jackson/core/JsonEncoding;)Lcom/fasterxml/jackson/core/JsonGenerator;",
   );
 
+  static final _createJsonGenerator = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>
+                      )>)>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonGenerator createJsonGenerator(java.io.OutputStream out, com.fasterxml.jackson.core.JsonEncoding enc)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1728,8 +2793,12 @@
     jni.JObject out,
     jni.JObject enc,
   ) {
-    return _id_createJsonGenerator(this, const jni.JObjectType(),
-        [out.reference.pointer, enc.reference.pointer]);
+    return _createJsonGenerator(
+            reference.pointer,
+            _id_createJsonGenerator as jni.JMethodIDPtr,
+            out.reference.pointer,
+            enc.reference.pointer)
+        .object(const jni.JObjectType());
   }
 
   static final _id_createJsonGenerator1 = _class.instanceMethodId(
@@ -1737,6 +2806,17 @@
     r"(Ljava/io/Writer;)Lcom/fasterxml/jackson/core/JsonGenerator;",
   );
 
+  static final _createJsonGenerator1 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonGenerator createJsonGenerator(java.io.Writer out)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1756,8 +2836,9 @@
   jni.JObject createJsonGenerator1(
     jni.JObject out,
   ) {
-    return _id_createJsonGenerator1(
-        this, const jni.JObjectType(), [out.reference.pointer]);
+    return _createJsonGenerator1(reference.pointer,
+            _id_createJsonGenerator1 as jni.JMethodIDPtr, out.reference.pointer)
+        .object(const jni.JObjectType());
   }
 
   static final _id_createJsonGenerator2 = _class.instanceMethodId(
@@ -1765,6 +2846,17 @@
     r"(Ljava/io/OutputStream;)Lcom/fasterxml/jackson/core/JsonGenerator;",
   );
 
+  static final _createJsonGenerator2 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonGenerator createJsonGenerator(java.io.OutputStream out)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1779,8 +2871,9 @@
   jni.JObject createJsonGenerator2(
     jni.JObject out,
   ) {
-    return _id_createJsonGenerator2(
-        this, const jni.JObjectType(), [out.reference.pointer]);
+    return _createJsonGenerator2(reference.pointer,
+            _id_createJsonGenerator2 as jni.JMethodIDPtr, out.reference.pointer)
+        .object(const jni.JObjectType());
   }
 }
 
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 f423b52..9a4cce7 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
@@ -63,11 +63,23 @@
     r"()[Lcom/fasterxml/jackson/core/JsonParser$Feature;",
   );
 
+  static final _values = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: static public com.fasterxml.jackson.core.JsonParser.Feature[] values()
   /// The returned object must be released after use, by calling the [release] method.
   static jni.JArray<JsonParser_Feature> values() {
-    return _id_values(
-        _class, const jni.JArrayType($JsonParser_FeatureType()), []);
+    return _values(_class.reference.pointer, _id_values as jni.JMethodIDPtr)
+        .object(const jni.JArrayType($JsonParser_FeatureType()));
   }
 
   static final _id_valueOf = _class.staticMethodId(
@@ -75,13 +87,25 @@
     r"(Ljava/lang/String;)Lcom/fasterxml/jackson/core/JsonParser$Feature;",
   );
 
+  static final _valueOf = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: static public com.fasterxml.jackson.core.JsonParser.Feature valueOf(java.lang.String name)
   /// The returned object must be released after use, by calling the [release] method.
   static JsonParser_Feature valueOf(
     jni.JString name,
   ) {
-    return _id_valueOf(
-        _class, const $JsonParser_FeatureType(), [name.reference.pointer]);
+    return _valueOf(_class.reference.pointer, _id_valueOf as jni.JMethodIDPtr,
+            name.reference.pointer)
+        .object(const $JsonParser_FeatureType());
   }
 
   static final _id_collectDefaults = _class.staticMethodId(
@@ -89,13 +113,27 @@
     r"()I",
   );
 
+  static final _collectDefaults = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallStaticIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: static public int collectDefaults()
   ///
   /// Method that calculates bit set (flags) of all features that
   /// are enabled by default.
   ///@return Bit mask of all features that are enabled by default
   static int collectDefaults() {
-    return _id_collectDefaults(_class, const jni.jintType(), []);
+    return _collectDefaults(
+            _class.reference.pointer, _id_collectDefaults as jni.JMethodIDPtr)
+        .integer;
   }
 
   static final _id_enabledByDefault = _class.instanceMethodId(
@@ -103,9 +141,23 @@
     r"()Z",
   );
 
+  static final _enabledByDefault = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public boolean enabledByDefault()
   bool enabledByDefault() {
-    return _id_enabledByDefault(this, const jni.jbooleanType(), []);
+    return _enabledByDefault(
+            reference.pointer, _id_enabledByDefault as jni.JMethodIDPtr)
+        .boolean;
   }
 
   static final _id_enabledIn = _class.instanceMethodId(
@@ -113,12 +165,21 @@
     r"(I)Z",
   );
 
+  static final _enabledIn = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+                  ffi.VarArgs<(ffi.Int64,)>)>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
+
   /// from: public boolean enabledIn(int flags)
   bool enabledIn(
     int flags,
   ) {
-    return _id_enabledIn(
-        this, const jni.jbooleanType(), [jni.JValueInt(flags)]);
+    return _enabledIn(
+            reference.pointer, _id_enabledIn as jni.JMethodIDPtr, flags)
+        .boolean;
   }
 
   static final _id_getMask = _class.instanceMethodId(
@@ -126,9 +187,21 @@
     r"()I",
   );
 
+  static final _getMask = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public int getMask()
   int getMask() {
-    return _id_getMask(this, const jni.jintType(), []);
+    return _getMask(reference.pointer, _id_getMask as jni.JMethodIDPtr).integer;
   }
 }
 
@@ -180,11 +253,23 @@
     r"()[Lcom/fasterxml/jackson/core/JsonParser$NumberType;",
   );
 
+  static final _values = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: static public com.fasterxml.jackson.core.JsonParser.NumberType[] values()
   /// The returned object must be released after use, by calling the [release] method.
   static jni.JArray<JsonParser_NumberType> values() {
-    return _id_values(
-        _class, const jni.JArrayType($JsonParser_NumberTypeType()), []);
+    return _values(_class.reference.pointer, _id_values as jni.JMethodIDPtr)
+        .object(const jni.JArrayType($JsonParser_NumberTypeType()));
   }
 
   static final _id_valueOf = _class.staticMethodId(
@@ -192,13 +277,25 @@
     r"(Ljava/lang/String;)Lcom/fasterxml/jackson/core/JsonParser$NumberType;",
   );
 
+  static final _valueOf = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: static public com.fasterxml.jackson.core.JsonParser.NumberType valueOf(java.lang.String name)
   /// The returned object must be released after use, by calling the [release] method.
   static JsonParser_NumberType valueOf(
     jni.JString name,
   ) {
-    return _id_valueOf(
-        _class, const $JsonParser_NumberTypeType(), [name.reference.pointer]);
+    return _valueOf(_class.reference.pointer, _id_valueOf as jni.JMethodIDPtr,
+            name.reference.pointer)
+        .object(const $JsonParser_NumberTypeType());
   }
 }
 
@@ -267,23 +364,46 @@
     r"()V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: protected void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory JsonParser() {
-    return JsonParser.fromReference(_id_new0(_class, referenceType, []));
+    return JsonParser.fromReference(
+        _new0(_class.reference.pointer, _id_new0 as jni.JMethodIDPtr)
+            .reference);
   }
 
   static final _id_new1 = _class.constructorId(
     r"(I)V",
   );
 
+  static final _new1 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+                  ffi.VarArgs<(ffi.Int64,)>)>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
+
   /// from: protected void <init>(int features)
   /// The returned object must be released after use, by calling the [release] method.
   factory JsonParser.new1(
     int features,
   ) {
     return JsonParser.fromReference(
-        _id_new1(_class, referenceType, [jni.JValueInt(features)]));
+        _new1(_class.reference.pointer, _id_new1 as jni.JMethodIDPtr, features)
+            .reference);
   }
 
   static final _id_getCodec = _class.instanceMethodId(
@@ -291,6 +411,18 @@
     r"()Lcom/fasterxml/jackson/core/ObjectCodec;",
   );
 
+  static final _getCodec = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract com.fasterxml.jackson.core.ObjectCodec getCodec()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -299,7 +431,8 @@
   /// method (and its variants).
   ///@return Codec assigned to this parser, if any; {@code null} if none
   jni.JObject getCodec() {
-    return _id_getCodec(this, const jni.JObjectType(), []);
+    return _getCodec(reference.pointer, _id_getCodec as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_setCodec = _class.instanceMethodId(
@@ -307,6 +440,17 @@
     r"(Lcom/fasterxml/jackson/core/ObjectCodec;)V",
   );
 
+  static final _setCodec = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JThrowablePtr Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public abstract void setCodec(com.fasterxml.jackson.core.ObjectCodec oc)
   ///
   /// Setter that allows defining ObjectCodec associated with this
@@ -316,7 +460,9 @@
   void setCodec(
     jni.JObject oc,
   ) {
-    _id_setCodec(this, const jni.jvoidType(), [oc.reference.pointer]);
+    _setCodec(reference.pointer, _id_setCodec as jni.JMethodIDPtr,
+            oc.reference.pointer)
+        .check();
   }
 
   static final _id_getInputSource = _class.instanceMethodId(
@@ -324,6 +470,18 @@
     r"()Ljava/lang/Object;",
   );
 
+  static final _getInputSource = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public java.lang.Object getInputSource()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -342,7 +500,9 @@
   /// "last effort", i.e. only used if no other mechanism is applicable.
   ///@return Input source this parser was configured with
   jni.JObject getInputSource() {
-    return _id_getInputSource(this, const jni.JObjectType(), []);
+    return _getInputSource(
+            reference.pointer, _id_getInputSource as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_setRequestPayloadOnError = _class.instanceMethodId(
@@ -350,6 +510,17 @@
     r"(Lcom/fasterxml/jackson/core/util/RequestPayload;)V",
   );
 
+  static final _setRequestPayloadOnError = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JThrowablePtr Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public void setRequestPayloadOnError(com.fasterxml.jackson.core.util.RequestPayload payload)
   ///
   /// Sets the payload to be passed if JsonParseException is thrown.
@@ -358,8 +529,11 @@
   void setRequestPayloadOnError(
     jni.JObject payload,
   ) {
-    _id_setRequestPayloadOnError(
-        this, const jni.jvoidType(), [payload.reference.pointer]);
+    _setRequestPayloadOnError(
+            reference.pointer,
+            _id_setRequestPayloadOnError as jni.JMethodIDPtr,
+            payload.reference.pointer)
+        .check();
   }
 
   static final _id_setRequestPayloadOnError1 = _class.instanceMethodId(
@@ -367,6 +541,20 @@
     r"([BLjava/lang/String;)V",
   );
 
+  static final _setRequestPayloadOnError1 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JThrowablePtr Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>
+                      )>)>>("globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
+
   /// from: public void setRequestPayloadOnError(byte[] payload, java.lang.String charset)
   ///
   /// Sets the byte[] request payload and the charset
@@ -377,8 +565,12 @@
     jni.JArray<jni.jbyte> payload,
     jni.JString charset,
   ) {
-    _id_setRequestPayloadOnError1(this, const jni.jvoidType(),
-        [payload.reference.pointer, charset.reference.pointer]);
+    _setRequestPayloadOnError1(
+            reference.pointer,
+            _id_setRequestPayloadOnError1 as jni.JMethodIDPtr,
+            payload.reference.pointer,
+            charset.reference.pointer)
+        .check();
   }
 
   static final _id_setRequestPayloadOnError2 = _class.instanceMethodId(
@@ -386,6 +578,17 @@
     r"(Ljava/lang/String;)V",
   );
 
+  static final _setRequestPayloadOnError2 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JThrowablePtr Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public void setRequestPayloadOnError(java.lang.String payload)
   ///
   /// Sets the String request payload
@@ -394,8 +597,11 @@
   void setRequestPayloadOnError2(
     jni.JString payload,
   ) {
-    _id_setRequestPayloadOnError2(
-        this, const jni.jvoidType(), [payload.reference.pointer]);
+    _setRequestPayloadOnError2(
+            reference.pointer,
+            _id_setRequestPayloadOnError2 as jni.JMethodIDPtr,
+            payload.reference.pointer)
+        .check();
   }
 
   static final _id_setSchema = _class.instanceMethodId(
@@ -403,6 +609,17 @@
     r"(Lcom/fasterxml/jackson/core/FormatSchema;)V",
   );
 
+  static final _setSchema = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JThrowablePtr Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public void setSchema(com.fasterxml.jackson.core.FormatSchema schema)
   ///
   /// Method to call to make this parser use specified schema. Method must
@@ -418,7 +635,9 @@
   void setSchema(
     jni.JObject schema,
   ) {
-    _id_setSchema(this, const jni.jvoidType(), [schema.reference.pointer]);
+    _setSchema(reference.pointer, _id_setSchema as jni.JMethodIDPtr,
+            schema.reference.pointer)
+        .check();
   }
 
   static final _id_getSchema = _class.instanceMethodId(
@@ -426,6 +645,18 @@
     r"()Lcom/fasterxml/jackson/core/FormatSchema;",
   );
 
+  static final _getSchema = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public com.fasterxml.jackson.core.FormatSchema getSchema()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -434,7 +665,8 @@
   ///@return Schema in use by this parser, if any; {@code null} if none
   ///@since 2.1
   jni.JObject getSchema() {
-    return _id_getSchema(this, const jni.JObjectType(), []);
+    return _getSchema(reference.pointer, _id_getSchema as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_canUseSchema = _class.instanceMethodId(
@@ -442,6 +674,17 @@
     r"(Lcom/fasterxml/jackson/core/FormatSchema;)Z",
   );
 
+  static final _canUseSchema = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public boolean canUseSchema(com.fasterxml.jackson.core.FormatSchema schema)
   ///
   /// Method that can be used to verify that given schema can be used with
@@ -451,8 +694,9 @@
   bool canUseSchema(
     jni.JObject schema,
   ) {
-    return _id_canUseSchema(
-        this, const jni.jbooleanType(), [schema.reference.pointer]);
+    return _canUseSchema(reference.pointer,
+            _id_canUseSchema as jni.JMethodIDPtr, schema.reference.pointer)
+        .boolean;
   }
 
   static final _id_requiresCustomCodec = _class.instanceMethodId(
@@ -460,6 +704,18 @@
     r"()Z",
   );
 
+  static final _requiresCustomCodec = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public boolean requiresCustomCodec()
   ///
   /// Method that can be called to determine if a custom
@@ -471,7 +727,9 @@
   ///   ObjectCodec is enough
   ///@since 2.1
   bool requiresCustomCodec() {
-    return _id_requiresCustomCodec(this, const jni.jbooleanType(), []);
+    return _requiresCustomCodec(
+            reference.pointer, _id_requiresCustomCodec as jni.JMethodIDPtr)
+        .boolean;
   }
 
   static final _id_canParseAsync = _class.instanceMethodId(
@@ -479,6 +737,18 @@
     r"()Z",
   );
 
+  static final _canParseAsync = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public boolean canParseAsync()
   ///
   /// Method that can be called to determine if this parser instance
@@ -493,7 +763,9 @@
   ///@return True if this is a non-blocking ("asynchronous") parser
   ///@since 2.9
   bool canParseAsync() {
-    return _id_canParseAsync(this, const jni.jbooleanType(), []);
+    return _canParseAsync(
+            reference.pointer, _id_canParseAsync as jni.JMethodIDPtr)
+        .boolean;
   }
 
   static final _id_getNonBlockingInputFeeder = _class.instanceMethodId(
@@ -501,6 +773,18 @@
     r"()Lcom/fasterxml/jackson/core/async/NonBlockingInputFeeder;",
   );
 
+  static final _getNonBlockingInputFeeder = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public com.fasterxml.jackson.core.async.NonBlockingInputFeeder getNonBlockingInputFeeder()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -510,7 +794,9 @@
   ///@return Input feeder to use with non-blocking (async) parsing
   ///@since 2.9
   jni.JObject getNonBlockingInputFeeder() {
-    return _id_getNonBlockingInputFeeder(this, const jni.JObjectType(), []);
+    return _getNonBlockingInputFeeder(reference.pointer,
+            _id_getNonBlockingInputFeeder as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_getReadCapabilities = _class.instanceMethodId(
@@ -518,6 +804,18 @@
     r"()Lcom/fasterxml/jackson/core/util/JacksonFeatureSet;",
   );
 
+  static final _getReadCapabilities = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public com.fasterxml.jackson.core.util.JacksonFeatureSet<com.fasterxml.jackson.core.StreamReadCapability> getReadCapabilities()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -526,7 +824,9 @@
   ///@return Set of read capabilities for content to read via this parser
   ///@since 2.12
   jni.JObject getReadCapabilities() {
-    return _id_getReadCapabilities(this, const jni.JObjectType(), []);
+    return _getReadCapabilities(
+            reference.pointer, _id_getReadCapabilities as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_version = _class.instanceMethodId(
@@ -534,6 +834,18 @@
     r"()Lcom/fasterxml/jackson/core/Version;",
   );
 
+  static final _version = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract com.fasterxml.jackson.core.Version version()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -542,7 +854,8 @@
   ///@return Version of this generator (derived from version declared for
   ///   {@code jackson-core} jar that contains the class
   jni.JObject version() {
-    return _id_version(this, const jni.JObjectType(), []);
+    return _version(reference.pointer, _id_version as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_close = _class.instanceMethodId(
@@ -550,6 +863,18 @@
     r"()V",
   );
 
+  static final _close = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JThrowablePtr Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract void close()
   ///
   /// Closes the parser so that no further iteration or data access
@@ -567,7 +892,7 @@
   /// stream or reader it does own them.
   ///@throws IOException if there is either an underlying I/O problem
   void close() {
-    _id_close(this, const jni.jvoidType(), []);
+    _close(reference.pointer, _id_close as jni.JMethodIDPtr).check();
   }
 
   static final _id_isClosed = _class.instanceMethodId(
@@ -575,6 +900,18 @@
     r"()Z",
   );
 
+  static final _isClosed = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract boolean isClosed()
   ///
   /// Method that can be called to determine whether this parser
@@ -585,7 +922,8 @@
   /// end of input.
   ///@return {@code True} if this parser instance has been closed
   bool isClosed() {
-    return _id_isClosed(this, const jni.jbooleanType(), []);
+    return _isClosed(reference.pointer, _id_isClosed as jni.JMethodIDPtr)
+        .boolean;
   }
 
   static final _id_getParsingContext = _class.instanceMethodId(
@@ -593,6 +931,18 @@
     r"()Lcom/fasterxml/jackson/core/JsonStreamContext;",
   );
 
+  static final _getParsingContext = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract com.fasterxml.jackson.core.JsonStreamContext getParsingContext()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -606,7 +956,9 @@
   /// input, if so desired.
   ///@return Stream input context (JsonStreamContext) associated with this parser
   jni.JObject getParsingContext() {
-    return _id_getParsingContext(this, const jni.JObjectType(), []);
+    return _getParsingContext(
+            reference.pointer, _id_getParsingContext as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_currentLocation = _class.instanceMethodId(
@@ -614,6 +966,18 @@
     r"()Lcom/fasterxml/jackson/core/JsonLocation;",
   );
 
+  static final _currentLocation = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public com.fasterxml.jackson.core.JsonLocation currentLocation()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -630,7 +994,9 @@
   ///@return Location of the last processed input unit (byte or character)
   ///@since 2.13
   jni.JObject currentLocation() {
-    return _id_currentLocation(this, const jni.JObjectType(), []);
+    return _currentLocation(
+            reference.pointer, _id_currentLocation as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_currentTokenLocation = _class.instanceMethodId(
@@ -638,6 +1004,18 @@
     r"()Lcom/fasterxml/jackson/core/JsonLocation;",
   );
 
+  static final _currentTokenLocation = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public com.fasterxml.jackson.core.JsonLocation currentTokenLocation()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -654,7 +1032,9 @@
   ///@return Starting location of the token parser currently points to
   ///@since 2.13 (will eventually replace \#getTokenLocation)
   jni.JObject currentTokenLocation() {
-    return _id_currentTokenLocation(this, const jni.JObjectType(), []);
+    return _currentTokenLocation(
+            reference.pointer, _id_currentTokenLocation as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_getCurrentLocation = _class.instanceMethodId(
@@ -662,6 +1042,18 @@
     r"()Lcom/fasterxml/jackson/core/JsonLocation;",
   );
 
+  static final _getCurrentLocation = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract com.fasterxml.jackson.core.JsonLocation getCurrentLocation()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -669,7 +1061,9 @@
   /// Jackson 2.x versions (and removed from Jackson 3.0).
   ///@return Location of the last processed input unit (byte or character)
   jni.JObject getCurrentLocation() {
-    return _id_getCurrentLocation(this, const jni.JObjectType(), []);
+    return _getCurrentLocation(
+            reference.pointer, _id_getCurrentLocation as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_getTokenLocation = _class.instanceMethodId(
@@ -677,6 +1071,18 @@
     r"()Lcom/fasterxml/jackson/core/JsonLocation;",
   );
 
+  static final _getTokenLocation = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract com.fasterxml.jackson.core.JsonLocation getTokenLocation()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -684,7 +1090,9 @@
   /// Jackson 2.x versions (and removed from Jackson 3.0).
   ///@return Starting location of the token parser currently points to
   jni.JObject getTokenLocation() {
-    return _id_getTokenLocation(this, const jni.JObjectType(), []);
+    return _getTokenLocation(
+            reference.pointer, _id_getTokenLocation as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_currentValue = _class.instanceMethodId(
@@ -692,6 +1100,18 @@
     r"()Ljava/lang/Object;",
   );
 
+  static final _currentValue = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public java.lang.Object currentValue()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -707,7 +1127,9 @@
   ///@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 _id_currentValue(this, const jni.JObjectType(), []);
+    return _currentValue(
+            reference.pointer, _id_currentValue as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_assignCurrentValue = _class.instanceMethodId(
@@ -715,6 +1137,17 @@
     r"(Ljava/lang/Object;)V",
   );
 
+  static final _assignCurrentValue = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JThrowablePtr Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public void assignCurrentValue(java.lang.Object v)
   ///
   /// Helper method, usually equivalent to:
@@ -726,7 +1159,9 @@
   void assignCurrentValue(
     jni.JObject v,
   ) {
-    _id_assignCurrentValue(this, const jni.jvoidType(), [v.reference.pointer]);
+    _assignCurrentValue(reference.pointer,
+            _id_assignCurrentValue as jni.JMethodIDPtr, v.reference.pointer)
+        .check();
   }
 
   static final _id_getCurrentValue = _class.instanceMethodId(
@@ -734,6 +1169,18 @@
     r"()Ljava/lang/Object;",
   );
 
+  static final _getCurrentValue = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public java.lang.Object getCurrentValue()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -741,7 +1188,9 @@
   /// 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 _id_getCurrentValue(this, const jni.JObjectType(), []);
+    return _getCurrentValue(
+            reference.pointer, _id_getCurrentValue as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_setCurrentValue = _class.instanceMethodId(
@@ -749,6 +1198,17 @@
     r"(Ljava/lang/Object;)V",
   );
 
+  static final _setCurrentValue = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JThrowablePtr Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public void setCurrentValue(java.lang.Object v)
   ///
   /// Alias for \#assignCurrentValue, to be deprecated in later
@@ -757,7 +1217,9 @@
   void setCurrentValue(
     jni.JObject v,
   ) {
-    _id_setCurrentValue(this, const jni.jvoidType(), [v.reference.pointer]);
+    _setCurrentValue(reference.pointer, _id_setCurrentValue as jni.JMethodIDPtr,
+            v.reference.pointer)
+        .check();
   }
 
   static final _id_releaseBuffered = _class.instanceMethodId(
@@ -765,6 +1227,17 @@
     r"(Ljava/io/OutputStream;)I",
   );
 
+  static final _releaseBuffered = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public int releaseBuffered(java.io.OutputStream out)
   ///
   /// Method that can be called to push back any content that
@@ -781,8 +1254,9 @@
   int releaseBuffered(
     jni.JObject out,
   ) {
-    return _id_releaseBuffered(
-        this, const jni.jintType(), [out.reference.pointer]);
+    return _releaseBuffered(reference.pointer,
+            _id_releaseBuffered as jni.JMethodIDPtr, out.reference.pointer)
+        .integer;
   }
 
   static final _id_releaseBuffered1 = _class.instanceMethodId(
@@ -790,6 +1264,17 @@
     r"(Ljava/io/Writer;)I",
   );
 
+  static final _releaseBuffered1 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public int releaseBuffered(java.io.Writer w)
   ///
   /// Method that can be called to push back any content that
@@ -807,8 +1292,9 @@
   int releaseBuffered1(
     jni.JObject w,
   ) {
-    return _id_releaseBuffered1(
-        this, const jni.jintType(), [w.reference.pointer]);
+    return _releaseBuffered1(reference.pointer,
+            _id_releaseBuffered1 as jni.JMethodIDPtr, w.reference.pointer)
+        .integer;
   }
 
   static final _id_enable = _class.instanceMethodId(
@@ -816,6 +1302,17 @@
     r"(Lcom/fasterxml/jackson/core/JsonParser$Feature;)Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _enable = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonParser enable(com.fasterxml.jackson.core.JsonParser.Feature f)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -826,7 +1323,9 @@
   JsonParser enable(
     JsonParser_Feature f,
   ) {
-    return _id_enable(this, const $JsonParserType(), [f.reference.pointer]);
+    return _enable(reference.pointer, _id_enable as jni.JMethodIDPtr,
+            f.reference.pointer)
+        .object(const $JsonParserType());
   }
 
   static final _id_disable = _class.instanceMethodId(
@@ -834,6 +1333,17 @@
     r"(Lcom/fasterxml/jackson/core/JsonParser$Feature;)Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _disable = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.fasterxml.jackson.core.JsonParser disable(com.fasterxml.jackson.core.JsonParser.Feature f)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -844,7 +1354,9 @@
   JsonParser disable(
     JsonParser_Feature f,
   ) {
-    return _id_disable(this, const $JsonParserType(), [f.reference.pointer]);
+    return _disable(reference.pointer, _id_disable as jni.JMethodIDPtr,
+            f.reference.pointer)
+        .object(const $JsonParserType());
   }
 
   static final _id_configure = _class.instanceMethodId(
@@ -852,6 +1364,17 @@
     r"(Lcom/fasterxml/jackson/core/JsonParser$Feature;Z)Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _configure = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>, ffi.Int64)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>, int)>();
+
   /// from: public com.fasterxml.jackson.core.JsonParser configure(com.fasterxml.jackson.core.JsonParser.Feature f, boolean state)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -864,8 +1387,9 @@
     JsonParser_Feature f,
     bool state,
   ) {
-    return _id_configure(
-        this, const $JsonParserType(), [f.reference.pointer, state ? 1 : 0]);
+    return _configure(reference.pointer, _id_configure as jni.JMethodIDPtr,
+            f.reference.pointer, state ? 1 : 0)
+        .object(const $JsonParserType());
   }
 
   static final _id_isEnabled = _class.instanceMethodId(
@@ -873,6 +1397,17 @@
     r"(Lcom/fasterxml/jackson/core/JsonParser$Feature;)Z",
   );
 
+  static final _isEnabled = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public boolean isEnabled(com.fasterxml.jackson.core.JsonParser.Feature f)
   ///
   /// Method for checking whether specified Feature is enabled.
@@ -881,7 +1416,9 @@
   bool isEnabled(
     JsonParser_Feature f,
   ) {
-    return _id_isEnabled(this, const jni.jbooleanType(), [f.reference.pointer]);
+    return _isEnabled(reference.pointer, _id_isEnabled as jni.JMethodIDPtr,
+            f.reference.pointer)
+        .boolean;
   }
 
   static final _id_isEnabled1 = _class.instanceMethodId(
@@ -889,6 +1426,17 @@
     r"(Lcom/fasterxml/jackson/core/StreamReadFeature;)Z",
   );
 
+  static final _isEnabled1 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public boolean isEnabled(com.fasterxml.jackson.core.StreamReadFeature f)
   ///
   /// Method for checking whether specified Feature is enabled.
@@ -898,8 +1446,9 @@
   bool isEnabled1(
     jni.JObject f,
   ) {
-    return _id_isEnabled1(
-        this, const jni.jbooleanType(), [f.reference.pointer]);
+    return _isEnabled1(reference.pointer, _id_isEnabled1 as jni.JMethodIDPtr,
+            f.reference.pointer)
+        .boolean;
   }
 
   static final _id_getFeatureMask = _class.instanceMethodId(
@@ -907,13 +1456,27 @@
     r"()I",
   );
 
+  static final _getFeatureMask = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public int getFeatureMask()
   ///
   /// Bulk access method for getting state of all standard Features.
   ///@return Bit mask that defines current states of all standard Features.
   ///@since 2.3
   int getFeatureMask() {
-    return _id_getFeatureMask(this, const jni.jintType(), []);
+    return _getFeatureMask(
+            reference.pointer, _id_getFeatureMask as jni.JMethodIDPtr)
+        .integer;
   }
 
   static final _id_setFeatureMask = _class.instanceMethodId(
@@ -921,6 +1484,14 @@
     r"(I)Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _setFeatureMask = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+                  ffi.VarArgs<(ffi.Int64,)>)>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
+
   /// from: public com.fasterxml.jackson.core.JsonParser setFeatureMask(int mask)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -932,8 +1503,9 @@
   JsonParser setFeatureMask(
     int mask,
   ) {
-    return _id_setFeatureMask(
-        this, const $JsonParserType(), [jni.JValueInt(mask)]);
+    return _setFeatureMask(
+            reference.pointer, _id_setFeatureMask as jni.JMethodIDPtr, mask)
+        .object(const $JsonParserType());
   }
 
   static final _id_overrideStdFeatures = _class.instanceMethodId(
@@ -941,6 +1513,15 @@
     r"(II)Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _overrideStdFeatures = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr, ffi.VarArgs<(ffi.Int64, ffi.Int64)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int, int)>();
+
   /// from: public com.fasterxml.jackson.core.JsonParser overrideStdFeatures(int values, int mask)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -960,8 +1541,9 @@
     int values,
     int mask,
   ) {
-    return _id_overrideStdFeatures(this, const $JsonParserType(),
-        [jni.JValueInt(values), jni.JValueInt(mask)]);
+    return _overrideStdFeatures(reference.pointer,
+            _id_overrideStdFeatures as jni.JMethodIDPtr, values, mask)
+        .object(const $JsonParserType());
   }
 
   static final _id_getFormatFeatures = _class.instanceMethodId(
@@ -969,6 +1551,18 @@
     r"()I",
   );
 
+  static final _getFormatFeatures = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public int getFormatFeatures()
   ///
   /// Bulk access method for getting state of all FormatFeatures, format-specific
@@ -976,7 +1570,9 @@
   ///@return Bit mask that defines current states of all standard FormatFeatures.
   ///@since 2.6
   int getFormatFeatures() {
-    return _id_getFormatFeatures(this, const jni.jintType(), []);
+    return _getFormatFeatures(
+            reference.pointer, _id_getFormatFeatures as jni.JMethodIDPtr)
+        .integer;
   }
 
   static final _id_overrideFormatFeatures = _class.instanceMethodId(
@@ -984,6 +1580,15 @@
     r"(II)Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _overrideFormatFeatures = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr, ffi.VarArgs<(ffi.Int64, ffi.Int64)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int, int)>();
+
   /// from: public com.fasterxml.jackson.core.JsonParser overrideFormatFeatures(int values, int mask)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1001,8 +1606,9 @@
     int values,
     int mask,
   ) {
-    return _id_overrideFormatFeatures(this, const $JsonParserType(),
-        [jni.JValueInt(values), jni.JValueInt(mask)]);
+    return _overrideFormatFeatures(reference.pointer,
+            _id_overrideFormatFeatures as jni.JMethodIDPtr, values, mask)
+        .object(const $JsonParserType());
   }
 
   static final _id_nextToken = _class.instanceMethodId(
@@ -1010,6 +1616,18 @@
     r"()Lcom/fasterxml/jackson/core/JsonToken;",
   );
 
+  static final _nextToken = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract com.fasterxml.jackson.core.JsonToken nextToken()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1022,7 +1640,8 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   jsontoken_.JsonToken nextToken() {
-    return _id_nextToken(this, const jsontoken_.$JsonTokenType(), []);
+    return _nextToken(reference.pointer, _id_nextToken as jni.JMethodIDPtr)
+        .object(const jsontoken_.$JsonTokenType());
   }
 
   static final _id_nextValue = _class.instanceMethodId(
@@ -1030,6 +1649,18 @@
     r"()Lcom/fasterxml/jackson/core/JsonToken;",
   );
 
+  static final _nextValue = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract com.fasterxml.jackson.core.JsonToken nextValue()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1050,7 +1681,8 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   jsontoken_.JsonToken nextValue() {
-    return _id_nextValue(this, const jsontoken_.$JsonTokenType(), []);
+    return _nextValue(reference.pointer, _id_nextValue as jni.JMethodIDPtr)
+        .object(const jsontoken_.$JsonTokenType());
   }
 
   static final _id_nextFieldName = _class.instanceMethodId(
@@ -1058,6 +1690,17 @@
     r"(Lcom/fasterxml/jackson/core/SerializableString;)Z",
   );
 
+  static final _nextFieldName = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public boolean nextFieldName(com.fasterxml.jackson.core.SerializableString str)
   ///
   /// Method that fetches next token (as if calling \#nextToken) and
@@ -1078,8 +1721,9 @@
   bool nextFieldName(
     jni.JObject str,
   ) {
-    return _id_nextFieldName(
-        this, const jni.jbooleanType(), [str.reference.pointer]);
+    return _nextFieldName(reference.pointer,
+            _id_nextFieldName as jni.JMethodIDPtr, str.reference.pointer)
+        .boolean;
   }
 
   static final _id_nextFieldName1 = _class.instanceMethodId(
@@ -1087,6 +1731,18 @@
     r"()Ljava/lang/String;",
   );
 
+  static final _nextFieldName1 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public java.lang.String nextFieldName()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1099,7 +1755,9 @@
   ///   JsonParseException for decoding problems
   ///@since 2.5
   jni.JString nextFieldName1() {
-    return _id_nextFieldName1(this, const jni.JStringType(), []);
+    return _nextFieldName1(
+            reference.pointer, _id_nextFieldName1 as jni.JMethodIDPtr)
+        .object(const jni.JStringType());
   }
 
   static final _id_nextTextValue = _class.instanceMethodId(
@@ -1107,6 +1765,18 @@
     r"()Ljava/lang/String;",
   );
 
+  static final _nextTextValue = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public java.lang.String nextTextValue()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1124,7 +1794,9 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   jni.JString nextTextValue() {
-    return _id_nextTextValue(this, const jni.JStringType(), []);
+    return _nextTextValue(
+            reference.pointer, _id_nextTextValue as jni.JMethodIDPtr)
+        .object(const jni.JStringType());
   }
 
   static final _id_nextIntValue = _class.instanceMethodId(
@@ -1132,6 +1804,14 @@
     r"(I)I",
   );
 
+  static final _nextIntValue = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+                  ffi.VarArgs<(ffi.Int64,)>)>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
+
   /// from: public int nextIntValue(int defaultValue)
   ///
   /// Method that fetches next token (as if calling \#nextToken) and
@@ -1154,8 +1834,9 @@
   int nextIntValue(
     int defaultValue,
   ) {
-    return _id_nextIntValue(
-        this, const jni.jintType(), [jni.JValueInt(defaultValue)]);
+    return _nextIntValue(reference.pointer,
+            _id_nextIntValue as jni.JMethodIDPtr, defaultValue)
+        .integer;
   }
 
   static final _id_nextLongValue = _class.instanceMethodId(
@@ -1163,6 +1844,14 @@
     r"(J)J",
   );
 
+  static final _nextLongValue = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+                  ffi.VarArgs<(ffi.Int64,)>)>>("globalEnv_CallLongMethod")
+      .asFunction<
+          jni.JniResult Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
+
   /// from: public long nextLongValue(long defaultValue)
   ///
   /// Method that fetches next token (as if calling \#nextToken) and
@@ -1185,7 +1874,9 @@
   int nextLongValue(
     int defaultValue,
   ) {
-    return _id_nextLongValue(this, const jni.jlongType(), [defaultValue]);
+    return _nextLongValue(reference.pointer,
+            _id_nextLongValue as jni.JMethodIDPtr, defaultValue)
+        .long;
   }
 
   static final _id_nextBooleanValue = _class.instanceMethodId(
@@ -1193,6 +1884,18 @@
     r"()Ljava/lang/Boolean;",
   );
 
+  static final _nextBooleanValue = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public java.lang.Boolean nextBooleanValue()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1213,7 +1916,9 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   jni.JBoolean nextBooleanValue() {
-    return _id_nextBooleanValue(this, const jni.JBooleanType(), []);
+    return _nextBooleanValue(
+            reference.pointer, _id_nextBooleanValue as jni.JMethodIDPtr)
+        .object(const jni.JBooleanType());
   }
 
   static final _id_skipChildren = _class.instanceMethodId(
@@ -1221,6 +1926,18 @@
     r"()Lcom/fasterxml/jackson/core/JsonParser;",
   );
 
+  static final _skipChildren = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract com.fasterxml.jackson.core.JsonParser skipChildren()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1240,7 +1957,9 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   JsonParser skipChildren() {
-    return _id_skipChildren(this, const $JsonParserType(), []);
+    return _skipChildren(
+            reference.pointer, _id_skipChildren as jni.JMethodIDPtr)
+        .object(const $JsonParserType());
   }
 
   static final _id_finishToken = _class.instanceMethodId(
@@ -1248,6 +1967,18 @@
     r"()V",
   );
 
+  static final _finishToken = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JThrowablePtr Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public void finishToken()
   ///
   /// Method that may be used to force full handling of the current token
@@ -1264,7 +1995,8 @@
   ///   JsonParseException for decoding problems
   ///@since 2.8
   void finishToken() {
-    _id_finishToken(this, const jni.jvoidType(), []);
+    _finishToken(reference.pointer, _id_finishToken as jni.JMethodIDPtr)
+        .check();
   }
 
   static final _id_currentToken = _class.instanceMethodId(
@@ -1272,6 +2004,18 @@
     r"()Lcom/fasterxml/jackson/core/JsonToken;",
   );
 
+  static final _currentToken = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public com.fasterxml.jackson.core.JsonToken currentToken()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1285,7 +2029,9 @@
   ///   if the current token has been explicitly cleared.
   ///@since 2.8
   jsontoken_.JsonToken currentToken() {
-    return _id_currentToken(this, const jsontoken_.$JsonTokenType(), []);
+    return _currentToken(
+            reference.pointer, _id_currentToken as jni.JMethodIDPtr)
+        .object(const jsontoken_.$JsonTokenType());
   }
 
   static final _id_currentTokenId = _class.instanceMethodId(
@@ -1293,6 +2039,18 @@
     r"()I",
   );
 
+  static final _currentTokenId = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public int currentTokenId()
   ///
   /// Method similar to \#getCurrentToken() but that returns an
@@ -1305,7 +2063,9 @@
   ///@since 2.8
   ///@return {@code int} matching one of constants from JsonTokenId.
   int currentTokenId() {
-    return _id_currentTokenId(this, const jni.jintType(), []);
+    return _currentTokenId(
+            reference.pointer, _id_currentTokenId as jni.JMethodIDPtr)
+        .integer;
   }
 
   static final _id_getCurrentToken = _class.instanceMethodId(
@@ -1313,6 +2073,18 @@
     r"()Lcom/fasterxml/jackson/core/JsonToken;",
   );
 
+  static final _getCurrentToken = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract com.fasterxml.jackson.core.JsonToken getCurrentToken()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1321,7 +2093,9 @@
   ///@return Type of the token this parser currently points to,
   ///   if any: null before any tokens have been read, and
   jsontoken_.JsonToken getCurrentToken() {
-    return _id_getCurrentToken(this, const jsontoken_.$JsonTokenType(), []);
+    return _getCurrentToken(
+            reference.pointer, _id_getCurrentToken as jni.JMethodIDPtr)
+        .object(const jsontoken_.$JsonTokenType());
   }
 
   static final _id_getCurrentTokenId = _class.instanceMethodId(
@@ -1329,13 +2103,27 @@
     r"()I",
   );
 
+  static final _getCurrentTokenId = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract int getCurrentTokenId()
   ///
   /// Deprecated alias for \#currentTokenId().
   ///@return {@code int} matching one of constants from JsonTokenId.
   ///@deprecated Since 2.12 use \#currentTokenId instead
   int getCurrentTokenId() {
-    return _id_getCurrentTokenId(this, const jni.jintType(), []);
+    return _getCurrentTokenId(
+            reference.pointer, _id_getCurrentTokenId as jni.JMethodIDPtr)
+        .integer;
   }
 
   static final _id_hasCurrentToken = _class.instanceMethodId(
@@ -1343,6 +2131,18 @@
     r"()Z",
   );
 
+  static final _hasCurrentToken = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract boolean hasCurrentToken()
   ///
   /// Method for checking whether parser currently points to
@@ -1354,7 +2154,9 @@
   ///   and returned null from \#nextToken, or the token
   ///   has been consumed)
   bool hasCurrentToken() {
-    return _id_hasCurrentToken(this, const jni.jbooleanType(), []);
+    return _hasCurrentToken(
+            reference.pointer, _id_hasCurrentToken as jni.JMethodIDPtr)
+        .boolean;
   }
 
   static final _id_hasTokenId = _class.instanceMethodId(
@@ -1362,6 +2164,14 @@
     r"(I)Z",
   );
 
+  static final _hasTokenId = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+                  ffi.VarArgs<(ffi.Int64,)>)>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
+
   /// from: public abstract boolean hasTokenId(int id)
   ///
   /// Method that is functionally equivalent to:
@@ -1379,7 +2189,9 @@
   bool hasTokenId(
     int id,
   ) {
-    return _id_hasTokenId(this, const jni.jbooleanType(), [jni.JValueInt(id)]);
+    return _hasTokenId(
+            reference.pointer, _id_hasTokenId as jni.JMethodIDPtr, id)
+        .boolean;
   }
 
   static final _id_hasToken = _class.instanceMethodId(
@@ -1387,6 +2199,17 @@
     r"(Lcom/fasterxml/jackson/core/JsonToken;)Z",
   );
 
+  static final _hasToken = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public abstract boolean hasToken(com.fasterxml.jackson.core.JsonToken t)
   ///
   /// Method that is functionally equivalent to:
@@ -1404,7 +2227,9 @@
   bool hasToken(
     jsontoken_.JsonToken t,
   ) {
-    return _id_hasToken(this, const jni.jbooleanType(), [t.reference.pointer]);
+    return _hasToken(reference.pointer, _id_hasToken as jni.JMethodIDPtr,
+            t.reference.pointer)
+        .boolean;
   }
 
   static final _id_isExpectedStartArrayToken = _class.instanceMethodId(
@@ -1412,6 +2237,18 @@
     r"()Z",
   );
 
+  static final _isExpectedStartArrayToken = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public boolean isExpectedStartArrayToken()
   ///
   /// Specialized accessor that can be used to verify that the current
@@ -1431,7 +2268,9 @@
   ///   start-array marker (such JsonToken\#START_ARRAY);
   ///   {@code false} if not
   bool isExpectedStartArrayToken() {
-    return _id_isExpectedStartArrayToken(this, const jni.jbooleanType(), []);
+    return _isExpectedStartArrayToken(reference.pointer,
+            _id_isExpectedStartArrayToken as jni.JMethodIDPtr)
+        .boolean;
   }
 
   static final _id_isExpectedStartObjectToken = _class.instanceMethodId(
@@ -1439,6 +2278,18 @@
     r"()Z",
   );
 
+  static final _isExpectedStartObjectToken = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public boolean isExpectedStartObjectToken()
   ///
   /// Similar to \#isExpectedStartArrayToken(), but checks whether stream
@@ -1448,7 +2299,9 @@
   ///   {@code false} if not
   ///@since 2.5
   bool isExpectedStartObjectToken() {
-    return _id_isExpectedStartObjectToken(this, const jni.jbooleanType(), []);
+    return _isExpectedStartObjectToken(reference.pointer,
+            _id_isExpectedStartObjectToken as jni.JMethodIDPtr)
+        .boolean;
   }
 
   static final _id_isExpectedNumberIntToken = _class.instanceMethodId(
@@ -1456,6 +2309,18 @@
     r"()Z",
   );
 
+  static final _isExpectedNumberIntToken = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public boolean isExpectedNumberIntToken()
   ///
   /// Similar to \#isExpectedStartArrayToken(), but checks whether stream
@@ -1468,7 +2333,9 @@
   ///   {@code false} if not
   ///@since 2.12
   bool isExpectedNumberIntToken() {
-    return _id_isExpectedNumberIntToken(this, const jni.jbooleanType(), []);
+    return _isExpectedNumberIntToken(
+            reference.pointer, _id_isExpectedNumberIntToken as jni.JMethodIDPtr)
+        .boolean;
   }
 
   static final _id_isNaN = _class.instanceMethodId(
@@ -1476,6 +2343,18 @@
     r"()Z",
   );
 
+  static final _isNaN = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public boolean isNaN()
   ///
   /// Access for checking whether current token is a numeric value token, but
@@ -1491,7 +2370,7 @@
   ///   JsonParseException for decoding problems
   ///@since 2.9
   bool isNaN() {
-    return _id_isNaN(this, const jni.jbooleanType(), []);
+    return _isNaN(reference.pointer, _id_isNaN as jni.JMethodIDPtr).boolean;
   }
 
   static final _id_clearCurrentToken = _class.instanceMethodId(
@@ -1499,6 +2378,18 @@
     r"()V",
   );
 
+  static final _clearCurrentToken = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JThrowablePtr Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract void clearCurrentToken()
   ///
   /// Method called to "consume" the current token by effectively
@@ -1512,7 +2403,9 @@
   /// it has to be able to consume last token used for binding (so that
   /// it will not be used again).
   void clearCurrentToken() {
-    _id_clearCurrentToken(this, const jni.jvoidType(), []);
+    _clearCurrentToken(
+            reference.pointer, _id_clearCurrentToken as jni.JMethodIDPtr)
+        .check();
   }
 
   static final _id_getLastClearedToken = _class.instanceMethodId(
@@ -1520,6 +2413,18 @@
     r"()Lcom/fasterxml/jackson/core/JsonToken;",
   );
 
+  static final _getLastClearedToken = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract com.fasterxml.jackson.core.JsonToken getLastClearedToken()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1530,7 +2435,9 @@
   /// or if parser has been closed.
   ///@return Last cleared token, if any; {@code null} otherwise
   jsontoken_.JsonToken getLastClearedToken() {
-    return _id_getLastClearedToken(this, const jsontoken_.$JsonTokenType(), []);
+    return _getLastClearedToken(
+            reference.pointer, _id_getLastClearedToken as jni.JMethodIDPtr)
+        .object(const jsontoken_.$JsonTokenType());
   }
 
   static final _id_overrideCurrentName = _class.instanceMethodId(
@@ -1538,6 +2445,17 @@
     r"(Ljava/lang/String;)V",
   );
 
+  static final _overrideCurrentName = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JThrowablePtr Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public abstract void overrideCurrentName(java.lang.String name)
   ///
   /// Method that can be used to change what is considered to be
@@ -1551,8 +2469,9 @@
   void overrideCurrentName(
     jni.JString name,
   ) {
-    _id_overrideCurrentName(
-        this, const jni.jvoidType(), [name.reference.pointer]);
+    _overrideCurrentName(reference.pointer,
+            _id_overrideCurrentName as jni.JMethodIDPtr, name.reference.pointer)
+        .check();
   }
 
   static final _id_getCurrentName = _class.instanceMethodId(
@@ -1560,6 +2479,18 @@
     r"()Ljava/lang/String;",
   );
 
+  static final _getCurrentName = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract java.lang.String getCurrentName()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1568,7 +2499,9 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   jni.JString getCurrentName() {
-    return _id_getCurrentName(this, const jni.JStringType(), []);
+    return _getCurrentName(
+            reference.pointer, _id_getCurrentName as jni.JMethodIDPtr)
+        .object(const jni.JStringType());
   }
 
   static final _id_currentName = _class.instanceMethodId(
@@ -1576,6 +2509,18 @@
     r"()Ljava/lang/String;",
   );
 
+  static final _currentName = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public java.lang.String currentName()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1589,7 +2534,8 @@
   ///   JsonParseException for decoding problems
   ///@since 2.10
   jni.JString currentName() {
-    return _id_currentName(this, const jni.JStringType(), []);
+    return _currentName(reference.pointer, _id_currentName as jni.JMethodIDPtr)
+        .object(const jni.JStringType());
   }
 
   static final _id_getText = _class.instanceMethodId(
@@ -1597,6 +2543,18 @@
     r"()Ljava/lang/String;",
   );
 
+  static final _getText = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract java.lang.String getText()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1609,7 +2567,8 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   jni.JString getText() {
-    return _id_getText(this, const jni.JStringType(), []);
+    return _getText(reference.pointer, _id_getText as jni.JMethodIDPtr)
+        .object(const jni.JStringType());
   }
 
   static final _id_getText1 = _class.instanceMethodId(
@@ -1617,6 +2576,17 @@
     r"(Ljava/io/Writer;)I",
   );
 
+  static final _getText1 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public int getText(java.io.Writer writer)
   ///
   /// Method to read the textual representation of the current token in chunks and
@@ -1637,7 +2607,9 @@
   int getText1(
     jni.JObject writer,
   ) {
-    return _id_getText1(this, const jni.jintType(), [writer.reference.pointer]);
+    return _getText1(reference.pointer, _id_getText1 as jni.JMethodIDPtr,
+            writer.reference.pointer)
+        .integer;
   }
 
   static final _id_getTextCharacters = _class.instanceMethodId(
@@ -1645,6 +2617,18 @@
     r"()[C",
   );
 
+  static final _getTextCharacters = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract char[] getTextCharacters()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1676,8 +2660,9 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   jni.JArray<jni.jchar> getTextCharacters() {
-    return _id_getTextCharacters(
-        this, const jni.JArrayType(jni.jcharType()), []);
+    return _getTextCharacters(
+            reference.pointer, _id_getTextCharacters as jni.JMethodIDPtr)
+        .object(const jni.JArrayType(jni.jcharType()));
   }
 
   static final _id_getTextLength = _class.instanceMethodId(
@@ -1685,6 +2670,18 @@
     r"()I",
   );
 
+  static final _getTextLength = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract int getTextLength()
   ///
   /// Accessor used with \#getTextCharacters, to know length
@@ -1695,7 +2692,9 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   int getTextLength() {
-    return _id_getTextLength(this, const jni.jintType(), []);
+    return _getTextLength(
+            reference.pointer, _id_getTextLength as jni.JMethodIDPtr)
+        .integer;
   }
 
   static final _id_getTextOffset = _class.instanceMethodId(
@@ -1703,6 +2702,18 @@
     r"()I",
   );
 
+  static final _getTextOffset = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract int getTextOffset()
   ///
   /// Accessor used with \#getTextCharacters, to know offset
@@ -1713,7 +2724,9 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   int getTextOffset() {
-    return _id_getTextOffset(this, const jni.jintType(), []);
+    return _getTextOffset(
+            reference.pointer, _id_getTextOffset as jni.JMethodIDPtr)
+        .integer;
   }
 
   static final _id_hasTextCharacters = _class.instanceMethodId(
@@ -1721,6 +2734,18 @@
     r"()Z",
   );
 
+  static final _hasTextCharacters = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract boolean hasTextCharacters()
   ///
   /// Method that can be used to determine whether calling of
@@ -1738,7 +2763,9 @@
   ///   be efficiently returned via \#getTextCharacters; false
   ///   means that it may or may not exist
   bool hasTextCharacters() {
-    return _id_hasTextCharacters(this, const jni.jbooleanType(), []);
+    return _hasTextCharacters(
+            reference.pointer, _id_hasTextCharacters as jni.JMethodIDPtr)
+        .boolean;
   }
 
   static final _id_getNumberValue = _class.instanceMethodId(
@@ -1746,6 +2773,18 @@
     r"()Ljava/lang/Number;",
   );
 
+  static final _getNumberValue = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract java.lang.Number getNumberValue()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1760,7 +2799,9 @@
   ///    (invalid format for numbers); plain IOException if underlying
   ///    content read fails (possible if values are extracted lazily)
   jni.JNumber getNumberValue() {
-    return _id_getNumberValue(this, const jni.JNumberType(), []);
+    return _getNumberValue(
+            reference.pointer, _id_getNumberValue as jni.JMethodIDPtr)
+        .object(const jni.JNumberType());
   }
 
   static final _id_getNumberValueExact = _class.instanceMethodId(
@@ -1768,6 +2809,18 @@
     r"()Ljava/lang/Number;",
   );
 
+  static final _getNumberValueExact = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public java.lang.Number getNumberValueExact()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1786,7 +2839,9 @@
   ///    content read fails (possible if values are extracted lazily)
   ///@since 2.12
   jni.JNumber getNumberValueExact() {
-    return _id_getNumberValueExact(this, const jni.JNumberType(), []);
+    return _getNumberValueExact(
+            reference.pointer, _id_getNumberValueExact as jni.JMethodIDPtr)
+        .object(const jni.JNumberType());
   }
 
   static final _id_getNumberType = _class.instanceMethodId(
@@ -1794,6 +2849,18 @@
     r"()Lcom/fasterxml/jackson/core/JsonParser$NumberType;",
   );
 
+  static final _getNumberType = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract com.fasterxml.jackson.core.JsonParser.NumberType getNumberType()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1805,7 +2872,9 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   JsonParser_NumberType getNumberType() {
-    return _id_getNumberType(this, const $JsonParser_NumberTypeType(), []);
+    return _getNumberType(
+            reference.pointer, _id_getNumberType as jni.JMethodIDPtr)
+        .object(const $JsonParser_NumberTypeType());
   }
 
   static final _id_getByteValue = _class.instanceMethodId(
@@ -1813,6 +2882,18 @@
     r"()B",
   );
 
+  static final _getByteValue = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallByteMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public byte getByteValue()
   ///
   /// Numeric accessor that can be called when the current
@@ -1837,7 +2918,9 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   int getByteValue() {
-    return _id_getByteValue(this, const jni.jbyteType(), []);
+    return _getByteValue(
+            reference.pointer, _id_getByteValue as jni.JMethodIDPtr)
+        .byte;
   }
 
   static final _id_getShortValue = _class.instanceMethodId(
@@ -1845,6 +2928,18 @@
     r"()S",
   );
 
+  static final _getShortValue = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallShortMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public short getShortValue()
   ///
   /// Numeric accessor that can be called when the current
@@ -1863,7 +2958,9 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   int getShortValue() {
-    return _id_getShortValue(this, const jni.jshortType(), []);
+    return _getShortValue(
+            reference.pointer, _id_getShortValue as jni.JMethodIDPtr)
+        .short;
   }
 
   static final _id_getIntValue = _class.instanceMethodId(
@@ -1871,6 +2968,18 @@
     r"()I",
   );
 
+  static final _getIntValue = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract int getIntValue()
   ///
   /// Numeric accessor that can be called when the current
@@ -1889,7 +2998,8 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   int getIntValue() {
-    return _id_getIntValue(this, const jni.jintType(), []);
+    return _getIntValue(reference.pointer, _id_getIntValue as jni.JMethodIDPtr)
+        .integer;
   }
 
   static final _id_getLongValue = _class.instanceMethodId(
@@ -1897,6 +3007,18 @@
     r"()J",
   );
 
+  static final _getLongValue = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallLongMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract long getLongValue()
   ///
   /// Numeric accessor that can be called when the current
@@ -1915,7 +3037,9 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   int getLongValue() {
-    return _id_getLongValue(this, const jni.jlongType(), []);
+    return _getLongValue(
+            reference.pointer, _id_getLongValue as jni.JMethodIDPtr)
+        .long;
   }
 
   static final _id_getBigIntegerValue = _class.instanceMethodId(
@@ -1923,6 +3047,18 @@
     r"()Ljava/math/BigInteger;",
   );
 
+  static final _getBigIntegerValue = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract java.math.BigInteger getBigIntegerValue()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -1938,7 +3074,9 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   jni.JObject getBigIntegerValue() {
-    return _id_getBigIntegerValue(this, const jni.JObjectType(), []);
+    return _getBigIntegerValue(
+            reference.pointer, _id_getBigIntegerValue as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_getFloatValue = _class.instanceMethodId(
@@ -1946,6 +3084,18 @@
     r"()F",
   );
 
+  static final _getFloatValue = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallFloatMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract float getFloatValue()
   ///
   /// Numeric accessor that can be called when the current
@@ -1964,7 +3114,9 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   double getFloatValue() {
-    return _id_getFloatValue(this, const jni.jfloatType(), []);
+    return _getFloatValue(
+            reference.pointer, _id_getFloatValue as jni.JMethodIDPtr)
+        .float;
   }
 
   static final _id_getDoubleValue = _class.instanceMethodId(
@@ -1972,6 +3124,18 @@
     r"()D",
   );
 
+  static final _getDoubleValue = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallDoubleMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract double getDoubleValue()
   ///
   /// Numeric accessor that can be called when the current
@@ -1990,7 +3154,9 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   double getDoubleValue() {
-    return _id_getDoubleValue(this, const jni.jdoubleType(), []);
+    return _getDoubleValue(
+            reference.pointer, _id_getDoubleValue as jni.JMethodIDPtr)
+        .doubleFloat;
   }
 
   static final _id_getDecimalValue = _class.instanceMethodId(
@@ -1998,6 +3164,18 @@
     r"()Ljava/math/BigDecimal;",
   );
 
+  static final _getDecimalValue = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract java.math.BigDecimal getDecimalValue()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -2010,7 +3188,9 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   jni.JObject getDecimalValue() {
-    return _id_getDecimalValue(this, const jni.JObjectType(), []);
+    return _getDecimalValue(
+            reference.pointer, _id_getDecimalValue as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_getBooleanValue = _class.instanceMethodId(
@@ -2018,6 +3198,18 @@
     r"()Z",
   );
 
+  static final _getBooleanValue = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public boolean getBooleanValue()
   ///
   /// Convenience accessor that can be called when the current
@@ -2032,7 +3224,9 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   bool getBooleanValue() {
-    return _id_getBooleanValue(this, const jni.jbooleanType(), []);
+    return _getBooleanValue(
+            reference.pointer, _id_getBooleanValue as jni.JMethodIDPtr)
+        .boolean;
   }
 
   static final _id_getEmbeddedObject = _class.instanceMethodId(
@@ -2040,6 +3234,18 @@
     r"()Ljava/lang/Object;",
   );
 
+  static final _getEmbeddedObject = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public java.lang.Object getEmbeddedObject()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -2058,7 +3264,9 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   jni.JObject getEmbeddedObject() {
-    return _id_getEmbeddedObject(this, const jni.JObjectType(), []);
+    return _getEmbeddedObject(
+            reference.pointer, _id_getEmbeddedObject as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_getBinaryValue = _class.instanceMethodId(
@@ -2066,6 +3274,17 @@
     r"(Lcom/fasterxml/jackson/core/Base64Variant;)[B",
   );
 
+  static final _getBinaryValue = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public abstract byte[] getBinaryValue(com.fasterxml.jackson.core.Base64Variant bv)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -2092,8 +3311,9 @@
   jni.JArray<jni.jbyte> getBinaryValue(
     jni.JObject bv,
   ) {
-    return _id_getBinaryValue(
-        this, const jni.JArrayType(jni.jbyteType()), [bv.reference.pointer]);
+    return _getBinaryValue(reference.pointer,
+            _id_getBinaryValue as jni.JMethodIDPtr, bv.reference.pointer)
+        .object(const jni.JArrayType(jni.jbyteType()));
   }
 
   static final _id_getBinaryValue1 = _class.instanceMethodId(
@@ -2101,6 +3321,18 @@
     r"()[B",
   );
 
+  static final _getBinaryValue1 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public byte[] getBinaryValue()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -2111,7 +3343,9 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   jni.JArray<jni.jbyte> getBinaryValue1() {
-    return _id_getBinaryValue1(this, const jni.JArrayType(jni.jbyteType()), []);
+    return _getBinaryValue1(
+            reference.pointer, _id_getBinaryValue1 as jni.JMethodIDPtr)
+        .object(const jni.JArrayType(jni.jbyteType()));
   }
 
   static final _id_readBinaryValue = _class.instanceMethodId(
@@ -2119,6 +3353,17 @@
     r"(Ljava/io/OutputStream;)I",
   );
 
+  static final _readBinaryValue = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public int readBinaryValue(java.io.OutputStream out)
   ///
   /// Method that can be used as an alternative to \#getBigIntegerValue(),
@@ -2135,8 +3380,9 @@
   int readBinaryValue(
     jni.JObject out,
   ) {
-    return _id_readBinaryValue(
-        this, const jni.jintType(), [out.reference.pointer]);
+    return _readBinaryValue(reference.pointer,
+            _id_readBinaryValue as jni.JMethodIDPtr, out.reference.pointer)
+        .integer;
   }
 
   static final _id_readBinaryValue1 = _class.instanceMethodId(
@@ -2144,6 +3390,20 @@
     r"(Lcom/fasterxml/jackson/core/Base64Variant;Ljava/io/OutputStream;)I",
   );
 
+  static final _readBinaryValue1 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>
+                      )>)>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
+
   /// from: public int readBinaryValue(com.fasterxml.jackson.core.Base64Variant bv, java.io.OutputStream out)
   ///
   /// Similar to \#readBinaryValue(OutputStream) but allows explicitly
@@ -2158,8 +3418,12 @@
     jni.JObject bv,
     jni.JObject out,
   ) {
-    return _id_readBinaryValue1(this, const jni.jintType(),
-        [bv.reference.pointer, out.reference.pointer]);
+    return _readBinaryValue1(
+            reference.pointer,
+            _id_readBinaryValue1 as jni.JMethodIDPtr,
+            bv.reference.pointer,
+            out.reference.pointer)
+        .integer;
   }
 
   static final _id_getValueAsInt = _class.instanceMethodId(
@@ -2167,6 +3431,18 @@
     r"()I",
   );
 
+  static final _getValueAsInt = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public int getValueAsInt()
   ///
   /// Method that will try to convert value of current token to a
@@ -2183,7 +3459,9 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   int getValueAsInt() {
-    return _id_getValueAsInt(this, const jni.jintType(), []);
+    return _getValueAsInt(
+            reference.pointer, _id_getValueAsInt as jni.JMethodIDPtr)
+        .integer;
   }
 
   static final _id_getValueAsInt1 = _class.instanceMethodId(
@@ -2191,6 +3469,14 @@
     r"(I)I",
   );
 
+  static final _getValueAsInt1 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+                  ffi.VarArgs<(ffi.Int64,)>)>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
+
   /// from: public int getValueAsInt(int def)
   ///
   /// Method that will try to convert value of current token to a
@@ -2209,7 +3495,9 @@
   int getValueAsInt1(
     int def,
   ) {
-    return _id_getValueAsInt1(this, const jni.jintType(), [jni.JValueInt(def)]);
+    return _getValueAsInt1(
+            reference.pointer, _id_getValueAsInt1 as jni.JMethodIDPtr, def)
+        .integer;
   }
 
   static final _id_getValueAsLong = _class.instanceMethodId(
@@ -2217,6 +3505,18 @@
     r"()J",
   );
 
+  static final _getValueAsLong = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallLongMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public long getValueAsLong()
   ///
   /// Method that will try to convert value of current token to a
@@ -2233,7 +3533,9 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   int getValueAsLong() {
-    return _id_getValueAsLong(this, const jni.jlongType(), []);
+    return _getValueAsLong(
+            reference.pointer, _id_getValueAsLong as jni.JMethodIDPtr)
+        .long;
   }
 
   static final _id_getValueAsLong1 = _class.instanceMethodId(
@@ -2241,6 +3543,14 @@
     r"(J)J",
   );
 
+  static final _getValueAsLong1 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+                  ffi.VarArgs<(ffi.Int64,)>)>>("globalEnv_CallLongMethod")
+      .asFunction<
+          jni.JniResult Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
+
   /// from: public long getValueAsLong(long def)
   ///
   /// Method that will try to convert value of current token to a
@@ -2259,7 +3569,9 @@
   int getValueAsLong1(
     int def,
   ) {
-    return _id_getValueAsLong1(this, const jni.jlongType(), [def]);
+    return _getValueAsLong1(
+            reference.pointer, _id_getValueAsLong1 as jni.JMethodIDPtr, def)
+        .long;
   }
 
   static final _id_getValueAsDouble = _class.instanceMethodId(
@@ -2267,6 +3579,18 @@
     r"()D",
   );
 
+  static final _getValueAsDouble = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallDoubleMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public double getValueAsDouble()
   ///
   /// Method that will try to convert value of current token to a Java
@@ -2283,7 +3607,9 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   double getValueAsDouble() {
-    return _id_getValueAsDouble(this, const jni.jdoubleType(), []);
+    return _getValueAsDouble(
+            reference.pointer, _id_getValueAsDouble as jni.JMethodIDPtr)
+        .doubleFloat;
   }
 
   static final _id_getValueAsDouble1 = _class.instanceMethodId(
@@ -2291,6 +3617,14 @@
     r"(D)D",
   );
 
+  static final _getValueAsDouble1 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+                  ffi.VarArgs<(ffi.Double,)>)>>("globalEnv_CallDoubleMethod")
+      .asFunction<
+          jni.JniResult Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, double)>();
+
   /// from: public double getValueAsDouble(double def)
   ///
   /// Method that will try to convert value of current token to a
@@ -2309,7 +3643,9 @@
   double getValueAsDouble1(
     double def,
   ) {
-    return _id_getValueAsDouble1(this, const jni.jdoubleType(), [def]);
+    return _getValueAsDouble1(
+            reference.pointer, _id_getValueAsDouble1 as jni.JMethodIDPtr, def)
+        .doubleFloat;
   }
 
   static final _id_getValueAsBoolean = _class.instanceMethodId(
@@ -2317,6 +3653,18 @@
     r"()Z",
   );
 
+  static final _getValueAsBoolean = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public boolean getValueAsBoolean()
   ///
   /// Method that will try to convert value of current token to a
@@ -2333,7 +3681,9 @@
   ///@throws IOException for low-level read issues, or
   ///   JsonParseException for decoding problems
   bool getValueAsBoolean() {
-    return _id_getValueAsBoolean(this, const jni.jbooleanType(), []);
+    return _getValueAsBoolean(
+            reference.pointer, _id_getValueAsBoolean as jni.JMethodIDPtr)
+        .boolean;
   }
 
   static final _id_getValueAsBoolean1 = _class.instanceMethodId(
@@ -2341,6 +3691,14 @@
     r"(Z)Z",
   );
 
+  static final _getValueAsBoolean1 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+                  ffi.VarArgs<(ffi.Int64,)>)>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
+
   /// from: public boolean getValueAsBoolean(boolean def)
   ///
   /// Method that will try to convert value of current token to a
@@ -2359,8 +3717,9 @@
   bool getValueAsBoolean1(
     bool def,
   ) {
-    return _id_getValueAsBoolean1(
-        this, const jni.jbooleanType(), [def ? 1 : 0]);
+    return _getValueAsBoolean1(reference.pointer,
+            _id_getValueAsBoolean1 as jni.JMethodIDPtr, def ? 1 : 0)
+        .boolean;
   }
 
   static final _id_getValueAsString = _class.instanceMethodId(
@@ -2368,6 +3727,18 @@
     r"()Ljava/lang/String;",
   );
 
+  static final _getValueAsString = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public java.lang.String getValueAsString()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -2383,7 +3754,9 @@
   ///   JsonParseException for decoding problems
   ///@since 2.1
   jni.JString getValueAsString() {
-    return _id_getValueAsString(this, const jni.JStringType(), []);
+    return _getValueAsString(
+            reference.pointer, _id_getValueAsString as jni.JMethodIDPtr)
+        .object(const jni.JStringType());
   }
 
   static final _id_getValueAsString1 = _class.instanceMethodId(
@@ -2391,6 +3764,17 @@
     r"(Ljava/lang/String;)Ljava/lang/String;",
   );
 
+  static final _getValueAsString1 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public abstract java.lang.String getValueAsString(java.lang.String def)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -2409,8 +3793,9 @@
   jni.JString getValueAsString1(
     jni.JString def,
   ) {
-    return _id_getValueAsString1(
-        this, const jni.JStringType(), [def.reference.pointer]);
+    return _getValueAsString1(reference.pointer,
+            _id_getValueAsString1 as jni.JMethodIDPtr, def.reference.pointer)
+        .object(const jni.JStringType());
   }
 
   static final _id_canReadObjectId = _class.instanceMethodId(
@@ -2418,6 +3803,18 @@
     r"()Z",
   );
 
+  static final _canReadObjectId = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public boolean canReadObjectId()
   ///
   /// Introspection method that may be called to see if the underlying
@@ -2432,7 +3829,9 @@
   ///    {@code false} if not
   ///@since 2.3
   bool canReadObjectId() {
-    return _id_canReadObjectId(this, const jni.jbooleanType(), []);
+    return _canReadObjectId(
+            reference.pointer, _id_canReadObjectId as jni.JMethodIDPtr)
+        .boolean;
   }
 
   static final _id_canReadTypeId = _class.instanceMethodId(
@@ -2440,6 +3839,18 @@
     r"()Z",
   );
 
+  static final _canReadTypeId = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public boolean canReadTypeId()
   ///
   /// Introspection method that may be called to see if the underlying
@@ -2454,7 +3865,9 @@
   ///    {@code false} if not
   ///@since 2.3
   bool canReadTypeId() {
-    return _id_canReadTypeId(this, const jni.jbooleanType(), []);
+    return _canReadTypeId(
+            reference.pointer, _id_canReadTypeId as jni.JMethodIDPtr)
+        .boolean;
   }
 
   static final _id_getObjectId = _class.instanceMethodId(
@@ -2462,6 +3875,18 @@
     r"()Ljava/lang/Object;",
   );
 
+  static final _getObjectId = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public java.lang.Object getObjectId()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -2479,7 +3904,8 @@
   ///   JsonParseException for decoding problems
   ///@since 2.3
   jni.JObject getObjectId() {
-    return _id_getObjectId(this, const jni.JObjectType(), []);
+    return _getObjectId(reference.pointer, _id_getObjectId as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_getTypeId = _class.instanceMethodId(
@@ -2487,6 +3913,18 @@
     r"()Ljava/lang/Object;",
   );
 
+  static final _getTypeId = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public java.lang.Object getTypeId()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -2504,7 +3942,8 @@
   ///   JsonParseException for decoding problems
   ///@since 2.3
   jni.JObject getTypeId() {
-    return _id_getTypeId(this, const jni.JObjectType(), []);
+    return _getTypeId(reference.pointer, _id_getTypeId as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_readValueAs = _class.instanceMethodId(
@@ -2512,6 +3951,17 @@
     r"(Ljava/lang/Class;)Ljava/lang/Object;",
   );
 
+  static final _readValueAs = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public T readValueAs(java.lang.Class<T> valueType)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -2544,7 +3994,9 @@
     jni.JObject valueType, {
     required jni.JObjType<$T> T,
   }) {
-    return _id_readValueAs(this, T, [valueType.reference.pointer]);
+    return _readValueAs(reference.pointer, _id_readValueAs as jni.JMethodIDPtr,
+            valueType.reference.pointer)
+        .object(T);
   }
 
   static final _id_readValueAs1 = _class.instanceMethodId(
@@ -2552,6 +4004,17 @@
     r"(Lcom/fasterxml/jackson/core/type/TypeReference;)Ljava/lang/Object;",
   );
 
+  static final _readValueAs1 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public T readValueAs(com.fasterxml.jackson.core.type.TypeReference<?> valueTypeRef)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -2581,7 +4044,11 @@
     jni.JObject valueTypeRef, {
     required jni.JObjType<$T> T,
   }) {
-    return _id_readValueAs1(this, T, [valueTypeRef.reference.pointer]);
+    return _readValueAs1(
+            reference.pointer,
+            _id_readValueAs1 as jni.JMethodIDPtr,
+            valueTypeRef.reference.pointer)
+        .object(T);
   }
 
   static final _id_readValuesAs = _class.instanceMethodId(
@@ -2589,6 +4056,17 @@
     r"(Ljava/lang/Class;)Ljava/util/Iterator;",
   );
 
+  static final _readValuesAs = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public java.util.Iterator<T> readValuesAs(java.lang.Class<T> valueType)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -2604,8 +4082,9 @@
     jni.JObject valueType, {
     required jni.JObjType<$T> T,
   }) {
-    return _id_readValuesAs(
-        this, jni.JIteratorType(T), [valueType.reference.pointer]);
+    return _readValuesAs(reference.pointer,
+            _id_readValuesAs as jni.JMethodIDPtr, valueType.reference.pointer)
+        .object(jni.JIteratorType(T));
   }
 
   static final _id_readValuesAs1 = _class.instanceMethodId(
@@ -2613,6 +4092,17 @@
     r"(Lcom/fasterxml/jackson/core/type/TypeReference;)Ljava/util/Iterator;",
   );
 
+  static final _readValuesAs1 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public java.util.Iterator<T> readValuesAs(com.fasterxml.jackson.core.type.TypeReference<T> valueTypeRef)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -2628,8 +4118,11 @@
     jni.JObject valueTypeRef, {
     required jni.JObjType<$T> T,
   }) {
-    return _id_readValuesAs1(
-        this, jni.JIteratorType(T), [valueTypeRef.reference.pointer]);
+    return _readValuesAs1(
+            reference.pointer,
+            _id_readValuesAs1 as jni.JMethodIDPtr,
+            valueTypeRef.reference.pointer)
+        .object(jni.JIteratorType(T));
   }
 
   static final _id_readValueAsTree = _class.instanceMethodId(
@@ -2637,6 +4130,18 @@
     r"()Lcom/fasterxml/jackson/core/TreeNode;",
   );
 
+  static final _readValueAsTree = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public T readValueAsTree()
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -2652,7 +4157,9 @@
   $T readValueAsTree<$T extends jni.JObject>({
     required jni.JObjType<$T> T,
   }) {
-    return _id_readValueAsTree(this, T, []);
+    return _readValueAsTree(
+            reference.pointer, _id_readValueAsTree as jni.JMethodIDPtr)
+        .object(T);
   }
 }
 
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 ff492c2..67d194c 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
@@ -62,10 +62,23 @@
     r"()[Lcom/fasterxml/jackson/core/JsonToken;",
   );
 
+  static final _values = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: static public com.fasterxml.jackson.core.JsonToken[] values()
   /// The returned object must be released after use, by calling the [release] method.
   static jni.JArray<JsonToken> values() {
-    return _id_values(_class, const jni.JArrayType($JsonTokenType()), []);
+    return _values(_class.reference.pointer, _id_values as jni.JMethodIDPtr)
+        .object(const jni.JArrayType($JsonTokenType()));
   }
 
   static final _id_valueOf = _class.staticMethodId(
@@ -73,13 +86,25 @@
     r"(Ljava/lang/String;)Lcom/fasterxml/jackson/core/JsonToken;",
   );
 
+  static final _valueOf = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: static public com.fasterxml.jackson.core.JsonToken valueOf(java.lang.String name)
   /// The returned object must be released after use, by calling the [release] method.
   static JsonToken valueOf(
     jni.JString name,
   ) {
-    return _id_valueOf(
-        _class, const $JsonTokenType(), [name.reference.pointer]);
+    return _valueOf(_class.reference.pointer, _id_valueOf as jni.JMethodIDPtr,
+            name.reference.pointer)
+        .object(const $JsonTokenType());
   }
 
   static final _id_id = _class.instanceMethodId(
@@ -87,9 +112,21 @@
     r"()I",
   );
 
+  static final _id = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public final int id()
   int id() {
-    return _id_id(this, const jni.jintType(), []);
+    return _id(reference.pointer, _id_id as jni.JMethodIDPtr).integer;
   }
 
   static final _id_asString = _class.instanceMethodId(
@@ -97,10 +134,23 @@
     r"()Ljava/lang/String;",
   );
 
+  static final _asString = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public final java.lang.String asString()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JString asString() {
-    return _id_asString(this, const jni.JStringType(), []);
+    return _asString(reference.pointer, _id_asString as jni.JMethodIDPtr)
+        .object(const jni.JStringType());
   }
 
   static final _id_asCharArray = _class.instanceMethodId(
@@ -108,10 +158,23 @@
     r"()[C",
   );
 
+  static final _asCharArray = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public final char[] asCharArray()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JArray<jni.jchar> asCharArray() {
-    return _id_asCharArray(this, const jni.JArrayType(jni.jcharType()), []);
+    return _asCharArray(reference.pointer, _id_asCharArray as jni.JMethodIDPtr)
+        .object(const jni.JArrayType(jni.jcharType()));
   }
 
   static final _id_asByteArray = _class.instanceMethodId(
@@ -119,10 +182,23 @@
     r"()[B",
   );
 
+  static final _asByteArray = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public final byte[] asByteArray()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JArray<jni.jbyte> asByteArray() {
-    return _id_asByteArray(this, const jni.JArrayType(jni.jbyteType()), []);
+    return _asByteArray(reference.pointer, _id_asByteArray as jni.JMethodIDPtr)
+        .object(const jni.JArrayType(jni.jbyteType()));
   }
 
   static final _id_isNumeric = _class.instanceMethodId(
@@ -130,12 +206,25 @@
     r"()Z",
   );
 
+  static final _isNumeric = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// 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 _id_isNumeric(this, const jni.jbooleanType(), []);
+    return _isNumeric(reference.pointer, _id_isNumeric as jni.JMethodIDPtr)
+        .boolean;
   }
 
   static final _id_isStructStart = _class.instanceMethodId(
@@ -143,6 +232,18 @@
     r"()Z",
   );
 
+  static final _isStructStart = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public final boolean isStructStart()
   ///
   /// Accessor that is functionally equivalent to:
@@ -153,7 +254,9 @@
   ///   {@code false} otherwise
   ///@since 2.3
   bool isStructStart() {
-    return _id_isStructStart(this, const jni.jbooleanType(), []);
+    return _isStructStart(
+            reference.pointer, _id_isStructStart as jni.JMethodIDPtr)
+        .boolean;
   }
 
   static final _id_isStructEnd = _class.instanceMethodId(
@@ -161,6 +264,18 @@
     r"()Z",
   );
 
+  static final _isStructEnd = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public final boolean isStructEnd()
   ///
   /// Accessor that is functionally equivalent to:
@@ -171,7 +286,8 @@
   ///   {@code false} otherwise
   ///@since 2.3
   bool isStructEnd() {
-    return _id_isStructEnd(this, const jni.jbooleanType(), []);
+    return _isStructEnd(reference.pointer, _id_isStructEnd as jni.JMethodIDPtr)
+        .boolean;
   }
 
   static final _id_isScalarValue = _class.instanceMethodId(
@@ -179,6 +295,18 @@
     r"()Z",
   );
 
+  static final _isScalarValue = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public final boolean isScalarValue()
   ///
   /// Method that can be used to check whether this token represents
@@ -188,7 +316,9 @@
   ///@return {@code True} if this token is a scalar value token (one of
   ///   {@code VALUE_xxx} tokens), {@code false} otherwise
   bool isScalarValue() {
-    return _id_isScalarValue(this, const jni.jbooleanType(), []);
+    return _isScalarValue(
+            reference.pointer, _id_isScalarValue as jni.JMethodIDPtr)
+        .boolean;
   }
 
   static final _id_isBoolean = _class.instanceMethodId(
@@ -196,12 +326,25 @@
     r"()Z",
   );
 
+  static final _isBoolean = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// 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 _id_isBoolean(this, const jni.jbooleanType(), []);
+    return _isBoolean(reference.pointer, _id_isBoolean as jni.JMethodIDPtr)
+        .boolean;
   }
 }
 
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 8e3652a..2f1099a 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
@@ -45,10 +45,24 @@
     r"()V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory SuspendFun() {
-    return SuspendFun.fromReference(_id_new0(_class, referenceType, []));
+    return SuspendFun.fromReference(
+        _new0(_class.reference.pointer, _id_new0 as jni.JMethodIDPtr)
+            .reference);
   }
 
   static final _id_sayHello = _class.instanceMethodId(
@@ -56,13 +70,26 @@
     r"(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;",
   );
 
+  static final _sayHello = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public final java.lang.Object sayHello(kotlin.coroutines.Continuation continuation)
   /// The returned object must be released after use, by calling the [release] method.
   Future<jni.JString> sayHello() async {
     final $p = ReceivePort();
     final $c = jni.JObject.fromReference(
         ProtectedJniExtensions.newPortContinuation($p));
-    _id_sayHello(this, const jni.JObjectType(), [$c.reference.pointer]);
+    _sayHello(reference.pointer, _id_sayHello as jni.JMethodIDPtr,
+            $c.reference.pointer)
+        .object(const jni.JObjectType());
     final $o = jni.JGlobalReference(jni.JObjectPtr.fromAddress(await $p.first));
     final $k = const jni.JStringType().jClass.reference.pointer;
     if (!jni.Jni.env.IsInstanceOf($o.pointer, $k)) {
@@ -76,6 +103,20 @@
     r"(Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;",
   );
 
+  static final _sayHello1 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>
+                      )>)>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
+
   /// from: public final java.lang.Object sayHello(java.lang.String string, kotlin.coroutines.Continuation continuation)
   /// The returned object must be released after use, by calling the [release] method.
   Future<jni.JString> sayHello1(
@@ -84,8 +125,9 @@
     final $p = ReceivePort();
     final $c = jni.JObject.fromReference(
         ProtectedJniExtensions.newPortContinuation($p));
-    _id_sayHello1(this, const jni.JObjectType(),
-        [string.reference.pointer, $c.reference.pointer]);
+    _sayHello1(reference.pointer, _id_sayHello1 as jni.JMethodIDPtr,
+            string.reference.pointer, $c.reference.pointer)
+        .object(const jni.JObjectType());
     final $o = jni.JGlobalReference(jni.JObjectPtr.fromAddress(await $p.first));
     final $k = const jni.JStringType().jClass.reference.pointer;
     if (!jni.Jni.env.IsInstanceOf($o.pointer, $k)) {
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 d832b10..4a44623 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
@@ -123,10 +123,14 @@
   }
 
   static final _usesAnonymousInnerClass = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Example_Nested__usesAnonymousInnerClass")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Example_Nested__usesAnonymousInnerClass")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public void usesAnonymousInnerClass()
   void usesAnonymousInnerClass() {
@@ -134,10 +138,14 @@
   }
 
   static final _getValue = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Example_Nested__getValue")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Example_Nested__getValue")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean getValue()
   bool getValue() {
@@ -459,10 +467,14 @@
   }
 
   static final _getNumber = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Example__getNumber")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Example__getNumber")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public int getNumber()
   int getNumber() {
@@ -483,10 +495,14 @@
   }
 
   static final _getIsUp = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Example__getIsUp")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Example__getIsUp")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public boolean getIsUp()
   bool getIsUp() {
@@ -507,10 +523,14 @@
   }
 
   static final _getCodename = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Example__getCodename")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Example__getCodename")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.String getCodename()
   /// The returned object must be released after use, by calling the [release] method.
@@ -534,10 +554,14 @@
   }
 
   static final _getRandom = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Example__getRandom")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Example__getRandom")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.util.Random getRandom()
   /// The returned object must be released after use, by calling the [release] method.
@@ -561,10 +585,14 @@
   }
 
   static final _getRandomLong = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Example__getRandomLong")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Example__getRandomLong")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public long getRandomLong()
   int getRandomLong() {
@@ -656,10 +684,14 @@
   }
 
   static final _finalMethod = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Example__finalMethod")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Example__finalMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public final void finalMethod()
   void finalMethod() {
@@ -667,10 +699,14 @@
   }
 
   static final _getList = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Example__getList")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Example__getList")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.util.List<java.lang.String> getList()
   /// The returned object must be released after use, by calling the [release] method.
@@ -824,10 +860,14 @@
   }
 
   static final _whichExample = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Example__whichExample")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Example__whichExample")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public int whichExample()
   int whichExample() {
@@ -870,10 +910,14 @@
   }
 
   static final _getSelf = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Example__getSelf")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Example__getSelf")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public com.github.dart_lang.jnigen.simple_package.Example getSelf()
   /// The returned object must be released after use, by calling the [release] method.
@@ -892,10 +936,14 @@
   }
 
   static final _overloaded = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Example__overloaded")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Example__overloaded")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public void overloaded()
   void overloaded() {
@@ -1076,10 +1124,14 @@
   }
 
   static final _whichExample = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Example1__whichExample")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Example1__whichExample")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public int whichExample()
   int whichExample() {
@@ -1762,10 +1814,14 @@
   }
 
   static final _stringParent = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "GrandParent__stringParent")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("GrandParent__stringParent")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public com.github.dart_lang.jnigen.generics.GrandParent<T>.Parent<java.lang.String> stringParent()
   /// The returned object must be released after use, by calling the [release] method.
@@ -1827,10 +1883,14 @@
   }
 
   static final _staticParentWithSameType = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "GrandParent__staticParentWithSameType")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("GrandParent__staticParentWithSameType")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public com.github.dart_lang.jnigen.generics.GrandParent.StaticParent<T> staticParentWithSameType()
   /// The returned object must be released after use, by calling the [release] method.
@@ -2099,10 +2159,14 @@
   }
 
   static final _entryStack = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "MyMap__entryStack")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("MyMap__entryStack")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public com.github.dart_lang.jnigen.generics.MyStack<com.github.dart_lang.jnigen.generics.MyMap<K,V>.MyEntry> entryStack()
   /// The returned object must be released after use, by calling the [release] method.
@@ -2289,8 +2353,13 @@
 
   static final _pop = jniLookup<
           ffi.NativeFunction<
-              jni.JniResult Function(ffi.Pointer<ffi.Void>)>>("MyStack__pop")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("MyStack__pop")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public T pop()
   /// The returned object must be released after use, by calling the [release] method.
@@ -2300,8 +2369,13 @@
 
   static final _size = jniLookup<
           ffi.NativeFunction<
-              jni.JniResult Function(ffi.Pointer<ffi.Void>)>>("MyStack__size")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("MyStack__size")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public int size()
   int size() {
@@ -2941,8 +3015,13 @@
   static const type = $MyRunnableType();
   static final _run = jniLookup<
           ffi.NativeFunction<
-              jni.JniResult Function(ffi.Pointer<ffi.Void>)>>("MyRunnable__run")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("MyRunnable__run")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public abstract void run()
   void run() {
@@ -3118,10 +3197,14 @@
   }
 
   static final _runOnSameThread = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "MyRunnableRunner__runOnSameThread")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("MyRunnableRunner__runOnSameThread")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public void runOnSameThread()
   void runOnSameThread() {
@@ -3129,10 +3212,14 @@
   }
 
   static final _runOnAnotherThread = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "MyRunnableRunner__runOnAnotherThread")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("MyRunnableRunner__runOnAnotherThread")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public void runOnAnotherThread()
   void runOnAnotherThread() {
@@ -3245,10 +3332,14 @@
   /// The type which includes information such as the signature of this class.
   static const type = $JsonSerializableType();
   static final _value = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "JsonSerializable__value")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("JsonSerializable__value")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// 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.
@@ -3582,10 +3673,14 @@
   }
 
   static final _objectMethod = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Exceptions__objectMethod")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Exceptions__objectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.Object objectMethod()
   /// The returned object must be released after use, by calling the [release] method.
@@ -3594,10 +3689,14 @@
   }
 
   static final _intMethod = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Exceptions__intMethod")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Exceptions__intMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public int intMethod()
   int intMethod() {
@@ -3605,10 +3704,14 @@
   }
 
   static final _objectArrayMethod = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Exceptions__objectArrayMethod")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Exceptions__objectArrayMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.lang.Object[] objectArrayMethod()
   /// The returned object must be released after use, by calling the [release] method.
@@ -3618,10 +3721,14 @@
   }
 
   static final _intArrayMethod = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Exceptions__intArrayMethod")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Exceptions__intArrayMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public int[] intArrayMethod()
   /// The returned object must be released after use, by calling the [release] method.
@@ -3631,10 +3738,14 @@
   }
 
   static final _throwNullPointerException = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Exceptions__throwNullPointerException")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Exceptions__throwNullPointerException")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public int throwNullPointerException()
   int throwNullPointerException() {
@@ -3642,10 +3753,14 @@
   }
 
   static final _throwFileNotFoundException = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Exceptions__throwFileNotFoundException")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Exceptions__throwFileNotFoundException")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.io.InputStream throwFileNotFoundException()
   /// The returned object must be released after use, by calling the [release] method.
@@ -3655,10 +3770,14 @@
   }
 
   static final _throwClassCastException = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Exceptions__throwClassCastException")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Exceptions__throwClassCastException")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public java.io.FileInputStream throwClassCastException()
   /// The returned object must be released after use, by calling the [release] method.
@@ -3668,10 +3787,14 @@
   }
 
   static final _throwArrayIndexException = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Exceptions__throwArrayIndexException")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Exceptions__throwArrayIndexException")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public int throwArrayIndexException()
   int throwArrayIndexException() {
@@ -3679,10 +3802,14 @@
   }
 
   static final _throwArithmeticException = jniLookup<
-              ffi
-              .NativeFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>>(
-          "Exceptions__throwArithmeticException")
-      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+              )>>("Exceptions__throwArithmeticException")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+          )>();
 
   /// from: public int throwArithmeticException()
   int throwArithmeticException() {
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 7287d30..21a4f3f 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
@@ -57,11 +57,24 @@
     r"()V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// 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.fromReference(
-        _id_new0(_class, referenceType, []));
+        _new0(_class.reference.pointer, _id_new0 as jni.JMethodIDPtr)
+            .reference);
   }
 }
 
@@ -111,13 +124,22 @@
     r"(Z)V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+                  ffi.VarArgs<(ffi.Int64,)>)>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
+
   /// 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.fromReference(
-        _id_new0(_class, referenceType, [value ? 1 : 0]));
+    return Example_Nested.fromReference(_new0(_class.reference.pointer,
+            _id_new0 as jni.JMethodIDPtr, value ? 1 : 0)
+        .reference);
   }
 
   static final _id_usesAnonymousInnerClass = _class.instanceMethodId(
@@ -125,9 +147,23 @@
     r"()V",
   );
 
+  static final _usesAnonymousInnerClass = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JThrowablePtr Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public void usesAnonymousInnerClass()
   void usesAnonymousInnerClass() {
-    _id_usesAnonymousInnerClass(this, const jni.jvoidType(), []);
+    _usesAnonymousInnerClass(
+            reference.pointer, _id_usesAnonymousInnerClass as jni.JMethodIDPtr)
+        .check();
   }
 
   static final _id_getValue = _class.instanceMethodId(
@@ -135,9 +171,22 @@
     r"()Z",
   );
 
+  static final _getValue = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public boolean getValue()
   bool getValue() {
-    return _id_getValue(this, const jni.jbooleanType(), []);
+    return _getValue(reference.pointer, _id_getValue as jni.JMethodIDPtr)
+        .boolean;
   }
 
   static final _id_setValue = _class.instanceMethodId(
@@ -145,11 +194,23 @@
     r"(Z)V",
   );
 
+  static final _setValue = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JThrowablePtr Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<(ffi.Int64,)>)>>("globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
+
   /// from: public void setValue(boolean value)
   void setValue(
     bool value,
   ) {
-    _id_setValue(this, const jni.jvoidType(), [value ? 1 : 0]);
+    _setValue(
+            reference.pointer, _id_setValue as jni.JMethodIDPtr, value ? 1 : 0)
+        .check();
   }
 }
 
@@ -209,13 +270,25 @@
     r"(Lcom/github/dart_lang/jnigen/simple_package/Example;)V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// 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.
   factory Example_NonStaticNested(
     Example $parent,
   ) {
-    return Example_NonStaticNested.fromReference(
-        _id_new0(_class, referenceType, [$parent.reference.pointer]));
+    return Example_NonStaticNested.fromReference(_new0(_class.reference.pointer,
+            _id_new0 as jni.JMethodIDPtr, $parent.reference.pointer)
+        .reference);
   }
 }
 
@@ -313,9 +386,23 @@
     r"()I",
   );
 
+  static final _getAmount = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallStaticIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: static public int getAmount()
   static int getAmount() {
-    return _id_getAmount(_class, const jni.jintType(), []);
+    return _getAmount(
+            _class.reference.pointer, _id_getAmount as jni.JMethodIDPtr)
+        .integer;
   }
 
   static final _id_getPi = _class.staticMethodId(
@@ -323,9 +410,22 @@
     r"()D",
   );
 
+  static final _getPi = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallStaticDoubleMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: static public double getPi()
   static double getPi() {
-    return _id_getPi(_class, const jni.jdoubleType(), []);
+    return _getPi(_class.reference.pointer, _id_getPi as jni.JMethodIDPtr)
+        .doubleFloat;
   }
 
   static final _id_getAsterisk = _class.staticMethodId(
@@ -333,9 +433,23 @@
     r"()C",
   );
 
+  static final _getAsterisk = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallStaticCharMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: static public char getAsterisk()
   static int getAsterisk() {
-    return _id_getAsterisk(_class, const jni.jcharType(), []);
+    return _getAsterisk(
+            _class.reference.pointer, _id_getAsterisk as jni.JMethodIDPtr)
+        .char;
   }
 
   static final _id_getName = _class.staticMethodId(
@@ -343,10 +457,23 @@
     r"()Ljava/lang/String;",
   );
 
+  static final _getName = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// 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 _id_getName(_class, const jni.JStringType(), []);
+    return _getName(_class.reference.pointer, _id_getName as jni.JMethodIDPtr)
+        .object(const jni.JStringType());
   }
 
   static final _id_getNestedInstance = _class.staticMethodId(
@@ -354,10 +481,24 @@
     r"()Lcom/github/dart_lang/jnigen/simple_package/Example$Nested;",
   );
 
+  static final _getNestedInstance = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: static public com.github.dart_lang.jnigen.simple_package.Example.Nested getNestedInstance()
   /// The returned object must be released after use, by calling the [release] method.
   static Example_Nested getNestedInstance() {
-    return _id_getNestedInstance(_class, const $Example_NestedType(), []);
+    return _getNestedInstance(
+            _class.reference.pointer, _id_getNestedInstance as jni.JMethodIDPtr)
+        .object(const $Example_NestedType());
   }
 
   static final _id_setAmount = _class.staticMethodId(
@@ -365,11 +506,23 @@
     r"(I)V",
   );
 
+  static final _setAmount = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JThrowablePtr Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<(ffi.Int64,)>)>>("globalEnv_CallStaticVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
+
   /// from: static public void setAmount(int newAmount)
   static void setAmount(
     int newAmount,
   ) {
-    _id_setAmount(_class, const jni.jvoidType(), [jni.JValueInt(newAmount)]);
+    _setAmount(_class.reference.pointer, _id_setAmount as jni.JMethodIDPtr,
+            newAmount)
+        .check();
   }
 
   static final _id_setName = _class.staticMethodId(
@@ -377,11 +530,24 @@
     r"(Ljava/lang/String;)V",
   );
 
+  static final _setName = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JThrowablePtr Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallStaticVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: static public void setName(java.lang.String newName)
   static void setName(
     jni.JString newName,
   ) {
-    _id_setName(_class, const jni.jvoidType(), [newName.reference.pointer]);
+    _setName(_class.reference.pointer, _id_setName as jni.JMethodIDPtr,
+            newName.reference.pointer)
+        .check();
   }
 
   static final _id_setNestedInstance = _class.staticMethodId(
@@ -389,12 +555,26 @@
     r"(Lcom/github/dart_lang/jnigen/simple_package/Example$Nested;)V",
   );
 
+  static final _setNestedInstance = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JThrowablePtr Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallStaticVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: static public void setNestedInstance(com.github.dart_lang.jnigen.simple_package.Example.Nested newNested)
   static void setNestedInstance(
     Example_Nested newNested,
   ) {
-    _id_setNestedInstance(
-        _class, const jni.jvoidType(), [newNested.reference.pointer]);
+    _setNestedInstance(
+            _class.reference.pointer,
+            _id_setNestedInstance as jni.JMethodIDPtr,
+            newNested.reference.pointer)
+        .check();
   }
 
   static final _id_max4 = _class.staticMethodId(
@@ -402,6 +582,22 @@
     r"(IIII)I",
   );
 
+  static final _max4 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64
+                      )>)>>("globalEnv_CallStaticIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int, int, int, int)>();
+
   /// from: static public int max4(int a, int b, int c, int d)
   static int max4(
     int a,
@@ -409,12 +605,9 @@
     int c,
     int d,
   ) {
-    return _id_max4(_class, const jni.jintType(), [
-      jni.JValueInt(a),
-      jni.JValueInt(b),
-      jni.JValueInt(c),
-      jni.JValueInt(d)
-    ]);
+    return _max4(
+            _class.reference.pointer, _id_max4 as jni.JMethodIDPtr, a, b, c, d)
+        .integer;
   }
 
   static final _id_max8 = _class.staticMethodId(
@@ -422,6 +615,26 @@
     r"(IIIIIIII)I",
   );
 
+  static final _max8 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64
+                      )>)>>("globalEnv_CallStaticIntMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int,
+              int, int, int, int, int, int, int)>();
+
   /// from: static public int max8(int a, int b, int c, int d, int e, int f, int g, int h)
   static int max8(
     int a,
@@ -433,16 +646,9 @@
     int g,
     int h,
   ) {
-    return _id_max8(_class, const jni.jintType(), [
-      jni.JValueInt(a),
-      jni.JValueInt(b),
-      jni.JValueInt(c),
-      jni.JValueInt(d),
-      jni.JValueInt(e),
-      jni.JValueInt(f),
-      jni.JValueInt(g),
-      jni.JValueInt(h)
-    ]);
+    return _max8(_class.reference.pointer, _id_max8 as jni.JMethodIDPtr, a, b,
+            c, d, e, f, g, h)
+        .integer;
   }
 
   static final _id_getNumber = _class.instanceMethodId(
@@ -450,9 +656,22 @@
     r"()I",
   );
 
+  static final _getNumber = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public int getNumber()
   int getNumber() {
-    return _id_getNumber(this, const jni.jintType(), []);
+    return _getNumber(reference.pointer, _id_getNumber as jni.JMethodIDPtr)
+        .integer;
   }
 
   static final _id_setNumber = _class.instanceMethodId(
@@ -460,11 +679,22 @@
     r"(I)V",
   );
 
+  static final _setNumber = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JThrowablePtr Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<(ffi.Int64,)>)>>("globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
+
   /// from: public void setNumber(int number)
   void setNumber(
     int number,
   ) {
-    _id_setNumber(this, const jni.jvoidType(), [jni.JValueInt(number)]);
+    _setNumber(reference.pointer, _id_setNumber as jni.JMethodIDPtr, number)
+        .check();
   }
 
   static final _id_getIsUp = _class.instanceMethodId(
@@ -472,9 +702,21 @@
     r"()Z",
   );
 
+  static final _getIsUp = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallBooleanMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public boolean getIsUp()
   bool getIsUp() {
-    return _id_getIsUp(this, const jni.jbooleanType(), []);
+    return _getIsUp(reference.pointer, _id_getIsUp as jni.JMethodIDPtr).boolean;
   }
 
   static final _id_setUp = _class.instanceMethodId(
@@ -482,11 +724,22 @@
     r"(Z)V",
   );
 
+  static final _setUp = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JThrowablePtr Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<(ffi.Int64,)>)>>("globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
+
   /// from: public void setUp(boolean isUp)
   void setUp(
     bool isUp,
   ) {
-    _id_setUp(this, const jni.jvoidType(), [isUp ? 1 : 0]);
+    _setUp(reference.pointer, _id_setUp as jni.JMethodIDPtr, isUp ? 1 : 0)
+        .check();
   }
 
   static final _id_getCodename = _class.instanceMethodId(
@@ -494,10 +747,23 @@
     r"()Ljava/lang/String;",
   );
 
+  static final _getCodename = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public java.lang.String getCodename()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JString getCodename() {
-    return _id_getCodename(this, const jni.JStringType(), []);
+    return _getCodename(reference.pointer, _id_getCodename as jni.JMethodIDPtr)
+        .object(const jni.JStringType());
   }
 
   static final _id_setCodename = _class.instanceMethodId(
@@ -505,11 +771,24 @@
     r"(Ljava/lang/String;)V",
   );
 
+  static final _setCodename = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JThrowablePtr Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public void setCodename(java.lang.String codename)
   void setCodename(
     jni.JString codename,
   ) {
-    _id_setCodename(this, const jni.jvoidType(), [codename.reference.pointer]);
+    _setCodename(reference.pointer, _id_setCodename as jni.JMethodIDPtr,
+            codename.reference.pointer)
+        .check();
   }
 
   static final _id_getRandom = _class.instanceMethodId(
@@ -517,10 +796,23 @@
     r"()Ljava/util/Random;",
   );
 
+  static final _getRandom = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public java.util.Random getRandom()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject getRandom() {
-    return _id_getRandom(this, const jni.JObjectType(), []);
+    return _getRandom(reference.pointer, _id_getRandom as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_setRandom = _class.instanceMethodId(
@@ -528,11 +820,24 @@
     r"(Ljava/util/Random;)V",
   );
 
+  static final _setRandom = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JThrowablePtr Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public void setRandom(java.util.Random random)
   void setRandom(
     jni.JObject random,
   ) {
-    _id_setRandom(this, const jni.jvoidType(), [random.reference.pointer]);
+    _setRandom(reference.pointer, _id_setRandom as jni.JMethodIDPtr,
+            random.reference.pointer)
+        .check();
   }
 
   static final _id_getRandomLong = _class.instanceMethodId(
@@ -540,9 +845,23 @@
     r"()J",
   );
 
+  static final _getRandomLong = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallLongMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public long getRandomLong()
   int getRandomLong() {
-    return _id_getRandomLong(this, const jni.jlongType(), []);
+    return _getRandomLong(
+            reference.pointer, _id_getRandomLong as jni.JMethodIDPtr)
+        .long;
   }
 
   static final _id_add4Longs = _class.instanceMethodId(
@@ -550,6 +869,22 @@
     r"(JJJJ)J",
   );
 
+  static final _add4Longs = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64
+                      )>)>>("globalEnv_CallLongMethod")
+      .asFunction<
+          jni.JniResult Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int, int, int, int)>();
+
   /// from: public long add4Longs(long a, long b, long c, long d)
   int add4Longs(
     int a,
@@ -557,7 +892,9 @@
     int c,
     int d,
   ) {
-    return _id_add4Longs(this, const jni.jlongType(), [a, b, c, d]);
+    return _add4Longs(
+            reference.pointer, _id_add4Longs as jni.JMethodIDPtr, a, b, c, d)
+        .long;
   }
 
   static final _id_add8Longs = _class.instanceMethodId(
@@ -565,6 +902,26 @@
     r"(JJJJJJJJ)J",
   );
 
+  static final _add8Longs = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64
+                      )>)>>("globalEnv_CallLongMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int,
+              int, int, int, int, int, int, int)>();
+
   /// from: public long add8Longs(long a, long b, long c, long d, long e, long f, long g, long h)
   int add8Longs(
     int a,
@@ -576,7 +933,9 @@
     int g,
     int h,
   ) {
-    return _id_add8Longs(this, const jni.jlongType(), [a, b, c, d, e, f, g, h]);
+    return _add8Longs(reference.pointer, _id_add8Longs as jni.JMethodIDPtr, a,
+            b, c, d, e, f, g, h)
+        .long;
   }
 
   static final _id_getRandomNumericString = _class.instanceMethodId(
@@ -584,13 +943,27 @@
     r"(Ljava/util/Random;)Ljava/lang/String;",
   );
 
+  static final _getRandomNumericString = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public java.lang.String getRandomNumericString(java.util.Random random)
   /// The returned object must be released after use, by calling the [release] method.
   jni.JString getRandomNumericString(
     jni.JObject random,
   ) {
-    return _id_getRandomNumericString(
-        this, const jni.JStringType(), [random.reference.pointer]);
+    return _getRandomNumericString(
+            reference.pointer,
+            _id_getRandomNumericString as jni.JMethodIDPtr,
+            random.reference.pointer)
+        .object(const jni.JStringType());
   }
 
   static final _id_protectedMethod = _class.instanceMethodId(
@@ -598,13 +971,28 @@
     r"(Ljava/lang/String;Ljava/lang/String;)V",
   );
 
+  static final _protectedMethod = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JThrowablePtr Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>
+                      )>)>>("globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
+
   /// from: protected void protectedMethod(java.lang.String a, java.lang.String b)
   void protectedMethod(
     jni.JString a,
     jni.JString b,
   ) {
-    _id_protectedMethod(this, const jni.jvoidType(),
-        [a.reference.pointer, b.reference.pointer]);
+    _protectedMethod(reference.pointer, _id_protectedMethod as jni.JMethodIDPtr,
+            a.reference.pointer, b.reference.pointer)
+        .check();
   }
 
   static final _id_finalMethod = _class.instanceMethodId(
@@ -612,9 +1000,22 @@
     r"()V",
   );
 
+  static final _finalMethod = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JThrowablePtr Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public final void finalMethod()
   void finalMethod() {
-    _id_finalMethod(this, const jni.jvoidType(), []);
+    _finalMethod(reference.pointer, _id_finalMethod as jni.JMethodIDPtr)
+        .check();
   }
 
   static final _id_getList = _class.instanceMethodId(
@@ -622,10 +1023,23 @@
     r"()Ljava/util/List;",
   );
 
+  static final _getList = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// 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 _id_getList(this, const jni.JListType(jni.JStringType()), []);
+    return _getList(reference.pointer, _id_getList as jni.JMethodIDPtr)
+        .object(const jni.JListType(jni.JStringType()));
   }
 
   static final _id_joinStrings = _class.instanceMethodId(
@@ -633,6 +1047,20 @@
     r"(Ljava/util/List;Ljava/lang/String;)Ljava/lang/String;",
   );
 
+  static final _joinStrings = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>
+                      )>)>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
+
   /// from: public java.lang.String joinStrings(java.util.List<java.lang.String> values, java.lang.String delim)
   /// The returned object must be released after use, by calling the [release] method.
   ///
@@ -641,8 +1069,9 @@
     jni.JList<jni.JString> values,
     jni.JString delim,
   ) {
-    return _id_joinStrings(this, const jni.JStringType(),
-        [values.reference.pointer, delim.reference.pointer]);
+    return _joinStrings(reference.pointer, _id_joinStrings as jni.JMethodIDPtr,
+            values.reference.pointer, delim.reference.pointer)
+        .object(const jni.JStringType());
   }
 
   static final _id_methodWithSeveralParams = _class.instanceMethodId(
@@ -650,6 +1079,31 @@
     r"(CLjava/lang/String;[ILjava/lang/CharSequence;Ljava/util/List;Ljava/util/Map;)V",
   );
 
+  static final _methodWithSeveralParams = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JThrowablePtr Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Int64,
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>
+                      )>)>>("globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(
+              ffi.Pointer<ffi.Void>,
+              jni.JMethodIDPtr,
+              int,
+              ffi.Pointer<ffi.Void>,
+              ffi.Pointer<ffi.Void>,
+              ffi.Pointer<ffi.Void>,
+              ffi.Pointer<ffi.Void>,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public void methodWithSeveralParams(char ch, java.lang.String s, int[] a, T t, java.util.List<T> lt, java.util.Map<java.lang.String,? extends java.lang.CharSequence> wm)
   void methodWithSeveralParams<$T extends jni.JObject>(
     int ch,
@@ -664,57 +1118,106 @@
       (lt.$type as jni.JListType).E,
       t.$type,
     ]) as jni.JObjType<$T>;
-    _id_methodWithSeveralParams(this, const jni.jvoidType(), [
-      jni.JValueChar(ch),
-      s.reference.pointer,
-      a.reference.pointer,
-      t.reference.pointer,
-      lt.reference.pointer,
-      wm.reference.pointer
-    ]);
+    _methodWithSeveralParams(
+            reference.pointer,
+            _id_methodWithSeveralParams as jni.JMethodIDPtr,
+            ch,
+            s.reference.pointer,
+            a.reference.pointer,
+            t.reference.pointer,
+            lt.reference.pointer,
+            wm.reference.pointer)
+        .check();
   }
 
   static final _id_new0 = _class.constructorId(
     r"()V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory Example() {
-    return Example.fromReference(_id_new0(_class, referenceType, []));
+    return Example.fromReference(
+        _new0(_class.reference.pointer, _id_new0 as jni.JMethodIDPtr)
+            .reference);
   }
 
   static final _id_new1 = _class.constructorId(
     r"(I)V",
   );
 
+  static final _new1 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+                  ffi.VarArgs<(ffi.Int64,)>)>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
+
   /// from: public void <init>(int number)
   /// The returned object must be released after use, by calling the [release] method.
   factory Example.new1(
     int number,
   ) {
     return Example.fromReference(
-        _id_new1(_class, referenceType, [jni.JValueInt(number)]));
+        _new1(_class.reference.pointer, _id_new1 as jni.JMethodIDPtr, number)
+            .reference);
   }
 
   static final _id_new2 = _class.constructorId(
     r"(IZ)V",
   );
 
+  static final _new2 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+                  ffi.VarArgs<(ffi.Int64, ffi.Int64)>)>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int, int)>();
+
   /// from: public void <init>(int number, boolean isUp)
   /// The returned object must be released after use, by calling the [release] method.
   factory Example.new2(
     int number,
     bool isUp,
   ) {
-    return Example.fromReference(
-        _id_new2(_class, referenceType, [jni.JValueInt(number), isUp ? 1 : 0]));
+    return Example.fromReference(_new2(_class.reference.pointer,
+            _id_new2 as jni.JMethodIDPtr, number, isUp ? 1 : 0)
+        .reference);
   }
 
   static final _id_new3 = _class.constructorId(
     r"(IZLjava/lang/String;)V",
   );
 
+  static final _new3 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Pointer<ffi.Void>
+                      )>)>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int,
+              int, ffi.Pointer<ffi.Void>)>();
+
   /// 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.
   factory Example.new3(
@@ -722,14 +1225,39 @@
     bool isUp,
     jni.JString codename,
   ) {
-    return Example.fromReference(_id_new3(_class, referenceType,
-        [jni.JValueInt(number), isUp ? 1 : 0, codename.reference.pointer]));
+    return Example.fromReference(_new3(
+            _class.reference.pointer,
+            _id_new3 as jni.JMethodIDPtr,
+            number,
+            isUp ? 1 : 0,
+            codename.reference.pointer)
+        .reference);
   }
 
   static final _id_new4 = _class.constructorId(
     r"(IIIIIIII)V",
   );
 
+  static final _new4 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64
+                      )>)>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int,
+              int, int, int, int, int, int, int)>();
+
   /// 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.
   factory Example.new4(
@@ -742,16 +1270,9 @@
     int g,
     int h,
   ) {
-    return Example.fromReference(_id_new4(_class, referenceType, [
-      jni.JValueInt(a),
-      jni.JValueInt(b),
-      jni.JValueInt(c),
-      jni.JValueInt(d),
-      jni.JValueInt(e),
-      jni.JValueInt(f),
-      jni.JValueInt(g),
-      jni.JValueInt(h)
-    ]));
+    return Example.fromReference(_new4(_class.reference.pointer,
+            _id_new4 as jni.JMethodIDPtr, a, b, c, d, e, f, g, h)
+        .reference);
   }
 
   static final _id_whichExample = _class.instanceMethodId(
@@ -759,9 +1280,23 @@
     r"()I",
   );
 
+  static final _whichExample = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public int whichExample()
   int whichExample() {
-    return _id_whichExample(this, const jni.jintType(), []);
+    return _whichExample(
+            reference.pointer, _id_whichExample as jni.JMethodIDPtr)
+        .integer;
   }
 
   static final _id_addInts = _class.staticMethodId(
@@ -769,13 +1304,23 @@
     r"(II)I",
   );
 
+  static final _addInts = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr, ffi.VarArgs<(ffi.Int64, ffi.Int64)>)>>(
+          "globalEnv_CallStaticIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int, int)>();
+
   /// from: static public int addInts(int a, int b)
   static int addInts(
     int a,
     int b,
   ) {
-    return _id_addInts(
-        _class, const jni.jintType(), [jni.JValueInt(a), jni.JValueInt(b)]);
+    return _addInts(
+            _class.reference.pointer, _id_addInts as jni.JMethodIDPtr, a, b)
+        .integer;
   }
 
   static final _id_getArr = _class.staticMethodId(
@@ -783,10 +1328,23 @@
     r"()[I",
   );
 
+  static final _getArr = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// 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 _id_getArr(_class, const jni.JArrayType(jni.jintType()), []);
+    return _getArr(_class.reference.pointer, _id_getArr as jni.JMethodIDPtr)
+        .object(const jni.JArrayType(jni.jintType()));
   }
 
   static final _id_addAll = _class.staticMethodId(
@@ -794,11 +1352,24 @@
     r"([I)I",
   );
 
+  static final _addAll = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallStaticIntMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: static public int addAll(int[] arr)
   static int addAll(
     jni.JArray<jni.jint> arr,
   ) {
-    return _id_addAll(_class, const jni.jintType(), [arr.reference.pointer]);
+    return _addAll(_class.reference.pointer, _id_addAll as jni.JMethodIDPtr,
+            arr.reference.pointer)
+        .integer;
   }
 
   static final _id_getSelf = _class.instanceMethodId(
@@ -806,10 +1377,23 @@
     r"()Lcom/github/dart_lang/jnigen/simple_package/Example;",
   );
 
+  static final _getSelf = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// 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 _id_getSelf(this, const $ExampleType(), []);
+    return _getSelf(reference.pointer, _id_getSelf as jni.JMethodIDPtr)
+        .object(const $ExampleType());
   }
 
   static final _id_throwException = _class.staticMethodId(
@@ -817,9 +1401,23 @@
     r"()V",
   );
 
+  static final _throwException = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JThrowablePtr Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallStaticVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: static public void throwException()
   static void throwException() {
-    _id_throwException(_class, const jni.jvoidType(), []);
+    _throwException(
+            _class.reference.pointer, _id_throwException as jni.JMethodIDPtr)
+        .check();
   }
 
   static final _id_overloaded = _class.instanceMethodId(
@@ -827,9 +1425,21 @@
     r"()V",
   );
 
+  static final _overloaded = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JThrowablePtr Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public void overloaded()
   void overloaded() {
-    _id_overloaded(this, const jni.jvoidType(), []);
+    _overloaded(reference.pointer, _id_overloaded as jni.JMethodIDPtr).check();
   }
 
   static final _id_overloaded1 = _class.instanceMethodId(
@@ -837,13 +1447,25 @@
     r"(ILjava/lang/String;)V",
   );
 
+  static final _overloaded1 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JThrowablePtr Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Int64, ffi.Pointer<ffi.Void>)>)>>(
+          "globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              int, ffi.Pointer<ffi.Void>)>();
+
   /// from: public void overloaded(int a, java.lang.String b)
   void overloaded1(
     int a,
     jni.JString b,
   ) {
-    _id_overloaded1(
-        this, const jni.jvoidType(), [jni.JValueInt(a), b.reference.pointer]);
+    _overloaded1(reference.pointer, _id_overloaded1 as jni.JMethodIDPtr, a,
+            b.reference.pointer)
+        .check();
   }
 
   static final _id_overloaded2 = _class.instanceMethodId(
@@ -851,11 +1473,22 @@
     r"(I)V",
   );
 
+  static final _overloaded2 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JThrowablePtr Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<(ffi.Int64,)>)>>("globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int)>();
+
   /// from: public void overloaded(int a)
   void overloaded2(
     int a,
   ) {
-    _id_overloaded2(this, const jni.jvoidType(), [jni.JValueInt(a)]);
+    _overloaded2(reference.pointer, _id_overloaded2 as jni.JMethodIDPtr, a)
+        .check();
   }
 
   static final _id_overloaded3 = _class.instanceMethodId(
@@ -863,13 +1496,28 @@
     r"(Ljava/util/List;Ljava/lang/String;)V",
   );
 
+  static final _overloaded3 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JThrowablePtr Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>
+                      )>)>>("globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
+
   /// from: public void overloaded(java.util.List<java.lang.Integer> a, java.lang.String b)
   void overloaded3(
     jni.JList<jni.JInteger> a,
     jni.JString b,
   ) {
-    _id_overloaded3(this, const jni.jvoidType(),
-        [a.reference.pointer, b.reference.pointer]);
+    _overloaded3(reference.pointer, _id_overloaded3 as jni.JMethodIDPtr,
+            a.reference.pointer, b.reference.pointer)
+        .check();
   }
 
   static final _id_overloaded4 = _class.instanceMethodId(
@@ -877,11 +1525,24 @@
     r"(Ljava/util/List;)V",
   );
 
+  static final _overloaded4 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JThrowablePtr Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public void overloaded(java.util.List<java.lang.Integer> a)
   void overloaded4(
     jni.JList<jni.JInteger> a,
   ) {
-    _id_overloaded4(this, const jni.jvoidType(), [a.reference.pointer]);
+    _overloaded4(reference.pointer, _id_overloaded4 as jni.JMethodIDPtr,
+            a.reference.pointer)
+        .check();
   }
 }
 
@@ -941,10 +1602,24 @@
     r"()V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory C2() {
-    return C2.fromReference(_id_new0(_class, referenceType, []));
+    return C2.fromReference(
+        _new0(_class.reference.pointer, _id_new0 as jni.JMethodIDPtr)
+            .reference);
   }
 }
 
@@ -990,10 +1665,24 @@
     r"()V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory Example1() {
-    return Example1.fromReference(_id_new0(_class, referenceType, []));
+    return Example1.fromReference(
+        _new0(_class.reference.pointer, _id_new0 as jni.JMethodIDPtr)
+            .reference);
   }
 
   static final _id_whichExample = _class.instanceMethodId(
@@ -1001,9 +1690,23 @@
     r"()I",
   );
 
+  static final _whichExample = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public int whichExample()
   int whichExample() {
-    return _id_whichExample(this, const jni.jintType(), []);
+    return _whichExample(
+            reference.pointer, _id_whichExample as jni.JMethodIDPtr)
+        .integer;
   }
 }
 
@@ -1110,6 +1813,20 @@
     r"(Lcom/github/dart_lang/jnigen/generics/GrandParent$Parent;Ljava/lang/Object;)V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>
+                      )>)>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
+
   /// from: public void <init>(com.github.dart_lang.jnigen.generics.GrandParent$Parent $parent, U newValue)
   /// The returned object must be released after use, by calling the [release] method.
   factory GrandParent_Parent_Child(
@@ -1132,8 +1849,9 @@
         T,
         S,
         U,
-        _id_new0(_class, referenceType,
-            [$parent.reference.pointer, newValue.reference.pointer]));
+        _new0(_class.reference.pointer, _id_new0 as jni.JMethodIDPtr,
+                $parent.reference.pointer, newValue.reference.pointer)
+            .reference);
   }
 }
 
@@ -1238,6 +1956,20 @@
     r"(Lcom/github/dart_lang/jnigen/generics/GrandParent;Ljava/lang/Object;)V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>
+                      )>)>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
+
   /// from: public void <init>(com.github.dart_lang.jnigen.generics.GrandParent $parent, S newValue)
   /// The returned object must be released after use, by calling the [release] method.
   factory GrandParent_Parent(
@@ -1255,8 +1987,9 @@
     return GrandParent_Parent.fromReference(
         T,
         S,
-        _id_new0(_class, referenceType,
-            [$parent.reference.pointer, newValue.reference.pointer]));
+        _new0(_class.reference.pointer, _id_new0 as jni.JMethodIDPtr,
+                $parent.reference.pointer, newValue.reference.pointer)
+            .reference);
   }
 }
 
@@ -1357,6 +2090,25 @@
     r"(Lcom/github/dart_lang/jnigen/generics/GrandParent$StaticParent;Ljava/lang/Object;Ljava/lang/Object;)V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>
+                      )>)>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+              ffi.Pointer<ffi.Void>,
+              jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>,
+              ffi.Pointer<ffi.Void>,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public void <init>(com.github.dart_lang.jnigen.generics.GrandParent$StaticParent $parent, S parentValue, U value)
   /// The returned object must be released after use, by calling the [release] method.
   factory GrandParent_StaticParent_Child(
@@ -1376,11 +2128,13 @@
     return GrandParent_StaticParent_Child.fromReference(
         S,
         U,
-        _id_new0(_class, referenceType, [
-          $parent.reference.pointer,
-          parentValue.reference.pointer,
-          value.reference.pointer
-        ]));
+        _new0(
+                _class.reference.pointer,
+                _id_new0 as jni.JMethodIDPtr,
+                $parent.reference.pointer,
+                parentValue.reference.pointer,
+                value.reference.pointer)
+            .reference);
   }
 }
 
@@ -1463,6 +2217,17 @@
     r"(Ljava/lang/Object;)V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public void <init>(S value)
   /// The returned object must be released after use, by calling the [release] method.
   factory GrandParent_StaticParent(
@@ -1473,7 +2238,10 @@
       value.$type,
     ]) as jni.JObjType<$S>;
     return GrandParent_StaticParent.fromReference(
-        S, _id_new0(_class, referenceType, [value.reference.pointer]));
+        S,
+        _new0(_class.reference.pointer, _id_new0 as jni.JMethodIDPtr,
+                value.reference.pointer)
+            .reference);
   }
 }
 
@@ -1551,6 +2319,17 @@
     r"(Ljava/lang/Object;)V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public void <init>(T value)
   /// The returned object must be released after use, by calling the [release] method.
   factory GrandParent(
@@ -1561,7 +2340,10 @@
       value.$type,
     ]) as jni.JObjType<$T>;
     return GrandParent.fromReference(
-        T, _id_new0(_class, referenceType, [value.reference.pointer]));
+        T,
+        _new0(_class.reference.pointer, _id_new0 as jni.JMethodIDPtr,
+                value.reference.pointer)
+            .reference);
   }
 
   static final _id_stringParent = _class.instanceMethodId(
@@ -1569,13 +2351,25 @@
     r"()Lcom/github/dart_lang/jnigen/generics/GrandParent$Parent;",
   );
 
+  static final _stringParent = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public com.github.dart_lang.jnigen.generics.GrandParent<T>.Parent<java.lang.String> stringParent()
   /// The returned object must be released after use, by calling the [release] method.
   GrandParent_Parent<jni.JObject, jni.JString> stringParent() {
-    return _id_stringParent(
-        this,
-        const $GrandParent_ParentType(jni.JObjectType(), jni.JStringType()),
-        []);
+    return _stringParent(
+            reference.pointer, _id_stringParent as jni.JMethodIDPtr)
+        .object(const $GrandParent_ParentType(
+            jni.JObjectType(), jni.JStringType()));
   }
 
   static final _id_varParent = _class.instanceMethodId(
@@ -1583,6 +2377,17 @@
     r"(Ljava/lang/Object;)Lcom/github/dart_lang/jnigen/generics/GrandParent$Parent;",
   );
 
+  static final _varParent = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public com.github.dart_lang.jnigen.generics.GrandParent<T>.Parent<S> varParent(S nestedValue)
   /// The returned object must be released after use, by calling the [release] method.
   GrandParent_Parent<jni.JObject, $S> varParent<$S extends jni.JObject>(
@@ -1592,10 +2397,9 @@
     S ??= jni.lowestCommonSuperType([
       nestedValue.$type,
     ]) as jni.JObjType<$S>;
-    return _id_varParent(
-        this,
-        $GrandParent_ParentType(const jni.JObjectType(), S),
-        [nestedValue.reference.pointer]);
+    return _varParent(reference.pointer, _id_varParent as jni.JMethodIDPtr,
+            nestedValue.reference.pointer)
+        .object($GrandParent_ParentType(const jni.JObjectType(), S));
   }
 
   static final _id_stringStaticParent = _class.staticMethodId(
@@ -1603,11 +2407,24 @@
     r"()Lcom/github/dart_lang/jnigen/generics/GrandParent$StaticParent;",
   );
 
+  static final _stringStaticParent = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: static public com.github.dart_lang.jnigen.generics.GrandParent.StaticParent<java.lang.String> stringStaticParent()
   /// The returned object must be released after use, by calling the [release] method.
   static GrandParent_StaticParent<jni.JString> stringStaticParent() {
-    return _id_stringStaticParent(
-        _class, const $GrandParent_StaticParentType(jni.JStringType()), []);
+    return _stringStaticParent(_class.reference.pointer,
+            _id_stringStaticParent as jni.JMethodIDPtr)
+        .object(const $GrandParent_StaticParentType(jni.JStringType()));
   }
 
   static final _id_varStaticParent = _class.staticMethodId(
@@ -1615,6 +2432,17 @@
     r"(Ljava/lang/Object;)Lcom/github/dart_lang/jnigen/generics/GrandParent$StaticParent;",
   );
 
+  static final _varStaticParent = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: static public com.github.dart_lang.jnigen.generics.GrandParent.StaticParent<S> varStaticParent(S value)
   /// The returned object must be released after use, by calling the [release] method.
   static GrandParent_StaticParent<$S> varStaticParent<$S extends jni.JObject>(
@@ -1624,8 +2452,9 @@
     S ??= jni.lowestCommonSuperType([
       value.$type,
     ]) as jni.JObjType<$S>;
-    return _id_varStaticParent(
-        _class, $GrandParent_StaticParentType(S), [value.reference.pointer]);
+    return _varStaticParent(_class.reference.pointer,
+            _id_varStaticParent as jni.JMethodIDPtr, value.reference.pointer)
+        .object($GrandParent_StaticParentType(S));
   }
 
   static final _id_staticParentWithSameType = _class.instanceMethodId(
@@ -1633,11 +2462,24 @@
     r"()Lcom/github/dart_lang/jnigen/generics/GrandParent$StaticParent;",
   );
 
+  static final _staticParentWithSameType = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public com.github.dart_lang.jnigen.generics.GrandParent.StaticParent<T> staticParentWithSameType()
   /// The returned object must be released after use, by calling the [release] method.
   GrandParent_StaticParent<$T> staticParentWithSameType() {
-    return _id_staticParentWithSameType(
-        this, $GrandParent_StaticParentType(T), []);
+    return _staticParentWithSameType(
+            reference.pointer, _id_staticParentWithSameType as jni.JMethodIDPtr)
+        .object($GrandParent_StaticParentType(T));
   }
 }
 
@@ -1733,6 +2575,25 @@
     r"(Lcom/github/dart_lang/jnigen/generics/MyMap;Ljava/lang/Object;Ljava/lang/Object;)V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>
+                      )>)>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+              ffi.Pointer<ffi.Void>,
+              jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>,
+              ffi.Pointer<ffi.Void>,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public void <init>(com.github.dart_lang.jnigen.generics.MyMap $parent, K key, V value)
   /// The returned object must be released after use, by calling the [release] method.
   factory MyMap_MyEntry(
@@ -1753,11 +2614,13 @@
     return MyMap_MyEntry.fromReference(
         K,
         V,
-        _id_new0(_class, referenceType, [
-          $parent.reference.pointer,
-          key.reference.pointer,
-          value.reference.pointer
-        ]));
+        _new0(
+                _class.reference.pointer,
+                _id_new0 as jni.JMethodIDPtr,
+                $parent.reference.pointer,
+                key.reference.pointer,
+                value.reference.pointer)
+            .reference);
   }
 }
 
@@ -1831,13 +2694,29 @@
     r"()V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory MyMap({
     required jni.JObjType<$K> K,
     required jni.JObjType<$V> V,
   }) {
-    return MyMap.fromReference(K, V, _id_new0(_class, referenceType, []));
+    return MyMap.fromReference(
+        K,
+        V,
+        _new0(_class.reference.pointer, _id_new0 as jni.JMethodIDPtr)
+            .reference);
   }
 
   static final _id_get0 = _class.instanceMethodId(
@@ -1845,12 +2724,25 @@
     r"(Ljava/lang/Object;)Ljava/lang/Object;",
   );
 
+  static final _get0 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public V get(K key)
   /// The returned object must be released after use, by calling the [release] method.
   $V get0(
     $K key,
   ) {
-    return _id_get0(this, V, [key.reference.pointer]);
+    return _get0(reference.pointer, _id_get0 as jni.JMethodIDPtr,
+            key.reference.pointer)
+        .object(V);
   }
 
   static final _id_put = _class.instanceMethodId(
@@ -1858,13 +2750,29 @@
     r"(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
   );
 
+  static final _put = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>
+                      )>)>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
+
   /// from: public V put(K key, V value)
   /// The returned object must be released after use, by calling the [release] method.
   $V put(
     $K key,
     $V value,
   ) {
-    return _id_put(this, V, [key.reference.pointer, value.reference.pointer]);
+    return _put(reference.pointer, _id_put as jni.JMethodIDPtr,
+            key.reference.pointer, value.reference.pointer)
+        .object(V);
   }
 
   static final _id_entryStack = _class.instanceMethodId(
@@ -1872,14 +2780,24 @@
     r"()Lcom/github/dart_lang/jnigen/generics/MyStack;",
   );
 
+  static final _entryStack = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public com.github.dart_lang.jnigen.generics.MyStack<com.github.dart_lang.jnigen.generics.MyMap<K,V>.MyEntry> entryStack()
   /// The returned object must be released after use, by calling the [release] method.
   MyStack<MyMap_MyEntry<jni.JObject, jni.JObject>> entryStack() {
-    return _id_entryStack(
-        this,
-        const $MyStackType(
-            $MyMap_MyEntryType(jni.JObjectType(), jni.JObjectType())),
-        []);
+    return _entryStack(reference.pointer, _id_entryStack as jni.JMethodIDPtr)
+        .object(const $MyStackType(
+            $MyMap_MyEntryType(jni.JObjectType(), jni.JObjectType())));
   }
 }
 
@@ -1946,12 +2864,27 @@
     r"()V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory MyStack({
     required jni.JObjType<$T> T,
   }) {
-    return MyStack.fromReference(T, _id_new0(_class, referenceType, []));
+    return MyStack.fromReference(
+        T,
+        _new0(_class.reference.pointer, _id_new0 as jni.JMethodIDPtr)
+            .reference);
   }
 
   static final _id_fromArray = _class.staticMethodId(
@@ -1959,6 +2892,17 @@
     r"([Ljava/lang/Object;)Lcom/github/dart_lang/jnigen/generics/MyStack;",
   );
 
+  static final _fromArray = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: static public com.github.dart_lang.jnigen.generics.MyStack<T> fromArray(T[] arr)
   /// The returned object must be released after use, by calling the [release] method.
   static MyStack<$T> fromArray<$T extends jni.JObject>(
@@ -1968,7 +2912,9 @@
     T ??= jni.lowestCommonSuperType([
       ((arr.$type as jni.JArrayType).elementType as jni.JObjType),
     ]) as jni.JObjType<$T>;
-    return _id_fromArray(_class, $MyStackType(T), [arr.reference.pointer]);
+    return _fromArray(_class.reference.pointer,
+            _id_fromArray as jni.JMethodIDPtr, arr.reference.pointer)
+        .object($MyStackType(T));
   }
 
   static final _id_fromArrayOfArrayOfGrandParents = _class.staticMethodId(
@@ -1976,6 +2922,17 @@
     r"([[Lcom/github/dart_lang/jnigen/generics/GrandParent;)Lcom/github/dart_lang/jnigen/generics/MyStack;",
   );
 
+  static final _fromArrayOfArrayOfGrandParents = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: static public com.github.dart_lang.jnigen.generics.MyStack<S> fromArrayOfArrayOfGrandParents(com.github.dart_lang.jnigen.generics.GrandParent<S>[][] arr)
   /// The returned object must be released after use, by calling the [release] method.
   static MyStack<$S> fromArrayOfArrayOfGrandParents<$S extends jni.JObject>(
@@ -1988,8 +2945,11 @@
               .elementType as jni.JObjType) as $GrandParentType)
           .T,
     ]) as jni.JObjType<$S>;
-    return _id_fromArrayOfArrayOfGrandParents(
-        _class, $MyStackType(S), [arr.reference.pointer]);
+    return _fromArrayOfArrayOfGrandParents(
+            _class.reference.pointer,
+            _id_fromArrayOfArrayOfGrandParents as jni.JMethodIDPtr,
+            arr.reference.pointer)
+        .object($MyStackType(S));
   }
 
   static final _id_of = _class.staticMethodId(
@@ -1997,12 +2957,25 @@
     r"()Lcom/github/dart_lang/jnigen/generics/MyStack;",
   );
 
+  static final _of = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// 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.
   static MyStack<$T> of<$T extends jni.JObject>({
     required jni.JObjType<$T> T,
   }) {
-    return _id_of(_class, $MyStackType(T), []);
+    return _of(_class.reference.pointer, _id_of as jni.JMethodIDPtr)
+        .object($MyStackType(T));
   }
 
   static final _id_of1 = _class.staticMethodId(
@@ -2010,6 +2983,17 @@
     r"(Ljava/lang/Object;)Lcom/github/dart_lang/jnigen/generics/MyStack;",
   );
 
+  static final _of1 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: static public com.github.dart_lang.jnigen.generics.MyStack<T> of(T obj)
   /// The returned object must be released after use, by calling the [release] method.
   static MyStack<$T> of1<$T extends jni.JObject>(
@@ -2019,7 +3003,9 @@
     T ??= jni.lowestCommonSuperType([
       obj.$type,
     ]) as jni.JObjType<$T>;
-    return _id_of1(_class, $MyStackType(T), [obj.reference.pointer]);
+    return _of1(_class.reference.pointer, _id_of1 as jni.JMethodIDPtr,
+            obj.reference.pointer)
+        .object($MyStackType(T));
   }
 
   static final _id_of2 = _class.staticMethodId(
@@ -2027,6 +3013,20 @@
     r"(Ljava/lang/Object;Ljava/lang/Object;)Lcom/github/dart_lang/jnigen/generics/MyStack;",
   );
 
+  static final _of2 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>
+                      )>)>>("globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Void>)>();
+
   /// from: static public com.github.dart_lang.jnigen.generics.MyStack<T> of(T obj, T obj2)
   /// The returned object must be released after use, by calling the [release] method.
   static MyStack<$T> of2<$T extends jni.JObject>(
@@ -2038,8 +3038,9 @@
       obj2.$type,
       obj.$type,
     ]) as jni.JObjType<$T>;
-    return _id_of2(_class, $MyStackType(T),
-        [obj.reference.pointer, obj2.reference.pointer]);
+    return _of2(_class.reference.pointer, _id_of2 as jni.JMethodIDPtr,
+            obj.reference.pointer, obj2.reference.pointer)
+        .object($MyStackType(T));
   }
 
   static final _id_push = _class.instanceMethodId(
@@ -2047,11 +3048,24 @@
     r"(Ljava/lang/Object;)V",
   );
 
+  static final _push = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JThrowablePtr Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public void push(T item)
   void push(
     $T item,
   ) {
-    _id_push(this, const jni.jvoidType(), [item.reference.pointer]);
+    _push(reference.pointer, _id_push as jni.JMethodIDPtr,
+            item.reference.pointer)
+        .check();
   }
 
   static final _id_pop = _class.instanceMethodId(
@@ -2059,10 +3073,22 @@
     r"()Ljava/lang/Object;",
   );
 
+  static final _pop = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public T pop()
   /// The returned object must be released after use, by calling the [release] method.
   $T pop() {
-    return _id_pop(this, T, []);
+    return _pop(reference.pointer, _id_pop as jni.JMethodIDPtr).object(T);
   }
 
   static final _id_size = _class.instanceMethodId(
@@ -2070,9 +3096,21 @@
     r"()I",
   );
 
+  static final _size = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public int size()
   int size() {
-    return _id_size(this, const jni.jintType(), []);
+    return _size(reference.pointer, _id_size as jni.JMethodIDPtr).integer;
   }
 }
 
@@ -2136,12 +3174,27 @@
     r"()V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory StringKeyedMap({
     required jni.JObjType<$V> V,
   }) {
-    return StringKeyedMap.fromReference(V, _id_new0(_class, referenceType, []));
+    return StringKeyedMap.fromReference(
+        V,
+        _new0(_class.reference.pointer, _id_new0 as jni.JMethodIDPtr)
+            .reference);
   }
 }
 
@@ -2196,10 +3249,24 @@
     r"()V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory StringStack() {
-    return StringStack.fromReference(_id_new0(_class, referenceType, []));
+    return StringStack.fromReference(
+        _new0(_class.reference.pointer, _id_new0 as jni.JMethodIDPtr)
+            .reference);
   }
 }
 
@@ -2256,13 +3323,27 @@
     r"()V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory StringValuedMap({
     required jni.JObjType<$K> K,
   }) {
     return StringValuedMap.fromReference(
-        K, _id_new0(_class, referenceType, []));
+        K,
+        _new0(_class.reference.pointer, _id_new0 as jni.JMethodIDPtr)
+            .reference);
   }
 }
 
@@ -2328,11 +3409,24 @@
     r"(Ljava/lang/String;)V",
   );
 
+  static final _voidCallback = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JThrowablePtr Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public abstract void voidCallback(java.lang.String s)
   void voidCallback(
     jni.JString s,
   ) {
-    _id_voidCallback(this, const jni.jvoidType(), [s.reference.pointer]);
+    _voidCallback(reference.pointer, _id_voidCallback as jni.JMethodIDPtr,
+            s.reference.pointer)
+        .check();
   }
 
   static final _id_stringCallback = _class.instanceMethodId(
@@ -2340,13 +3434,25 @@
     r"(Ljava/lang/String;)Ljava/lang/String;",
   );
 
+  static final _stringCallback = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public abstract java.lang.String stringCallback(java.lang.String s)
   /// The returned object must be released after use, by calling the [release] method.
   jni.JString stringCallback(
     jni.JString s,
   ) {
-    return _id_stringCallback(
-        this, const jni.JStringType(), [s.reference.pointer]);
+    return _stringCallback(reference.pointer,
+            _id_stringCallback as jni.JMethodIDPtr, s.reference.pointer)
+        .object(const jni.JStringType());
   }
 
   static final _id_varCallback = _class.instanceMethodId(
@@ -2354,12 +3460,25 @@
     r"(Ljava/lang/Object;)Ljava/lang/Object;",
   );
 
+  static final _varCallback = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: public abstract T varCallback(T t)
   /// The returned object must be released after use, by calling the [release] method.
   $T varCallback(
     $T t,
   ) {
-    return _id_varCallback(this, T, [t.reference.pointer]);
+    return _varCallback(reference.pointer, _id_varCallback as jni.JMethodIDPtr,
+            t.reference.pointer)
+        .object(T);
   }
 
   static final _id_manyPrimitives = _class.instanceMethodId(
@@ -2367,6 +3486,22 @@
     r"(IZCD)J",
   );
 
+  static final _manyPrimitives = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Double
+                      )>)>>("globalEnv_CallLongMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int,
+              int, int, double)>();
+
   /// from: public abstract long manyPrimitives(int a, boolean b, char c, double d)
   int manyPrimitives(
     int a,
@@ -2374,8 +3509,9 @@
     int c,
     double d,
   ) {
-    return _id_manyPrimitives(this, const jni.jlongType(),
-        [jni.JValueInt(a), b ? 1 : 0, jni.JValueChar(c), d]);
+    return _manyPrimitives(reference.pointer,
+            _id_manyPrimitives as jni.JMethodIDPtr, a, b ? 1 : 0, c, d)
+        .long;
   }
 
   /// Maps a specific port to the implemented interface.
@@ -2592,11 +3728,24 @@
     r"()V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory MyInterfaceConsumer() {
     return MyInterfaceConsumer.fromReference(
-        _id_new0(_class, referenceType, []));
+        _new0(_class.reference.pointer, _id_new0 as jni.JMethodIDPtr)
+            .reference);
   }
 
   static final _id_consumeOnAnotherThread = _class.staticMethodId(
@@ -2604,6 +3753,33 @@
     r"(Lcom/github/dart_lang/jnigen/interfaces/MyInterface;Ljava/lang/String;IZCDLjava/lang/Object;)V",
   );
 
+  static final _consumeOnAnotherThread = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JThrowablePtr Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Double,
+                        ffi.Pointer<ffi.Void>
+                      )>)>>("globalEnv_CallStaticVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(
+              ffi.Pointer<ffi.Void>,
+              jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>,
+              ffi.Pointer<ffi.Void>,
+              int,
+              int,
+              int,
+              double,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: static public void consumeOnAnotherThread(com.github.dart_lang.jnigen.interfaces.MyInterface<T> myInterface, java.lang.String s, int a, boolean b, char c, double d, T t)
   static void consumeOnAnotherThread<$T extends jni.JObject>(
     MyInterface<$T> myInterface,
@@ -2619,15 +3795,17 @@
       t.$type,
       (myInterface.$type as $MyInterfaceType).T,
     ]) as jni.JObjType<$T>;
-    _id_consumeOnAnotherThread(_class, const jni.jvoidType(), [
-      myInterface.reference.pointer,
-      s.reference.pointer,
-      jni.JValueInt(a),
-      b ? 1 : 0,
-      jni.JValueChar(c),
-      d,
-      t.reference.pointer
-    ]);
+    _consumeOnAnotherThread(
+            _class.reference.pointer,
+            _id_consumeOnAnotherThread as jni.JMethodIDPtr,
+            myInterface.reference.pointer,
+            s.reference.pointer,
+            a,
+            b ? 1 : 0,
+            c,
+            d,
+            t.reference.pointer)
+        .check();
   }
 
   static final _id_consumeOnSameThread = _class.staticMethodId(
@@ -2635,6 +3813,33 @@
     r"(Lcom/github/dart_lang/jnigen/interfaces/MyInterface;Ljava/lang/String;IZCDLjava/lang/Object;)V",
   );
 
+  static final _consumeOnSameThread = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JThrowablePtr Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Pointer<ffi.Void>,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Double,
+                        ffi.Pointer<ffi.Void>
+                      )>)>>("globalEnv_CallStaticVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(
+              ffi.Pointer<ffi.Void>,
+              jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>,
+              ffi.Pointer<ffi.Void>,
+              int,
+              int,
+              int,
+              double,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: static public void consumeOnSameThread(com.github.dart_lang.jnigen.interfaces.MyInterface<T> myInterface, java.lang.String s, int a, boolean b, char c, double d, T t)
   static void consumeOnSameThread<$T extends jni.JObject>(
     MyInterface<$T> myInterface,
@@ -2650,15 +3855,17 @@
       t.$type,
       (myInterface.$type as $MyInterfaceType).T,
     ]) as jni.JObjType<$T>;
-    _id_consumeOnSameThread(_class, const jni.jvoidType(), [
-      myInterface.reference.pointer,
-      s.reference.pointer,
-      jni.JValueInt(a),
-      b ? 1 : 0,
-      jni.JValueChar(c),
-      d,
-      t.reference.pointer
-    ]);
+    _consumeOnSameThread(
+            _class.reference.pointer,
+            _id_consumeOnSameThread as jni.JMethodIDPtr,
+            myInterface.reference.pointer,
+            s.reference.pointer,
+            a,
+            b ? 1 : 0,
+            c,
+            d,
+            t.reference.pointer)
+        .check();
   }
 }
 
@@ -2708,9 +3915,21 @@
     r"()V",
   );
 
+  static final _run = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JThrowablePtr Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public abstract void run()
   void run() {
-    _id_run(this, const jni.jvoidType(), []);
+    _run(reference.pointer, _id_run as jni.JMethodIDPtr).check();
   }
 
   /// Maps a specific port to the implemented interface.
@@ -2860,13 +4079,25 @@
     r"(Lcom/github/dart_lang/jnigen/interfaces/MyRunnable;)V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// 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.
   factory MyRunnableRunner(
     MyRunnable runnable,
   ) {
-    return MyRunnableRunner.fromReference(
-        _id_new0(_class, referenceType, [runnable.reference.pointer]));
+    return MyRunnableRunner.fromReference(_new0(_class.reference.pointer,
+            _id_new0 as jni.JMethodIDPtr, runnable.reference.pointer)
+        .reference);
   }
 
   static final _id_runOnSameThread = _class.instanceMethodId(
@@ -2874,9 +4105,22 @@
     r"()V",
   );
 
+  static final _runOnSameThread = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JThrowablePtr Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public void runOnSameThread()
   void runOnSameThread() {
-    _id_runOnSameThread(this, const jni.jvoidType(), []);
+    _runOnSameThread(reference.pointer, _id_runOnSameThread as jni.JMethodIDPtr)
+        .check();
   }
 
   static final _id_runOnAnotherThread = _class.instanceMethodId(
@@ -2884,9 +4128,23 @@
     r"()V",
   );
 
+  static final _runOnAnotherThread = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JThrowablePtr Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public void runOnAnotherThread()
   void runOnAnotherThread() {
-    _id_runOnAnotherThread(this, const jni.jvoidType(), []);
+    _runOnAnotherThread(
+            reference.pointer, _id_runOnAnotherThread as jni.JMethodIDPtr)
+        .check();
   }
 }
 
@@ -2936,11 +4194,23 @@
     r"()[Lcom/github/dart_lang/jnigen/annotations/JsonSerializable$Case;",
   );
 
+  static final _values = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: static public com.github.dart_lang.jnigen.annotations.JsonSerializable.Case[] values()
   /// The returned object must be released after use, by calling the [release] method.
   static jni.JArray<JsonSerializable_Case> values() {
-    return _id_values(
-        _class, const jni.JArrayType($JsonSerializable_CaseType()), []);
+    return _values(_class.reference.pointer, _id_values as jni.JMethodIDPtr)
+        .object(const jni.JArrayType($JsonSerializable_CaseType()));
   }
 
   static final _id_valueOf = _class.staticMethodId(
@@ -2948,13 +4218,25 @@
     r"(Ljava/lang/String;)Lcom/github/dart_lang/jnigen/annotations/JsonSerializable$Case;",
   );
 
+  static final _valueOf = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: static public com.github.dart_lang.jnigen.annotations.JsonSerializable.Case valueOf(java.lang.String name)
   /// The returned object must be released after use, by calling the [release] method.
   static JsonSerializable_Case valueOf(
     jni.JString name,
   ) {
-    return _id_valueOf(
-        _class, const $JsonSerializable_CaseType(), [name.reference.pointer]);
+    return _valueOf(_class.reference.pointer, _id_valueOf as jni.JMethodIDPtr,
+            name.reference.pointer)
+        .object(const $JsonSerializable_CaseType());
   }
 }
 
@@ -3005,10 +4287,23 @@
     r"()Lcom/github/dart_lang/jnigen/annotations/JsonSerializable$Case;",
   );
 
+  static final _value = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// 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 _id_value(this, const $JsonSerializable_CaseType(), []);
+    return _value(reference.pointer, _id_value as jni.JMethodIDPtr)
+        .object(const $JsonSerializable_CaseType());
   }
 
   /// Maps a specific port to the implemented interface.
@@ -3149,10 +4444,24 @@
     r"()V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory MyDataClass() {
-    return MyDataClass.fromReference(_id_new0(_class, referenceType, []));
+    return MyDataClass.fromReference(
+        _new0(_class.reference.pointer, _id_new0 as jni.JMethodIDPtr)
+            .reference);
   }
 }
 
@@ -3201,10 +4510,23 @@
     r"()[Lcom/github/dart_lang/jnigen/simple_package/Color;",
   );
 
+  static final _values = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: static public com.github.dart_lang.jnigen.simple_package.Color[] values()
   /// The returned object must be released after use, by calling the [release] method.
   static jni.JArray<Color> values() {
-    return _id_values(_class, const jni.JArrayType($ColorType()), []);
+    return _values(_class.reference.pointer, _id_values as jni.JMethodIDPtr)
+        .object(const jni.JArrayType($ColorType()));
   }
 
   static final _id_valueOf = _class.staticMethodId(
@@ -3212,12 +4534,25 @@
     r"(Ljava/lang/String;)Lcom/github/dart_lang/jnigen/simple_package/Color;",
   );
 
+  static final _valueOf = ProtectedJniExtensions.lookup<
+              ffi.NativeFunction<
+                  jni.JniResult Function(
+                      ffi.Pointer<ffi.Void>,
+                      jni.JMethodIDPtr,
+                      ffi.VarArgs<(ffi.Pointer<ffi.Void>,)>)>>(
+          "globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+              ffi.Pointer<ffi.Void>)>();
+
   /// from: static public com.github.dart_lang.jnigen.simple_package.Color valueOf(java.lang.String name)
   /// The returned object must be released after use, by calling the [release] method.
   static Color valueOf(
     jni.JString name,
   ) {
-    return _id_valueOf(_class, const $ColorType(), [name.reference.pointer]);
+    return _valueOf(_class.reference.pointer, _id_valueOf as jni.JMethodIDPtr,
+            name.reference.pointer)
+        .object(const $ColorType());
   }
 }
 
@@ -3264,29 +4599,70 @@
     r"()V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory Exceptions() {
-    return Exceptions.fromReference(_id_new0(_class, referenceType, []));
+    return Exceptions.fromReference(
+        _new0(_class.reference.pointer, _id_new0 as jni.JMethodIDPtr)
+            .reference);
   }
 
   static final _id_new1 = _class.constructorId(
     r"(F)V",
   );
 
+  static final _new1 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr,
+                  ffi.VarArgs<(ffi.Double,)>)>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+              ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, double)>();
+
   /// from: public void <init>(float x)
   /// The returned object must be released after use, by calling the [release] method.
   factory Exceptions.new1(
     double x,
   ) {
     return Exceptions.fromReference(
-        _id_new1(_class, referenceType, [jni.JValueFloat(x)]));
+        _new1(_class.reference.pointer, _id_new1 as jni.JMethodIDPtr, x)
+            .reference);
   }
 
   static final _id_new2 = _class.constructorId(
     r"(IIIIII)V",
   );
 
+  static final _new2 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>,
+                  jni.JMethodIDPtr,
+                  ffi.VarArgs<
+                      (
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64,
+                        ffi.Int64
+                      )>)>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(ffi.Pointer<ffi.Void>, jni.JMethodIDPtr, int,
+              int, int, int, int, int)>();
+
   /// 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.
   factory Exceptions.new2(
@@ -3297,14 +4673,9 @@
     int e,
     int f,
   ) {
-    return Exceptions.fromReference(_id_new2(_class, referenceType, [
-      jni.JValueInt(a),
-      jni.JValueInt(b),
-      jni.JValueInt(c),
-      jni.JValueInt(d),
-      jni.JValueInt(e),
-      jni.JValueInt(f)
-    ]));
+    return Exceptions.fromReference(_new2(_class.reference.pointer,
+            _id_new2 as jni.JMethodIDPtr, a, b, c, d, e, f)
+        .reference);
   }
 
   static final _id_staticObjectMethod = _class.staticMethodId(
@@ -3312,10 +4683,24 @@
     r"()Ljava/lang/Object;",
   );
 
+  static final _staticObjectMethod = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// 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 _id_staticObjectMethod(_class, const jni.JObjectType(), []);
+    return _staticObjectMethod(_class.reference.pointer,
+            _id_staticObjectMethod as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_staticIntMethod = _class.staticMethodId(
@@ -3323,9 +4708,23 @@
     r"()I",
   );
 
+  static final _staticIntMethod = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallStaticIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: static public int staticIntMethod()
   static int staticIntMethod() {
-    return _id_staticIntMethod(_class, const jni.jintType(), []);
+    return _staticIntMethod(
+            _class.reference.pointer, _id_staticIntMethod as jni.JMethodIDPtr)
+        .integer;
   }
 
   static final _id_staticObjectArrayMethod = _class.staticMethodId(
@@ -3333,11 +4732,24 @@
     r"()[Ljava/lang/Object;",
   );
 
+  static final _staticObjectArrayMethod = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// 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 _id_staticObjectArrayMethod(
-        _class, const jni.JArrayType(jni.JObjectType()), []);
+    return _staticObjectArrayMethod(_class.reference.pointer,
+            _id_staticObjectArrayMethod as jni.JMethodIDPtr)
+        .object(const jni.JArrayType(jni.JObjectType()));
   }
 
   static final _id_staticIntArrayMethod = _class.staticMethodId(
@@ -3345,11 +4757,24 @@
     r"()[I",
   );
 
+  static final _staticIntArrayMethod = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallStaticObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// 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 _id_staticIntArrayMethod(
-        _class, const jni.JArrayType(jni.jintType()), []);
+    return _staticIntArrayMethod(_class.reference.pointer,
+            _id_staticIntArrayMethod as jni.JMethodIDPtr)
+        .object(const jni.JArrayType(jni.jintType()));
   }
 
   static final _id_objectMethod = _class.instanceMethodId(
@@ -3357,10 +4782,24 @@
     r"()Ljava/lang/Object;",
   );
 
+  static final _objectMethod = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public java.lang.Object objectMethod()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject objectMethod() {
-    return _id_objectMethod(this, const jni.JObjectType(), []);
+    return _objectMethod(
+            reference.pointer, _id_objectMethod as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_intMethod = _class.instanceMethodId(
@@ -3368,9 +4807,22 @@
     r"()I",
   );
 
+  static final _intMethod = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public int intMethod()
   int intMethod() {
-    return _id_intMethod(this, const jni.jintType(), []);
+    return _intMethod(reference.pointer, _id_intMethod as jni.JMethodIDPtr)
+        .integer;
   }
 
   static final _id_objectArrayMethod = _class.instanceMethodId(
@@ -3378,11 +4830,24 @@
     r"()[Ljava/lang/Object;",
   );
 
+  static final _objectArrayMethod = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// 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 _id_objectArrayMethod(
-        this, const jni.JArrayType(jni.JObjectType()), []);
+    return _objectArrayMethod(
+            reference.pointer, _id_objectArrayMethod as jni.JMethodIDPtr)
+        .object(const jni.JArrayType(jni.JObjectType()));
   }
 
   static final _id_intArrayMethod = _class.instanceMethodId(
@@ -3390,10 +4855,24 @@
     r"()[I",
   );
 
+  static final _intArrayMethod = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public int[] intArrayMethod()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JArray<jni.jint> intArrayMethod() {
-    return _id_intArrayMethod(this, const jni.JArrayType(jni.jintType()), []);
+    return _intArrayMethod(
+            reference.pointer, _id_intArrayMethod as jni.JMethodIDPtr)
+        .object(const jni.JArrayType(jni.jintType()));
   }
 
   static final _id_throwNullPointerException = _class.instanceMethodId(
@@ -3401,9 +4880,23 @@
     r"()I",
   );
 
+  static final _throwNullPointerException = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public int throwNullPointerException()
   int throwNullPointerException() {
-    return _id_throwNullPointerException(this, const jni.jintType(), []);
+    return _throwNullPointerException(reference.pointer,
+            _id_throwNullPointerException as jni.JMethodIDPtr)
+        .integer;
   }
 
   static final _id_throwFileNotFoundException = _class.instanceMethodId(
@@ -3411,10 +4904,24 @@
     r"()Ljava/io/InputStream;",
   );
 
+  static final _throwFileNotFoundException = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public java.io.InputStream throwFileNotFoundException()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject throwFileNotFoundException() {
-    return _id_throwFileNotFoundException(this, const jni.JObjectType(), []);
+    return _throwFileNotFoundException(reference.pointer,
+            _id_throwFileNotFoundException as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_throwClassCastException = _class.instanceMethodId(
@@ -3422,10 +4929,24 @@
     r"()Ljava/io/FileInputStream;",
   );
 
+  static final _throwClassCastException = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallObjectMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public java.io.FileInputStream throwClassCastException()
   /// The returned object must be released after use, by calling the [release] method.
   jni.JObject throwClassCastException() {
-    return _id_throwClassCastException(this, const jni.JObjectType(), []);
+    return _throwClassCastException(
+            reference.pointer, _id_throwClassCastException as jni.JMethodIDPtr)
+        .object(const jni.JObjectType());
   }
 
   static final _id_throwArrayIndexException = _class.instanceMethodId(
@@ -3433,9 +4954,23 @@
     r"()I",
   );
 
+  static final _throwArrayIndexException = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public int throwArrayIndexException()
   int throwArrayIndexException() {
-    return _id_throwArrayIndexException(this, const jni.jintType(), []);
+    return _throwArrayIndexException(
+            reference.pointer, _id_throwArrayIndexException as jni.JMethodIDPtr)
+        .integer;
   }
 
   static final _id_throwArithmeticException = _class.instanceMethodId(
@@ -3443,9 +4978,23 @@
     r"()I",
   );
 
+  static final _throwArithmeticException = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallIntMethod")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public int throwArithmeticException()
   int throwArithmeticException() {
-    return _id_throwArithmeticException(this, const jni.jintType(), []);
+    return _throwArithmeticException(
+            reference.pointer, _id_throwArithmeticException as jni.JMethodIDPtr)
+        .integer;
   }
 
   static final _id_throwLoremIpsum = _class.staticMethodId(
@@ -3453,9 +5002,23 @@
     r"()V",
   );
 
+  static final _throwLoremIpsum = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JThrowablePtr Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_CallStaticVoidMethod")
+      .asFunction<
+          jni.JThrowablePtr Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: static public void throwLoremIpsum()
   static void throwLoremIpsum() {
-    _id_throwLoremIpsum(_class, const jni.jvoidType(), []);
+    _throwLoremIpsum(
+            _class.reference.pointer, _id_throwLoremIpsum as jni.JMethodIDPtr)
+        .check();
   }
 }
 
@@ -3633,10 +5196,24 @@
     r"()V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory Fields() {
-    return Fields.fromReference(_id_new0(_class, referenceType, []));
+    return Fields.fromReference(
+        _new0(_class.reference.pointer, _id_new0 as jni.JMethodIDPtr)
+            .reference);
   }
 }
 
@@ -3710,10 +5287,24 @@
     r"()V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory Fields_Nested() {
-    return Fields_Nested.fromReference(_id_new0(_class, referenceType, []));
+    return Fields_Nested.fromReference(
+        _new0(_class.reference.pointer, _id_new0 as jni.JMethodIDPtr)
+            .reference);
   }
 }
 
@@ -3778,6 +5369,18 @@
     r"()V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory GenericTypeParams({
@@ -3785,7 +5388,10 @@
     required jni.JObjType<$K> K,
   }) {
     return GenericTypeParams.fromReference(
-        S, K, _id_new0(_class, referenceType, []));
+        S,
+        K,
+        _new0(_class.reference.pointer, _id_new0 as jni.JMethodIDPtr)
+            .reference);
   }
 }
 
@@ -3843,10 +5449,24 @@
     r"()V",
   );
 
+  static final _new0 = ProtectedJniExtensions.lookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                ffi.Pointer<ffi.Void>,
+                jni.JMethodIDPtr,
+              )>>("globalEnv_NewObject")
+      .asFunction<
+          jni.JniResult Function(
+            ffi.Pointer<ffi.Void>,
+            jni.JMethodIDPtr,
+          )>();
+
   /// from: public void <init>()
   /// The returned object must be released after use, by calling the [release] method.
   factory StringMap() {
-    return StringMap.fromReference(_id_new0(_class, referenceType, []));
+    return StringMap.fromReference(
+        _new0(_class.reference.pointer, _id_new0 as jni.JMethodIDPtr)
+            .reference);
   }
 }
 
