1 /*
   2  * Copyright (c) 1996, 2026, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 /*
  27  * We used part of Netscape's Java Runtime Interface (JRI) as the starting
  28  * point of our design and implementation.
  29  */
  30 
  31 /******************************************************************************
  32  * Java Runtime Interface
  33  * Copyright (c) 1996 Netscape Communications Corporation. All rights reserved.
  34  *****************************************************************************/
  35 
  36 #ifndef _JAVASOFT_JNI_H_
  37 #define _JAVASOFT_JNI_H_
  38 
  39 #include <stdio.h>
  40 #include <stdarg.h>
  41 
  42 /* jni_md.h contains the machine-dependent typedefs for jbyte, jint
  43    and jlong */
  44 
  45 #include "jni_md.h"
  46 
  47 #ifdef __cplusplus
  48 extern "C" {
  49 #endif
  50 
  51 #define JNICALL
  52 
  53 /*
  54  * JNI Types
  55  */
  56 
  57 #ifndef JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H
  58 
  59 typedef unsigned char   jboolean;
  60 typedef unsigned short  jchar;
  61 typedef short           jshort;
  62 typedef float           jfloat;
  63 typedef double          jdouble;
  64 
  65 typedef jint            jsize;
  66 
  67 #ifdef __cplusplus
  68 
  69 class _jobject {};
  70 class _jclass : public _jobject {};
  71 class _jthrowable : public _jobject {};
  72 class _jstring : public _jobject {};
  73 class _jarray : public _jobject {};
  74 class _jbooleanArray : public _jarray {};
  75 class _jbyteArray : public _jarray {};
  76 class _jcharArray : public _jarray {};
  77 class _jshortArray : public _jarray {};
  78 class _jintArray : public _jarray {};
  79 class _jlongArray : public _jarray {};
  80 class _jfloatArray : public _jarray {};
  81 class _jdoubleArray : public _jarray {};
  82 class _jobjectArray : public _jarray {};
  83 
  84 typedef _jobject *jobject;
  85 typedef _jclass *jclass;
  86 typedef _jthrowable *jthrowable;
  87 typedef _jstring *jstring;
  88 typedef _jarray *jarray;
  89 typedef _jbooleanArray *jbooleanArray;
  90 typedef _jbyteArray *jbyteArray;
  91 typedef _jcharArray *jcharArray;
  92 typedef _jshortArray *jshortArray;
  93 typedef _jintArray *jintArray;
  94 typedef _jlongArray *jlongArray;
  95 typedef _jfloatArray *jfloatArray;
  96 typedef _jdoubleArray *jdoubleArray;
  97 typedef _jobjectArray *jobjectArray;
  98 
  99 #else
 100 
 101 struct _jobject;
 102 
 103 typedef struct _jobject *jobject;
 104 typedef jobject jclass;
 105 typedef jobject jthrowable;
 106 typedef jobject jstring;
 107 typedef jobject jarray;
 108 typedef jarray jbooleanArray;
 109 typedef jarray jbyteArray;
 110 typedef jarray jcharArray;
 111 typedef jarray jshortArray;
 112 typedef jarray jintArray;
 113 typedef jarray jlongArray;
 114 typedef jarray jfloatArray;
 115 typedef jarray jdoubleArray;
 116 typedef jarray jobjectArray;
 117 
 118 #endif
 119 
 120 typedef jobject jweak;
 121 
 122 typedef union jvalue {
 123     jboolean z;
 124     jbyte    b;
 125     jchar    c;
 126     jshort   s;
 127     jint     i;
 128     jlong    j;
 129     jfloat   f;
 130     jdouble  d;
 131     jobject  l;
 132 } jvalue;
 133 
 134 struct _jfieldID;
 135 typedef struct _jfieldID *jfieldID;
 136 
 137 struct _jmethodID;
 138 typedef struct _jmethodID *jmethodID;
 139 
 140 /* Return values from jobjectRefType */
 141 typedef enum _jobjectType {
 142      JNIInvalidRefType    = 0,
 143      JNILocalRefType      = 1,
 144      JNIGlobalRefType     = 2,
 145      JNIWeakGlobalRefType = 3
 146 } jobjectRefType;
 147 
 148 
 149 #endif /* JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H */
 150 
 151 /*
 152  * jboolean constants
 153  */
 154 
 155 #define JNI_FALSE 0
 156 #define JNI_TRUE 1
 157 
 158 /*
 159  * possible return values for JNI functions.
 160  */
 161 
 162 #define JNI_OK           0                 /* success */
 163 #define JNI_ERR          (-1)              /* unknown error */
 164 #define JNI_EDETACHED    (-2)              /* thread detached from the VM */
 165 #define JNI_EVERSION     (-3)              /* JNI version error */
 166 #define JNI_ENOMEM       (-4)              /* not enough memory */
 167 #define JNI_EEXIST       (-5)              /* VM already created */
 168 #define JNI_EINVAL       (-6)              /* invalid arguments */
 169 
 170 /*
 171  * used in ReleaseScalarArrayElements
 172  */
 173 
 174 #define JNI_COMMIT 1
 175 #define JNI_ABORT 2
 176 
 177 /*
 178  * used in RegisterNatives to describe native method name, signature,
 179  * and function pointer.
 180  */
 181 
 182 typedef struct {
 183     char *name;
 184     char *signature;
 185     void *fnPtr;
 186 } JNINativeMethod;
 187 
 188 /*
 189  * JNI Native Method Interface.
 190  */
 191 
 192 struct JNINativeInterface_;
 193 
 194 struct JNIEnv_;
 195 
 196 #ifdef __cplusplus
 197 typedef JNIEnv_ JNIEnv;
 198 #else
 199 typedef const struct JNINativeInterface_ *JNIEnv;
 200 #endif
 201 
 202 /*
 203  * JNI Invocation Interface.
 204  */
 205 
 206 struct JNIInvokeInterface_;
 207 
 208 struct JavaVM_;
 209 
 210 #ifdef __cplusplus
 211 typedef JavaVM_ JavaVM;
 212 #else
 213 typedef const struct JNIInvokeInterface_ *JavaVM;
 214 #endif
 215 
 216 struct JNINativeInterface_ {
 217     void *reserved0;
 218     void *reserved1;
 219     void *reserved2;
 220 
 221     void *reserved3;
 222     jint (JNICALL *GetVersion)(JNIEnv *env);
 223 
 224     jclass (JNICALL *DefineClass)
 225       (JNIEnv *env, const char *name, jobject loader, const jbyte *buf,
 226        jsize len);
 227     jclass (JNICALL *FindClass)
 228       (JNIEnv *env, const char *name);
 229 
 230     jmethodID (JNICALL *FromReflectedMethod)
 231       (JNIEnv *env, jobject method);
 232     jfieldID (JNICALL *FromReflectedField)
 233       (JNIEnv *env, jobject field);
 234 
 235     jobject (JNICALL *ToReflectedMethod)
 236       (JNIEnv *env, jclass cls, jmethodID methodID, jboolean isStatic);
 237 
 238     jclass (JNICALL *GetSuperclass)
 239       (JNIEnv *env, jclass sub);
 240     jboolean (JNICALL *IsAssignableFrom)
 241       (JNIEnv *env, jclass sub, jclass sup);
 242 
 243     jobject (JNICALL *ToReflectedField)
 244       (JNIEnv *env, jclass cls, jfieldID fieldID, jboolean isStatic);
 245 
 246     jint (JNICALL *Throw)
 247       (JNIEnv *env, jthrowable obj);
 248     jint (JNICALL *ThrowNew)
 249       (JNIEnv *env, jclass clazz, const char *msg);
 250     jthrowable (JNICALL *ExceptionOccurred)
 251       (JNIEnv *env);
 252     void (JNICALL *ExceptionDescribe)
 253       (JNIEnv *env);
 254     void (JNICALL *ExceptionClear)
 255       (JNIEnv *env);
 256     void (JNICALL *FatalError)
 257       (JNIEnv *env, const char *msg);
 258 
 259     jint (JNICALL *PushLocalFrame)
 260       (JNIEnv *env, jint capacity);
 261     jobject (JNICALL *PopLocalFrame)
 262       (JNIEnv *env, jobject result);
 263 
 264     jobject (JNICALL *NewGlobalRef)
 265       (JNIEnv *env, jobject lobj);
 266     void (JNICALL *DeleteGlobalRef)
 267       (JNIEnv *env, jobject gref);
 268     void (JNICALL *DeleteLocalRef)
 269       (JNIEnv *env, jobject obj);
 270     jboolean (JNICALL *IsSameObject)
 271       (JNIEnv *env, jobject obj1, jobject obj2);
 272     jobject (JNICALL *NewLocalRef)
 273       (JNIEnv *env, jobject ref);
 274     jint (JNICALL *EnsureLocalCapacity)
 275       (JNIEnv *env, jint capacity);
 276 
 277     jobject (JNICALL *AllocObject)
 278       (JNIEnv *env, jclass clazz);
 279     jobject (JNICALL *NewObject)
 280       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
 281     jobject (JNICALL *NewObjectV)
 282       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
 283     jobject (JNICALL *NewObjectA)
 284       (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
 285 
 286     jclass (JNICALL *GetObjectClass)
 287       (JNIEnv *env, jobject obj);
 288     jboolean (JNICALL *IsInstanceOf)
 289       (JNIEnv *env, jobject obj, jclass clazz);
 290 
 291     jmethodID (JNICALL *GetMethodID)
 292       (JNIEnv *env, jclass clazz, const char *name, const char *sig);
 293 
 294     jobject (JNICALL *CallObjectMethod)
 295       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
 296     jobject (JNICALL *CallObjectMethodV)
 297       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
 298     jobject (JNICALL *CallObjectMethodA)
 299       (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args);
 300 
 301     jboolean (JNICALL *CallBooleanMethod)
 302       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
 303     jboolean (JNICALL *CallBooleanMethodV)
 304       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
 305     jboolean (JNICALL *CallBooleanMethodA)
 306       (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args);
 307 
 308     jbyte (JNICALL *CallByteMethod)
 309       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
 310     jbyte (JNICALL *CallByteMethodV)
 311       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
 312     jbyte (JNICALL *CallByteMethodA)
 313       (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
 314 
 315     jchar (JNICALL *CallCharMethod)
 316       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
 317     jchar (JNICALL *CallCharMethodV)
 318       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
 319     jchar (JNICALL *CallCharMethodA)
 320       (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
 321 
 322     jshort (JNICALL *CallShortMethod)
 323       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
 324     jshort (JNICALL *CallShortMethodV)
 325       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
 326     jshort (JNICALL *CallShortMethodA)
 327       (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
 328 
 329     jint (JNICALL *CallIntMethod)
 330       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
 331     jint (JNICALL *CallIntMethodV)
 332       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
 333     jint (JNICALL *CallIntMethodA)
 334       (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
 335 
 336     jlong (JNICALL *CallLongMethod)
 337       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
 338     jlong (JNICALL *CallLongMethodV)
 339       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
 340     jlong (JNICALL *CallLongMethodA)
 341       (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
 342 
 343     jfloat (JNICALL *CallFloatMethod)
 344       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
 345     jfloat (JNICALL *CallFloatMethodV)
 346       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
 347     jfloat (JNICALL *CallFloatMethodA)
 348       (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
 349 
 350     jdouble (JNICALL *CallDoubleMethod)
 351       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
 352     jdouble (JNICALL *CallDoubleMethodV)
 353       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
 354     jdouble (JNICALL *CallDoubleMethodA)
 355       (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
 356 
 357     void (JNICALL *CallVoidMethod)
 358       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
 359     void (JNICALL *CallVoidMethodV)
 360       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
 361     void (JNICALL *CallVoidMethodA)
 362       (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args);
 363 
 364     jobject (JNICALL *CallNonvirtualObjectMethod)
 365       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
 366     jobject (JNICALL *CallNonvirtualObjectMethodV)
 367       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 368        va_list args);
 369     jobject (JNICALL *CallNonvirtualObjectMethodA)
 370       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 371        const jvalue * args);
 372 
 373     jboolean (JNICALL *CallNonvirtualBooleanMethod)
 374       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
 375     jboolean (JNICALL *CallNonvirtualBooleanMethodV)
 376       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 377        va_list args);
 378     jboolean (JNICALL *CallNonvirtualBooleanMethodA)
 379       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 380        const jvalue * args);
 381 
 382     jbyte (JNICALL *CallNonvirtualByteMethod)
 383       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
 384     jbyte (JNICALL *CallNonvirtualByteMethodV)
 385       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 386        va_list args);
 387     jbyte (JNICALL *CallNonvirtualByteMethodA)
 388       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 389        const jvalue *args);
 390 
 391     jchar (JNICALL *CallNonvirtualCharMethod)
 392       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
 393     jchar (JNICALL *CallNonvirtualCharMethodV)
 394       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 395        va_list args);
 396     jchar (JNICALL *CallNonvirtualCharMethodA)
 397       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 398        const jvalue *args);
 399 
 400     jshort (JNICALL *CallNonvirtualShortMethod)
 401       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
 402     jshort (JNICALL *CallNonvirtualShortMethodV)
 403       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 404        va_list args);
 405     jshort (JNICALL *CallNonvirtualShortMethodA)
 406       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 407        const jvalue *args);
 408 
 409     jint (JNICALL *CallNonvirtualIntMethod)
 410       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
 411     jint (JNICALL *CallNonvirtualIntMethodV)
 412       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 413        va_list args);
 414     jint (JNICALL *CallNonvirtualIntMethodA)
 415       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 416        const jvalue *args);
 417 
 418     jlong (JNICALL *CallNonvirtualLongMethod)
 419       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
 420     jlong (JNICALL *CallNonvirtualLongMethodV)
 421       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 422        va_list args);
 423     jlong (JNICALL *CallNonvirtualLongMethodA)
 424       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 425        const jvalue *args);
 426 
 427     jfloat (JNICALL *CallNonvirtualFloatMethod)
 428       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
 429     jfloat (JNICALL *CallNonvirtualFloatMethodV)
 430       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 431        va_list args);
 432     jfloat (JNICALL *CallNonvirtualFloatMethodA)
 433       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 434        const jvalue *args);
 435 
 436     jdouble (JNICALL *CallNonvirtualDoubleMethod)
 437       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
 438     jdouble (JNICALL *CallNonvirtualDoubleMethodV)
 439       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 440        va_list args);
 441     jdouble (JNICALL *CallNonvirtualDoubleMethodA)
 442       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 443        const jvalue *args);
 444 
 445     void (JNICALL *CallNonvirtualVoidMethod)
 446       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
 447     void (JNICALL *CallNonvirtualVoidMethodV)
 448       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 449        va_list args);
 450     void (JNICALL *CallNonvirtualVoidMethodA)
 451       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 452        const jvalue * args);
 453 
 454     jfieldID (JNICALL *GetFieldID)
 455       (JNIEnv *env, jclass clazz, const char *name, const char *sig);
 456 
 457     jobject (JNICALL *GetObjectField)
 458       (JNIEnv *env, jobject obj, jfieldID fieldID);
 459     jboolean (JNICALL *GetBooleanField)
 460       (JNIEnv *env, jobject obj, jfieldID fieldID);
 461     jbyte (JNICALL *GetByteField)
 462       (JNIEnv *env, jobject obj, jfieldID fieldID);
 463     jchar (JNICALL *GetCharField)
 464       (JNIEnv *env, jobject obj, jfieldID fieldID);
 465     jshort (JNICALL *GetShortField)
 466       (JNIEnv *env, jobject obj, jfieldID fieldID);
 467     jint (JNICALL *GetIntField)
 468       (JNIEnv *env, jobject obj, jfieldID fieldID);
 469     jlong (JNICALL *GetLongField)
 470       (JNIEnv *env, jobject obj, jfieldID fieldID);
 471     jfloat (JNICALL *GetFloatField)
 472       (JNIEnv *env, jobject obj, jfieldID fieldID);
 473     jdouble (JNICALL *GetDoubleField)
 474       (JNIEnv *env, jobject obj, jfieldID fieldID);
 475 
 476     void (JNICALL *SetObjectField)
 477       (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val);
 478     void (JNICALL *SetBooleanField)
 479       (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val);
 480     void (JNICALL *SetByteField)
 481       (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val);
 482     void (JNICALL *SetCharField)
 483       (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val);
 484     void (JNICALL *SetShortField)
 485       (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val);
 486     void (JNICALL *SetIntField)
 487       (JNIEnv *env, jobject obj, jfieldID fieldID, jint val);
 488     void (JNICALL *SetLongField)
 489       (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val);
 490     void (JNICALL *SetFloatField)
 491       (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val);
 492     void (JNICALL *SetDoubleField)
 493       (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val);
 494 
 495     jmethodID (JNICALL *GetStaticMethodID)
 496       (JNIEnv *env, jclass clazz, const char *name, const char *sig);
 497 
 498     jobject (JNICALL *CallStaticObjectMethod)
 499       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
 500     jobject (JNICALL *CallStaticObjectMethodV)
 501       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
 502     jobject (JNICALL *CallStaticObjectMethodA)
 503       (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
 504 
 505     jboolean (JNICALL *CallStaticBooleanMethod)
 506       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
 507     jboolean (JNICALL *CallStaticBooleanMethodV)
 508       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
 509     jboolean (JNICALL *CallStaticBooleanMethodA)
 510       (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
 511 
 512     jbyte (JNICALL *CallStaticByteMethod)
 513       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
 514     jbyte (JNICALL *CallStaticByteMethodV)
 515       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
 516     jbyte (JNICALL *CallStaticByteMethodA)
 517       (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
 518 
 519     jchar (JNICALL *CallStaticCharMethod)
 520       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
 521     jchar (JNICALL *CallStaticCharMethodV)
 522       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
 523     jchar (JNICALL *CallStaticCharMethodA)
 524       (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
 525 
 526     jshort (JNICALL *CallStaticShortMethod)
 527       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
 528     jshort (JNICALL *CallStaticShortMethodV)
 529       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
 530     jshort (JNICALL *CallStaticShortMethodA)
 531       (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
 532 
 533     jint (JNICALL *CallStaticIntMethod)
 534       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
 535     jint (JNICALL *CallStaticIntMethodV)
 536       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
 537     jint (JNICALL *CallStaticIntMethodA)
 538       (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
 539 
 540     jlong (JNICALL *CallStaticLongMethod)
 541       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
 542     jlong (JNICALL *CallStaticLongMethodV)
 543       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
 544     jlong (JNICALL *CallStaticLongMethodA)
 545       (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
 546 
 547     jfloat (JNICALL *CallStaticFloatMethod)
 548       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
 549     jfloat (JNICALL *CallStaticFloatMethodV)
 550       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
 551     jfloat (JNICALL *CallStaticFloatMethodA)
 552       (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
 553 
 554     jdouble (JNICALL *CallStaticDoubleMethod)
 555       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
 556     jdouble (JNICALL *CallStaticDoubleMethodV)
 557       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
 558     jdouble (JNICALL *CallStaticDoubleMethodA)
 559       (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
 560 
 561     void (JNICALL *CallStaticVoidMethod)
 562       (JNIEnv *env, jclass cls, jmethodID methodID, ...);
 563     void (JNICALL *CallStaticVoidMethodV)
 564       (JNIEnv *env, jclass cls, jmethodID methodID, va_list args);
 565     void (JNICALL *CallStaticVoidMethodA)
 566       (JNIEnv *env, jclass cls, jmethodID methodID, const jvalue * args);
 567 
 568     jfieldID (JNICALL *GetStaticFieldID)
 569       (JNIEnv *env, jclass clazz, const char *name, const char *sig);
 570     jobject (JNICALL *GetStaticObjectField)
 571       (JNIEnv *env, jclass clazz, jfieldID fieldID);
 572     jboolean (JNICALL *GetStaticBooleanField)
 573       (JNIEnv *env, jclass clazz, jfieldID fieldID);
 574     jbyte (JNICALL *GetStaticByteField)
 575       (JNIEnv *env, jclass clazz, jfieldID fieldID);
 576     jchar (JNICALL *GetStaticCharField)
 577       (JNIEnv *env, jclass clazz, jfieldID fieldID);
 578     jshort (JNICALL *GetStaticShortField)
 579       (JNIEnv *env, jclass clazz, jfieldID fieldID);
 580     jint (JNICALL *GetStaticIntField)
 581       (JNIEnv *env, jclass clazz, jfieldID fieldID);
 582     jlong (JNICALL *GetStaticLongField)
 583       (JNIEnv *env, jclass clazz, jfieldID fieldID);
 584     jfloat (JNICALL *GetStaticFloatField)
 585       (JNIEnv *env, jclass clazz, jfieldID fieldID);
 586     jdouble (JNICALL *GetStaticDoubleField)
 587       (JNIEnv *env, jclass clazz, jfieldID fieldID);
 588 
 589     void (JNICALL *SetStaticObjectField)
 590       (JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value);
 591     void (JNICALL *SetStaticBooleanField)
 592       (JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value);
 593     void (JNICALL *SetStaticByteField)
 594       (JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value);
 595     void (JNICALL *SetStaticCharField)
 596       (JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value);
 597     void (JNICALL *SetStaticShortField)
 598       (JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value);
 599     void (JNICALL *SetStaticIntField)
 600       (JNIEnv *env, jclass clazz, jfieldID fieldID, jint value);
 601     void (JNICALL *SetStaticLongField)
 602       (JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value);
 603     void (JNICALL *SetStaticFloatField)
 604       (JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value);
 605     void (JNICALL *SetStaticDoubleField)
 606       (JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value);
 607 
 608     jstring (JNICALL *NewString)
 609       (JNIEnv *env, const jchar *unicode, jsize len);
 610     jsize (JNICALL *GetStringLength)
 611       (JNIEnv *env, jstring str);
 612     const jchar *(JNICALL *GetStringChars)
 613       (JNIEnv *env, jstring str, jboolean *isCopy);
 614     void (JNICALL *ReleaseStringChars)
 615       (JNIEnv *env, jstring str, const jchar *chars);
 616 
 617     jstring (JNICALL *NewStringUTF)
 618       (JNIEnv *env, const char *utf);
 619     jsize (JNICALL *GetStringUTFLength)
 620       (JNIEnv *env, jstring str);
 621     const char* (JNICALL *GetStringUTFChars)
 622       (JNIEnv *env, jstring str, jboolean *isCopy);
 623     void (JNICALL *ReleaseStringUTFChars)
 624       (JNIEnv *env, jstring str, const char* chars);
 625 
 626 
 627     jsize (JNICALL *GetArrayLength)
 628       (JNIEnv *env, jarray array);
 629 
 630     jobjectArray (JNICALL *NewObjectArray)
 631       (JNIEnv *env, jsize len, jclass clazz, jobject init);
 632     jobject (JNICALL *GetObjectArrayElement)
 633       (JNIEnv *env, jobjectArray array, jsize index);
 634     void (JNICALL *SetObjectArrayElement)
 635       (JNIEnv *env, jobjectArray array, jsize index, jobject val);
 636 
 637     jbooleanArray (JNICALL *NewBooleanArray)
 638       (JNIEnv *env, jsize len);
 639     jbyteArray (JNICALL *NewByteArray)
 640       (JNIEnv *env, jsize len);
 641     jcharArray (JNICALL *NewCharArray)
 642       (JNIEnv *env, jsize len);
 643     jshortArray (JNICALL *NewShortArray)
 644       (JNIEnv *env, jsize len);
 645     jintArray (JNICALL *NewIntArray)
 646       (JNIEnv *env, jsize len);
 647     jlongArray (JNICALL *NewLongArray)
 648       (JNIEnv *env, jsize len);
 649     jfloatArray (JNICALL *NewFloatArray)
 650       (JNIEnv *env, jsize len);
 651     jdoubleArray (JNICALL *NewDoubleArray)
 652       (JNIEnv *env, jsize len);
 653 
 654     jboolean * (JNICALL *GetBooleanArrayElements)
 655       (JNIEnv *env, jbooleanArray array, jboolean *isCopy);
 656     jbyte * (JNICALL *GetByteArrayElements)
 657       (JNIEnv *env, jbyteArray array, jboolean *isCopy);
 658     jchar * (JNICALL *GetCharArrayElements)
 659       (JNIEnv *env, jcharArray array, jboolean *isCopy);
 660     jshort * (JNICALL *GetShortArrayElements)
 661       (JNIEnv *env, jshortArray array, jboolean *isCopy);
 662     jint * (JNICALL *GetIntArrayElements)
 663       (JNIEnv *env, jintArray array, jboolean *isCopy);
 664     jlong * (JNICALL *GetLongArrayElements)
 665       (JNIEnv *env, jlongArray array, jboolean *isCopy);
 666     jfloat * (JNICALL *GetFloatArrayElements)
 667       (JNIEnv *env, jfloatArray array, jboolean *isCopy);
 668     jdouble * (JNICALL *GetDoubleArrayElements)
 669       (JNIEnv *env, jdoubleArray array, jboolean *isCopy);
 670 
 671     void (JNICALL *ReleaseBooleanArrayElements)
 672       (JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode);
 673     void (JNICALL *ReleaseByteArrayElements)
 674       (JNIEnv *env, jbyteArray array, jbyte *elems, jint mode);
 675     void (JNICALL *ReleaseCharArrayElements)
 676       (JNIEnv *env, jcharArray array, jchar *elems, jint mode);
 677     void (JNICALL *ReleaseShortArrayElements)
 678       (JNIEnv *env, jshortArray array, jshort *elems, jint mode);
 679     void (JNICALL *ReleaseIntArrayElements)
 680       (JNIEnv *env, jintArray array, jint *elems, jint mode);
 681     void (JNICALL *ReleaseLongArrayElements)
 682       (JNIEnv *env, jlongArray array, jlong *elems, jint mode);
 683     void (JNICALL *ReleaseFloatArrayElements)
 684       (JNIEnv *env, jfloatArray array, jfloat *elems, jint mode);
 685     void (JNICALL *ReleaseDoubleArrayElements)
 686       (JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode);
 687 
 688     void (JNICALL *GetBooleanArrayRegion)
 689       (JNIEnv *env, jbooleanArray array, jsize start, jsize l, jboolean *buf);
 690     void (JNICALL *GetByteArrayRegion)
 691       (JNIEnv *env, jbyteArray array, jsize start, jsize len, jbyte *buf);
 692     void (JNICALL *GetCharArrayRegion)
 693       (JNIEnv *env, jcharArray array, jsize start, jsize len, jchar *buf);
 694     void (JNICALL *GetShortArrayRegion)
 695       (JNIEnv *env, jshortArray array, jsize start, jsize len, jshort *buf);
 696     void (JNICALL *GetIntArrayRegion)
 697       (JNIEnv *env, jintArray array, jsize start, jsize len, jint *buf);
 698     void (JNICALL *GetLongArrayRegion)
 699       (JNIEnv *env, jlongArray array, jsize start, jsize len, jlong *buf);
 700     void (JNICALL *GetFloatArrayRegion)
 701       (JNIEnv *env, jfloatArray array, jsize start, jsize len, jfloat *buf);
 702     void (JNICALL *GetDoubleArrayRegion)
 703       (JNIEnv *env, jdoubleArray array, jsize start, jsize len, jdouble *buf);
 704 
 705     void (JNICALL *SetBooleanArrayRegion)
 706       (JNIEnv *env, jbooleanArray array, jsize start, jsize l, const jboolean *buf);
 707     void (JNICALL *SetByteArrayRegion)
 708       (JNIEnv *env, jbyteArray array, jsize start, jsize len, const jbyte *buf);
 709     void (JNICALL *SetCharArrayRegion)
 710       (JNIEnv *env, jcharArray array, jsize start, jsize len, const jchar *buf);
 711     void (JNICALL *SetShortArrayRegion)
 712       (JNIEnv *env, jshortArray array, jsize start, jsize len, const jshort *buf);
 713     void (JNICALL *SetIntArrayRegion)
 714       (JNIEnv *env, jintArray array, jsize start, jsize len, const jint *buf);
 715     void (JNICALL *SetLongArrayRegion)
 716       (JNIEnv *env, jlongArray array, jsize start, jsize len, const jlong *buf);
 717     void (JNICALL *SetFloatArrayRegion)
 718       (JNIEnv *env, jfloatArray array, jsize start, jsize len, const jfloat *buf);
 719     void (JNICALL *SetDoubleArrayRegion)
 720       (JNIEnv *env, jdoubleArray array, jsize start, jsize len, const jdouble *buf);
 721 
 722     jint (JNICALL *RegisterNatives)
 723       (JNIEnv *env, jclass clazz, const JNINativeMethod *methods,
 724        jint nMethods);
 725     jint (JNICALL *UnregisterNatives)
 726       (JNIEnv *env, jclass clazz);
 727 
 728     jint (JNICALL *MonitorEnter)
 729       (JNIEnv *env, jobject obj);
 730     jint (JNICALL *MonitorExit)
 731       (JNIEnv *env, jobject obj);
 732 
 733     jint (JNICALL *GetJavaVM)
 734       (JNIEnv *env, JavaVM **vm);
 735 
 736     void (JNICALL *GetStringRegion)
 737       (JNIEnv *env, jstring str, jsize start, jsize len, jchar *buf);
 738     void (JNICALL *GetStringUTFRegion)
 739       (JNIEnv *env, jstring str, jsize start, jsize len, char *buf);
 740 
 741     void * (JNICALL *GetPrimitiveArrayCritical)
 742       (JNIEnv *env, jarray array, jboolean *isCopy);
 743     void (JNICALL *ReleasePrimitiveArrayCritical)
 744       (JNIEnv *env, jarray array, void *carray, jint mode);
 745 
 746     const jchar * (JNICALL *GetStringCritical)
 747       (JNIEnv *env, jstring string, jboolean *isCopy);
 748     void (JNICALL *ReleaseStringCritical)
 749       (JNIEnv *env, jstring string, const jchar *cstring);
 750 
 751     jweak (JNICALL *NewWeakGlobalRef)
 752        (JNIEnv *env, jobject obj);
 753     void (JNICALL *DeleteWeakGlobalRef)
 754        (JNIEnv *env, jweak ref);
 755 
 756     jboolean (JNICALL *ExceptionCheck)
 757        (JNIEnv *env);
 758 
 759     jobject (JNICALL *NewDirectByteBuffer)
 760        (JNIEnv* env, void* address, jlong capacity);
 761     void* (JNICALL *GetDirectBufferAddress)
 762        (JNIEnv* env, jobject buf);
 763     jlong (JNICALL *GetDirectBufferCapacity)
 764        (JNIEnv* env, jobject buf);
 765 
 766     /* New JNI 1.6 Features */
 767 
 768     jobjectRefType (JNICALL *GetObjectRefType)
 769         (JNIEnv* env, jobject obj);
 770 
 771     /* Module Features */
 772 
 773     jobject (JNICALL *GetModule)
 774        (JNIEnv* env, jclass clazz);
 775 
 776     /* Virtual threads */
 777 
 778     jboolean (JNICALL *IsVirtualThread)
 779        (JNIEnv* env, jobject obj);
 780 
 781     /* Large UTF8 Support */
 782 
 783     jlong (JNICALL *GetStringUTFLengthAsLong)
 784       (JNIEnv *env, jstring str);
 785 
 786     /* Value classes */
 787 
 788     jboolean (JNICALL *IsValueObject)
 789       (JNIEnv* env, jobject obj);
 790 
 791 };
 792 
 793 /*
 794  * We use inlined functions for C++ so that programmers can write:
 795  *
 796  *    env->FindClass("java/lang/String")
 797  *
 798  * in C++ rather than:
 799  *
 800  *    (*env)->FindClass(env, "java/lang/String")
 801  *
 802  * in C.
 803  */
 804 
 805 struct JNIEnv_ {
 806     const struct JNINativeInterface_ *functions;
 807 #ifdef __cplusplus
 808 
 809     jint GetVersion() {
 810         return functions->GetVersion(this);
 811     }
 812     jclass DefineClass(const char *name, jobject loader, const jbyte *buf,
 813                        jsize len) {
 814         return functions->DefineClass(this, name, loader, buf, len);
 815     }
 816     jclass FindClass(const char *name) {
 817         return functions->FindClass(this, name);
 818     }
 819     jmethodID FromReflectedMethod(jobject method) {
 820         return functions->FromReflectedMethod(this,method);
 821     }
 822     jfieldID FromReflectedField(jobject field) {
 823         return functions->FromReflectedField(this,field);
 824     }
 825 
 826     jobject ToReflectedMethod(jclass cls, jmethodID methodID, jboolean isStatic) {
 827         return functions->ToReflectedMethod(this, cls, methodID, isStatic);
 828     }
 829 
 830     jclass GetSuperclass(jclass sub) {
 831         return functions->GetSuperclass(this, sub);
 832     }
 833     jboolean IsAssignableFrom(jclass sub, jclass sup) {
 834         return functions->IsAssignableFrom(this, sub, sup);
 835     }
 836 
 837     jobject ToReflectedField(jclass cls, jfieldID fieldID, jboolean isStatic) {
 838         return functions->ToReflectedField(this,cls,fieldID,isStatic);
 839     }
 840 
 841     jint Throw(jthrowable obj) {
 842         return functions->Throw(this, obj);
 843     }
 844     jint ThrowNew(jclass clazz, const char *msg) {
 845         return functions->ThrowNew(this, clazz, msg);
 846     }
 847     jthrowable ExceptionOccurred() {
 848         return functions->ExceptionOccurred(this);
 849     }
 850     void ExceptionDescribe() {
 851         functions->ExceptionDescribe(this);
 852     }
 853     void ExceptionClear() {
 854         functions->ExceptionClear(this);
 855     }
 856     void FatalError(const char *msg) {
 857         functions->FatalError(this, msg);
 858     }
 859 
 860     jint PushLocalFrame(jint capacity) {
 861         return functions->PushLocalFrame(this,capacity);
 862     }
 863     jobject PopLocalFrame(jobject result) {
 864         return functions->PopLocalFrame(this,result);
 865     }
 866 
 867     jobject NewGlobalRef(jobject lobj) {
 868         return functions->NewGlobalRef(this,lobj);
 869     }
 870     void DeleteGlobalRef(jobject gref) {
 871         functions->DeleteGlobalRef(this,gref);
 872     }
 873     void DeleteLocalRef(jobject obj) {
 874         functions->DeleteLocalRef(this, obj);
 875     }
 876 
 877     jboolean IsSameObject(jobject obj1, jobject obj2) {
 878         return functions->IsSameObject(this,obj1,obj2);
 879     }
 880 
 881     jobject NewLocalRef(jobject ref) {
 882         return functions->NewLocalRef(this,ref);
 883     }
 884     jint EnsureLocalCapacity(jint capacity) {
 885         return functions->EnsureLocalCapacity(this,capacity);
 886     }
 887 
 888     jobject AllocObject(jclass clazz) {
 889         return functions->AllocObject(this,clazz);
 890     }
 891     jobject NewObject(jclass clazz, jmethodID methodID, ...) {
 892         va_list args;
 893         jobject result;
 894         va_start(args, methodID);
 895         result = functions->NewObjectV(this,clazz,methodID,args);
 896         va_end(args);
 897         return result;
 898     }
 899     jobject NewObjectV(jclass clazz, jmethodID methodID,
 900                        va_list args) {
 901         return functions->NewObjectV(this,clazz,methodID,args);
 902     }
 903     jobject NewObjectA(jclass clazz, jmethodID methodID,
 904                        const jvalue *args) {
 905         return functions->NewObjectA(this,clazz,methodID,args);
 906     }
 907 
 908     jclass GetObjectClass(jobject obj) {
 909         return functions->GetObjectClass(this,obj);
 910     }
 911     jboolean IsInstanceOf(jobject obj, jclass clazz) {
 912         return functions->IsInstanceOf(this,obj,clazz);
 913     }
 914 
 915     jmethodID GetMethodID(jclass clazz, const char *name,
 916                           const char *sig) {
 917         return functions->GetMethodID(this,clazz,name,sig);
 918     }
 919 
 920     jobject CallObjectMethod(jobject obj, jmethodID methodID, ...) {
 921         va_list args;
 922         jobject result;
 923         va_start(args,methodID);
 924         result = functions->CallObjectMethodV(this,obj,methodID,args);
 925         va_end(args);
 926         return result;
 927     }
 928     jobject CallObjectMethodV(jobject obj, jmethodID methodID,
 929                         va_list args) {
 930         return functions->CallObjectMethodV(this,obj,methodID,args);
 931     }
 932     jobject CallObjectMethodA(jobject obj, jmethodID methodID,
 933                         const jvalue * args) {
 934         return functions->CallObjectMethodA(this,obj,methodID,args);
 935     }
 936 
 937     jboolean CallBooleanMethod(jobject obj,
 938                                jmethodID methodID, ...) {
 939         va_list args;
 940         jboolean result;
 941         va_start(args,methodID);
 942         result = functions->CallBooleanMethodV(this,obj,methodID,args);
 943         va_end(args);
 944         return result;
 945     }
 946     jboolean CallBooleanMethodV(jobject obj, jmethodID methodID,
 947                                 va_list args) {
 948         return functions->CallBooleanMethodV(this,obj,methodID,args);
 949     }
 950     jboolean CallBooleanMethodA(jobject obj, jmethodID methodID,
 951                                 const jvalue * args) {
 952         return functions->CallBooleanMethodA(this,obj,methodID, args);
 953     }
 954 
 955     jbyte CallByteMethod(jobject obj, jmethodID methodID, ...) {
 956         va_list args;
 957         jbyte result;
 958         va_start(args,methodID);
 959         result = functions->CallByteMethodV(this,obj,methodID,args);
 960         va_end(args);
 961         return result;
 962     }
 963     jbyte CallByteMethodV(jobject obj, jmethodID methodID,
 964                           va_list args) {
 965         return functions->CallByteMethodV(this,obj,methodID,args);
 966     }
 967     jbyte CallByteMethodA(jobject obj, jmethodID methodID,
 968                           const jvalue * args) {
 969         return functions->CallByteMethodA(this,obj,methodID,args);
 970     }
 971 
 972     jchar CallCharMethod(jobject obj, jmethodID methodID, ...) {
 973         va_list args;
 974         jchar result;
 975         va_start(args,methodID);
 976         result = functions->CallCharMethodV(this,obj,methodID,args);
 977         va_end(args);
 978         return result;
 979     }
 980     jchar CallCharMethodV(jobject obj, jmethodID methodID,
 981                           va_list args) {
 982         return functions->CallCharMethodV(this,obj,methodID,args);
 983     }
 984     jchar CallCharMethodA(jobject obj, jmethodID methodID,
 985                           const jvalue * args) {
 986         return functions->CallCharMethodA(this,obj,methodID,args);
 987     }
 988 
 989     jshort CallShortMethod(jobject obj, jmethodID methodID, ...) {
 990         va_list args;
 991         jshort result;
 992         va_start(args,methodID);
 993         result = functions->CallShortMethodV(this,obj,methodID,args);
 994         va_end(args);
 995         return result;
 996     }
 997     jshort CallShortMethodV(jobject obj, jmethodID methodID,
 998                             va_list args) {
 999         return functions->CallShortMethodV(this,obj,methodID,args);
1000     }
1001     jshort CallShortMethodA(jobject obj, jmethodID methodID,
1002                             const jvalue * args) {
1003         return functions->CallShortMethodA(this,obj,methodID,args);
1004     }
1005 
1006     jint CallIntMethod(jobject obj, jmethodID methodID, ...) {
1007         va_list args;
1008         jint result;
1009         va_start(args,methodID);
1010         result = functions->CallIntMethodV(this,obj,methodID,args);
1011         va_end(args);
1012         return result;
1013     }
1014     jint CallIntMethodV(jobject obj, jmethodID methodID,
1015                         va_list args) {
1016         return functions->CallIntMethodV(this,obj,methodID,args);
1017     }
1018     jint CallIntMethodA(jobject obj, jmethodID methodID,
1019                         const jvalue * args) {
1020         return functions->CallIntMethodA(this,obj,methodID,args);
1021     }
1022 
1023     jlong CallLongMethod(jobject obj, jmethodID methodID, ...) {
1024         va_list args;
1025         jlong result;
1026         va_start(args,methodID);
1027         result = functions->CallLongMethodV(this,obj,methodID,args);
1028         va_end(args);
1029         return result;
1030     }
1031     jlong CallLongMethodV(jobject obj, jmethodID methodID,
1032                           va_list args) {
1033         return functions->CallLongMethodV(this,obj,methodID,args);
1034     }
1035     jlong CallLongMethodA(jobject obj, jmethodID methodID,
1036                           const jvalue * args) {
1037         return functions->CallLongMethodA(this,obj,methodID,args);
1038     }
1039 
1040     jfloat CallFloatMethod(jobject obj, jmethodID methodID, ...) {
1041         va_list args;
1042         jfloat result;
1043         va_start(args,methodID);
1044         result = functions->CallFloatMethodV(this,obj,methodID,args);
1045         va_end(args);
1046         return result;
1047     }
1048     jfloat CallFloatMethodV(jobject obj, jmethodID methodID,
1049                             va_list args) {
1050         return functions->CallFloatMethodV(this,obj,methodID,args);
1051     }
1052     jfloat CallFloatMethodA(jobject obj, jmethodID methodID,
1053                             const jvalue * args) {
1054         return functions->CallFloatMethodA(this,obj,methodID,args);
1055     }
1056 
1057     jdouble CallDoubleMethod(jobject obj, jmethodID methodID, ...) {
1058         va_list args;
1059         jdouble result;
1060         va_start(args,methodID);
1061         result = functions->CallDoubleMethodV(this,obj,methodID,args);
1062         va_end(args);
1063         return result;
1064     }
1065     jdouble CallDoubleMethodV(jobject obj, jmethodID methodID,
1066                         va_list args) {
1067         return functions->CallDoubleMethodV(this,obj,methodID,args);
1068     }
1069     jdouble CallDoubleMethodA(jobject obj, jmethodID methodID,
1070                         const jvalue * args) {
1071         return functions->CallDoubleMethodA(this,obj,methodID,args);
1072     }
1073 
1074     void CallVoidMethod(jobject obj, jmethodID methodID, ...) {
1075         va_list args;
1076         va_start(args,methodID);
1077         functions->CallVoidMethodV(this,obj,methodID,args);
1078         va_end(args);
1079     }
1080     void CallVoidMethodV(jobject obj, jmethodID methodID,
1081                          va_list args) {
1082         functions->CallVoidMethodV(this,obj,methodID,args);
1083     }
1084     void CallVoidMethodA(jobject obj, jmethodID methodID,
1085                          const jvalue * args) {
1086         functions->CallVoidMethodA(this,obj,methodID,args);
1087     }
1088 
1089     jobject CallNonvirtualObjectMethod(jobject obj, jclass clazz,
1090                                        jmethodID methodID, ...) {
1091         va_list args;
1092         jobject result;
1093         va_start(args,methodID);
1094         result = functions->CallNonvirtualObjectMethodV(this,obj,clazz,
1095                                                         methodID,args);
1096         va_end(args);
1097         return result;
1098     }
1099     jobject CallNonvirtualObjectMethodV(jobject obj, jclass clazz,
1100                                         jmethodID methodID, va_list args) {
1101         return functions->CallNonvirtualObjectMethodV(this,obj,clazz,
1102                                                       methodID,args);
1103     }
1104     jobject CallNonvirtualObjectMethodA(jobject obj, jclass clazz,
1105                                         jmethodID methodID, const jvalue * args) {
1106         return functions->CallNonvirtualObjectMethodA(this,obj,clazz,
1107                                                       methodID,args);
1108     }
1109 
1110     jboolean CallNonvirtualBooleanMethod(jobject obj, jclass clazz,
1111                                          jmethodID methodID, ...) {
1112         va_list args;
1113         jboolean result;
1114         va_start(args,methodID);
1115         result = functions->CallNonvirtualBooleanMethodV(this,obj,clazz,
1116                                                          methodID,args);
1117         va_end(args);
1118         return result;
1119     }
1120     jboolean CallNonvirtualBooleanMethodV(jobject obj, jclass clazz,
1121                                           jmethodID methodID, va_list args) {
1122         return functions->CallNonvirtualBooleanMethodV(this,obj,clazz,
1123                                                        methodID,args);
1124     }
1125     jboolean CallNonvirtualBooleanMethodA(jobject obj, jclass clazz,
1126                                           jmethodID methodID, const jvalue * args) {
1127         return functions->CallNonvirtualBooleanMethodA(this,obj,clazz,
1128                                                        methodID, args);
1129     }
1130 
1131     jbyte CallNonvirtualByteMethod(jobject obj, jclass clazz,
1132                                    jmethodID methodID, ...) {
1133         va_list args;
1134         jbyte result;
1135         va_start(args,methodID);
1136         result = functions->CallNonvirtualByteMethodV(this,obj,clazz,
1137                                                       methodID,args);
1138         va_end(args);
1139         return result;
1140     }
1141     jbyte CallNonvirtualByteMethodV(jobject obj, jclass clazz,
1142                                     jmethodID methodID, va_list args) {
1143         return functions->CallNonvirtualByteMethodV(this,obj,clazz,
1144                                                     methodID,args);
1145     }
1146     jbyte CallNonvirtualByteMethodA(jobject obj, jclass clazz,
1147                                     jmethodID methodID, const jvalue * args) {
1148         return functions->CallNonvirtualByteMethodA(this,obj,clazz,
1149                                                     methodID,args);
1150     }
1151 
1152     jchar CallNonvirtualCharMethod(jobject obj, jclass clazz,
1153                                    jmethodID methodID, ...) {
1154         va_list args;
1155         jchar result;
1156         va_start(args,methodID);
1157         result = functions->CallNonvirtualCharMethodV(this,obj,clazz,
1158                                                       methodID,args);
1159         va_end(args);
1160         return result;
1161     }
1162     jchar CallNonvirtualCharMethodV(jobject obj, jclass clazz,
1163                                     jmethodID methodID, va_list args) {
1164         return functions->CallNonvirtualCharMethodV(this,obj,clazz,
1165                                                     methodID,args);
1166     }
1167     jchar CallNonvirtualCharMethodA(jobject obj, jclass clazz,
1168                                     jmethodID methodID, const jvalue * args) {
1169         return functions->CallNonvirtualCharMethodA(this,obj,clazz,
1170                                                     methodID,args);
1171     }
1172 
1173     jshort CallNonvirtualShortMethod(jobject obj, jclass clazz,
1174                                      jmethodID methodID, ...) {
1175         va_list args;
1176         jshort result;
1177         va_start(args,methodID);
1178         result = functions->CallNonvirtualShortMethodV(this,obj,clazz,
1179                                                        methodID,args);
1180         va_end(args);
1181         return result;
1182     }
1183     jshort CallNonvirtualShortMethodV(jobject obj, jclass clazz,
1184                                       jmethodID methodID, va_list args) {
1185         return functions->CallNonvirtualShortMethodV(this,obj,clazz,
1186                                                      methodID,args);
1187     }
1188     jshort CallNonvirtualShortMethodA(jobject obj, jclass clazz,
1189                                       jmethodID methodID, const jvalue * args) {
1190         return functions->CallNonvirtualShortMethodA(this,obj,clazz,
1191                                                      methodID,args);
1192     }
1193 
1194     jint CallNonvirtualIntMethod(jobject obj, jclass clazz,
1195                                  jmethodID methodID, ...) {
1196         va_list args;
1197         jint result;
1198         va_start(args,methodID);
1199         result = functions->CallNonvirtualIntMethodV(this,obj,clazz,
1200                                                      methodID,args);
1201         va_end(args);
1202         return result;
1203     }
1204     jint CallNonvirtualIntMethodV(jobject obj, jclass clazz,
1205                                   jmethodID methodID, va_list args) {
1206         return functions->CallNonvirtualIntMethodV(this,obj,clazz,
1207                                                    methodID,args);
1208     }
1209     jint CallNonvirtualIntMethodA(jobject obj, jclass clazz,
1210                                   jmethodID methodID, const jvalue * args) {
1211         return functions->CallNonvirtualIntMethodA(this,obj,clazz,
1212                                                    methodID,args);
1213     }
1214 
1215     jlong CallNonvirtualLongMethod(jobject obj, jclass clazz,
1216                                    jmethodID methodID, ...) {
1217         va_list args;
1218         jlong result;
1219         va_start(args,methodID);
1220         result = functions->CallNonvirtualLongMethodV(this,obj,clazz,
1221                                                       methodID,args);
1222         va_end(args);
1223         return result;
1224     }
1225     jlong CallNonvirtualLongMethodV(jobject obj, jclass clazz,
1226                                     jmethodID methodID, va_list args) {
1227         return functions->CallNonvirtualLongMethodV(this,obj,clazz,
1228                                                     methodID,args);
1229     }
1230     jlong CallNonvirtualLongMethodA(jobject obj, jclass clazz,
1231                                     jmethodID methodID, const jvalue * args) {
1232         return functions->CallNonvirtualLongMethodA(this,obj,clazz,
1233                                                     methodID,args);
1234     }
1235 
1236     jfloat CallNonvirtualFloatMethod(jobject obj, jclass clazz,
1237                                      jmethodID methodID, ...) {
1238         va_list args;
1239         jfloat result;
1240         va_start(args,methodID);
1241         result = functions->CallNonvirtualFloatMethodV(this,obj,clazz,
1242                                                        methodID,args);
1243         va_end(args);
1244         return result;
1245     }
1246     jfloat CallNonvirtualFloatMethodV(jobject obj, jclass clazz,
1247                                       jmethodID methodID,
1248                                       va_list args) {
1249         return functions->CallNonvirtualFloatMethodV(this,obj,clazz,
1250                                                      methodID,args);
1251     }
1252     jfloat CallNonvirtualFloatMethodA(jobject obj, jclass clazz,
1253                                       jmethodID methodID,
1254                                       const jvalue * args) {
1255         return functions->CallNonvirtualFloatMethodA(this,obj,clazz,
1256                                                      methodID,args);
1257     }
1258 
1259     jdouble CallNonvirtualDoubleMethod(jobject obj, jclass clazz,
1260                                        jmethodID methodID, ...) {
1261         va_list args;
1262         jdouble result;
1263         va_start(args,methodID);
1264         result = functions->CallNonvirtualDoubleMethodV(this,obj,clazz,
1265                                                         methodID,args);
1266         va_end(args);
1267         return result;
1268     }
1269     jdouble CallNonvirtualDoubleMethodV(jobject obj, jclass clazz,
1270                                         jmethodID methodID,
1271                                         va_list args) {
1272         return functions->CallNonvirtualDoubleMethodV(this,obj,clazz,
1273                                                       methodID,args);
1274     }
1275     jdouble CallNonvirtualDoubleMethodA(jobject obj, jclass clazz,
1276                                         jmethodID methodID,
1277                                         const jvalue * args) {
1278         return functions->CallNonvirtualDoubleMethodA(this,obj,clazz,
1279                                                       methodID,args);
1280     }
1281 
1282     void CallNonvirtualVoidMethod(jobject obj, jclass clazz,
1283                                   jmethodID methodID, ...) {
1284         va_list args;
1285         va_start(args,methodID);
1286         functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args);
1287         va_end(args);
1288     }
1289     void CallNonvirtualVoidMethodV(jobject obj, jclass clazz,
1290                                    jmethodID methodID,
1291                                    va_list args) {
1292         functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args);
1293     }
1294     void CallNonvirtualVoidMethodA(jobject obj, jclass clazz,
1295                                    jmethodID methodID,
1296                                    const jvalue * args) {
1297         functions->CallNonvirtualVoidMethodA(this,obj,clazz,methodID,args);
1298     }
1299 
1300     jfieldID GetFieldID(jclass clazz, const char *name,
1301                         const char *sig) {
1302         return functions->GetFieldID(this,clazz,name,sig);
1303     }
1304 
1305     jobject GetObjectField(jobject obj, jfieldID fieldID) {
1306         return functions->GetObjectField(this,obj,fieldID);
1307     }
1308     jboolean GetBooleanField(jobject obj, jfieldID fieldID) {
1309         return functions->GetBooleanField(this,obj,fieldID);
1310     }
1311     jbyte GetByteField(jobject obj, jfieldID fieldID) {
1312         return functions->GetByteField(this,obj,fieldID);
1313     }
1314     jchar GetCharField(jobject obj, jfieldID fieldID) {
1315         return functions->GetCharField(this,obj,fieldID);
1316     }
1317     jshort GetShortField(jobject obj, jfieldID fieldID) {
1318         return functions->GetShortField(this,obj,fieldID);
1319     }
1320     jint GetIntField(jobject obj, jfieldID fieldID) {
1321         return functions->GetIntField(this,obj,fieldID);
1322     }
1323     jlong GetLongField(jobject obj, jfieldID fieldID) {
1324         return functions->GetLongField(this,obj,fieldID);
1325     }
1326     jfloat GetFloatField(jobject obj, jfieldID fieldID) {
1327         return functions->GetFloatField(this,obj,fieldID);
1328     }
1329     jdouble GetDoubleField(jobject obj, jfieldID fieldID) {
1330         return functions->GetDoubleField(this,obj,fieldID);
1331     }
1332 
1333     void SetObjectField(jobject obj, jfieldID fieldID, jobject val) {
1334         functions->SetObjectField(this,obj,fieldID,val);
1335     }
1336     void SetBooleanField(jobject obj, jfieldID fieldID,
1337                          jboolean val) {
1338         functions->SetBooleanField(this,obj,fieldID,val);
1339     }
1340     void SetByteField(jobject obj, jfieldID fieldID,
1341                       jbyte val) {
1342         functions->SetByteField(this,obj,fieldID,val);
1343     }
1344     void SetCharField(jobject obj, jfieldID fieldID,
1345                       jchar val) {
1346         functions->SetCharField(this,obj,fieldID,val);
1347     }
1348     void SetShortField(jobject obj, jfieldID fieldID,
1349                        jshort val) {
1350         functions->SetShortField(this,obj,fieldID,val);
1351     }
1352     void SetIntField(jobject obj, jfieldID fieldID,
1353                      jint val) {
1354         functions->SetIntField(this,obj,fieldID,val);
1355     }
1356     void SetLongField(jobject obj, jfieldID fieldID,
1357                       jlong val) {
1358         functions->SetLongField(this,obj,fieldID,val);
1359     }
1360     void SetFloatField(jobject obj, jfieldID fieldID,
1361                        jfloat val) {
1362         functions->SetFloatField(this,obj,fieldID,val);
1363     }
1364     void SetDoubleField(jobject obj, jfieldID fieldID,
1365                         jdouble val) {
1366         functions->SetDoubleField(this,obj,fieldID,val);
1367     }
1368 
1369     jmethodID GetStaticMethodID(jclass clazz, const char *name,
1370                                 const char *sig) {
1371         return functions->GetStaticMethodID(this,clazz,name,sig);
1372     }
1373 
1374     jobject CallStaticObjectMethod(jclass clazz, jmethodID methodID,
1375                              ...) {
1376         va_list args;
1377         jobject result;
1378         va_start(args,methodID);
1379         result = functions->CallStaticObjectMethodV(this,clazz,methodID,args);
1380         va_end(args);
1381         return result;
1382     }
1383     jobject CallStaticObjectMethodV(jclass clazz, jmethodID methodID,
1384                               va_list args) {
1385         return functions->CallStaticObjectMethodV(this,clazz,methodID,args);
1386     }
1387     jobject CallStaticObjectMethodA(jclass clazz, jmethodID methodID,
1388                               const jvalue *args) {
1389         return functions->CallStaticObjectMethodA(this,clazz,methodID,args);
1390     }
1391 
1392     jboolean CallStaticBooleanMethod(jclass clazz,
1393                                      jmethodID methodID, ...) {
1394         va_list args;
1395         jboolean result;
1396         va_start(args,methodID);
1397         result = functions->CallStaticBooleanMethodV(this,clazz,methodID,args);
1398         va_end(args);
1399         return result;
1400     }
1401     jboolean CallStaticBooleanMethodV(jclass clazz,
1402                                       jmethodID methodID, va_list args) {
1403         return functions->CallStaticBooleanMethodV(this,clazz,methodID,args);
1404     }
1405     jboolean CallStaticBooleanMethodA(jclass clazz,
1406                                       jmethodID methodID, const jvalue *args) {
1407         return functions->CallStaticBooleanMethodA(this,clazz,methodID,args);
1408     }
1409 
1410     jbyte CallStaticByteMethod(jclass clazz,
1411                                jmethodID methodID, ...) {
1412         va_list args;
1413         jbyte result;
1414         va_start(args,methodID);
1415         result = functions->CallStaticByteMethodV(this,clazz,methodID,args);
1416         va_end(args);
1417         return result;
1418     }
1419     jbyte CallStaticByteMethodV(jclass clazz,
1420                                 jmethodID methodID, va_list args) {
1421         return functions->CallStaticByteMethodV(this,clazz,methodID,args);
1422     }
1423     jbyte CallStaticByteMethodA(jclass clazz,
1424                                 jmethodID methodID, const jvalue *args) {
1425         return functions->CallStaticByteMethodA(this,clazz,methodID,args);
1426     }
1427 
1428     jchar CallStaticCharMethod(jclass clazz,
1429                                jmethodID methodID, ...) {
1430         va_list args;
1431         jchar result;
1432         va_start(args,methodID);
1433         result = functions->CallStaticCharMethodV(this,clazz,methodID,args);
1434         va_end(args);
1435         return result;
1436     }
1437     jchar CallStaticCharMethodV(jclass clazz,
1438                                 jmethodID methodID, va_list args) {
1439         return functions->CallStaticCharMethodV(this,clazz,methodID,args);
1440     }
1441     jchar CallStaticCharMethodA(jclass clazz,
1442                                 jmethodID methodID, const jvalue *args) {
1443         return functions->CallStaticCharMethodA(this,clazz,methodID,args);
1444     }
1445 
1446     jshort CallStaticShortMethod(jclass clazz,
1447                                  jmethodID methodID, ...) {
1448         va_list args;
1449         jshort result;
1450         va_start(args,methodID);
1451         result = functions->CallStaticShortMethodV(this,clazz,methodID,args);
1452         va_end(args);
1453         return result;
1454     }
1455     jshort CallStaticShortMethodV(jclass clazz,
1456                                   jmethodID methodID, va_list args) {
1457         return functions->CallStaticShortMethodV(this,clazz,methodID,args);
1458     }
1459     jshort CallStaticShortMethodA(jclass clazz,
1460                                   jmethodID methodID, const jvalue *args) {
1461         return functions->CallStaticShortMethodA(this,clazz,methodID,args);
1462     }
1463 
1464     jint CallStaticIntMethod(jclass clazz,
1465                              jmethodID methodID, ...) {
1466         va_list args;
1467         jint result;
1468         va_start(args,methodID);
1469         result = functions->CallStaticIntMethodV(this,clazz,methodID,args);
1470         va_end(args);
1471         return result;
1472     }
1473     jint CallStaticIntMethodV(jclass clazz,
1474                               jmethodID methodID, va_list args) {
1475         return functions->CallStaticIntMethodV(this,clazz,methodID,args);
1476     }
1477     jint CallStaticIntMethodA(jclass clazz,
1478                               jmethodID methodID, const jvalue *args) {
1479         return functions->CallStaticIntMethodA(this,clazz,methodID,args);
1480     }
1481 
1482     jlong CallStaticLongMethod(jclass clazz,
1483                                jmethodID methodID, ...) {
1484         va_list args;
1485         jlong result;
1486         va_start(args,methodID);
1487         result = functions->CallStaticLongMethodV(this,clazz,methodID,args);
1488         va_end(args);
1489         return result;
1490     }
1491     jlong CallStaticLongMethodV(jclass clazz,
1492                                 jmethodID methodID, va_list args) {
1493         return functions->CallStaticLongMethodV(this,clazz,methodID,args);
1494     }
1495     jlong CallStaticLongMethodA(jclass clazz,
1496                                 jmethodID methodID, const jvalue *args) {
1497         return functions->CallStaticLongMethodA(this,clazz,methodID,args);
1498     }
1499 
1500     jfloat CallStaticFloatMethod(jclass clazz,
1501                                  jmethodID methodID, ...) {
1502         va_list args;
1503         jfloat result;
1504         va_start(args,methodID);
1505         result = functions->CallStaticFloatMethodV(this,clazz,methodID,args);
1506         va_end(args);
1507         return result;
1508     }
1509     jfloat CallStaticFloatMethodV(jclass clazz,
1510                                   jmethodID methodID, va_list args) {
1511         return functions->CallStaticFloatMethodV(this,clazz,methodID,args);
1512     }
1513     jfloat CallStaticFloatMethodA(jclass clazz,
1514                                   jmethodID methodID, const jvalue *args) {
1515         return functions->CallStaticFloatMethodA(this,clazz,methodID,args);
1516     }
1517 
1518     jdouble CallStaticDoubleMethod(jclass clazz,
1519                                    jmethodID methodID, ...) {
1520         va_list args;
1521         jdouble result;
1522         va_start(args,methodID);
1523         result = functions->CallStaticDoubleMethodV(this,clazz,methodID,args);
1524         va_end(args);
1525         return result;
1526     }
1527     jdouble CallStaticDoubleMethodV(jclass clazz,
1528                                     jmethodID methodID, va_list args) {
1529         return functions->CallStaticDoubleMethodV(this,clazz,methodID,args);
1530     }
1531     jdouble CallStaticDoubleMethodA(jclass clazz,
1532                                     jmethodID methodID, const jvalue *args) {
1533         return functions->CallStaticDoubleMethodA(this,clazz,methodID,args);
1534     }
1535 
1536     void CallStaticVoidMethod(jclass cls, jmethodID methodID, ...) {
1537         va_list args;
1538         va_start(args,methodID);
1539         functions->CallStaticVoidMethodV(this,cls,methodID,args);
1540         va_end(args);
1541     }
1542     void CallStaticVoidMethodV(jclass cls, jmethodID methodID,
1543                                va_list args) {
1544         functions->CallStaticVoidMethodV(this,cls,methodID,args);
1545     }
1546     void CallStaticVoidMethodA(jclass cls, jmethodID methodID,
1547                                const jvalue * args) {
1548         functions->CallStaticVoidMethodA(this,cls,methodID,args);
1549     }
1550 
1551     jfieldID GetStaticFieldID(jclass clazz, const char *name,
1552                               const char *sig) {
1553         return functions->GetStaticFieldID(this,clazz,name,sig);
1554     }
1555     jobject GetStaticObjectField(jclass clazz, jfieldID fieldID) {
1556         return functions->GetStaticObjectField(this,clazz,fieldID);
1557     }
1558     jboolean GetStaticBooleanField(jclass clazz, jfieldID fieldID) {
1559         return functions->GetStaticBooleanField(this,clazz,fieldID);
1560     }
1561     jbyte GetStaticByteField(jclass clazz, jfieldID fieldID) {
1562         return functions->GetStaticByteField(this,clazz,fieldID);
1563     }
1564     jchar GetStaticCharField(jclass clazz, jfieldID fieldID) {
1565         return functions->GetStaticCharField(this,clazz,fieldID);
1566     }
1567     jshort GetStaticShortField(jclass clazz, jfieldID fieldID) {
1568         return functions->GetStaticShortField(this,clazz,fieldID);
1569     }
1570     jint GetStaticIntField(jclass clazz, jfieldID fieldID) {
1571         return functions->GetStaticIntField(this,clazz,fieldID);
1572     }
1573     jlong GetStaticLongField(jclass clazz, jfieldID fieldID) {
1574         return functions->GetStaticLongField(this,clazz,fieldID);
1575     }
1576     jfloat GetStaticFloatField(jclass clazz, jfieldID fieldID) {
1577         return functions->GetStaticFloatField(this,clazz,fieldID);
1578     }
1579     jdouble GetStaticDoubleField(jclass clazz, jfieldID fieldID) {
1580         return functions->GetStaticDoubleField(this,clazz,fieldID);
1581     }
1582 
1583     void SetStaticObjectField(jclass clazz, jfieldID fieldID,
1584                         jobject value) {
1585       functions->SetStaticObjectField(this,clazz,fieldID,value);
1586     }
1587     void SetStaticBooleanField(jclass clazz, jfieldID fieldID,
1588                         jboolean value) {
1589       functions->SetStaticBooleanField(this,clazz,fieldID,value);
1590     }
1591     void SetStaticByteField(jclass clazz, jfieldID fieldID,
1592                         jbyte value) {
1593       functions->SetStaticByteField(this,clazz,fieldID,value);
1594     }
1595     void SetStaticCharField(jclass clazz, jfieldID fieldID,
1596                         jchar value) {
1597       functions->SetStaticCharField(this,clazz,fieldID,value);
1598     }
1599     void SetStaticShortField(jclass clazz, jfieldID fieldID,
1600                         jshort value) {
1601       functions->SetStaticShortField(this,clazz,fieldID,value);
1602     }
1603     void SetStaticIntField(jclass clazz, jfieldID fieldID,
1604                         jint value) {
1605       functions->SetStaticIntField(this,clazz,fieldID,value);
1606     }
1607     void SetStaticLongField(jclass clazz, jfieldID fieldID,
1608                         jlong value) {
1609       functions->SetStaticLongField(this,clazz,fieldID,value);
1610     }
1611     void SetStaticFloatField(jclass clazz, jfieldID fieldID,
1612                         jfloat value) {
1613       functions->SetStaticFloatField(this,clazz,fieldID,value);
1614     }
1615     void SetStaticDoubleField(jclass clazz, jfieldID fieldID,
1616                         jdouble value) {
1617       functions->SetStaticDoubleField(this,clazz,fieldID,value);
1618     }
1619 
1620     jstring NewString(const jchar *unicode, jsize len) {
1621         return functions->NewString(this,unicode,len);
1622     }
1623     jsize GetStringLength(jstring str) {
1624         return functions->GetStringLength(this,str);
1625     }
1626     const jchar *GetStringChars(jstring str, jboolean *isCopy) {
1627         return functions->GetStringChars(this,str,isCopy);
1628     }
1629     void ReleaseStringChars(jstring str, const jchar *chars) {
1630         functions->ReleaseStringChars(this,str,chars);
1631     }
1632 
1633     jstring NewStringUTF(const char *utf) {
1634         return functions->NewStringUTF(this,utf);
1635     }
1636     jsize GetStringUTFLength(jstring str) {
1637         return functions->GetStringUTFLength(this,str);
1638     }
1639     jlong GetStringUTFLengthAsLong(jstring str) {
1640         return functions->GetStringUTFLengthAsLong(this,str);
1641     }
1642     const char* GetStringUTFChars(jstring str, jboolean *isCopy) {
1643         return functions->GetStringUTFChars(this,str,isCopy);
1644     }
1645     void ReleaseStringUTFChars(jstring str, const char* chars) {
1646         functions->ReleaseStringUTFChars(this,str,chars);
1647     }
1648 
1649     jsize GetArrayLength(jarray array) {
1650         return functions->GetArrayLength(this,array);
1651     }
1652 
1653     jobjectArray NewObjectArray(jsize len, jclass clazz,
1654                                 jobject init) {
1655         return functions->NewObjectArray(this,len,clazz,init);
1656     }
1657     jobject GetObjectArrayElement(jobjectArray array, jsize index) {
1658         return functions->GetObjectArrayElement(this,array,index);
1659     }
1660     void SetObjectArrayElement(jobjectArray array, jsize index,
1661                                jobject val) {
1662         functions->SetObjectArrayElement(this,array,index,val);
1663     }
1664 
1665     jbooleanArray NewBooleanArray(jsize len) {
1666         return functions->NewBooleanArray(this,len);
1667     }
1668     jbyteArray NewByteArray(jsize len) {
1669         return functions->NewByteArray(this,len);
1670     }
1671     jcharArray NewCharArray(jsize len) {
1672         return functions->NewCharArray(this,len);
1673     }
1674     jshortArray NewShortArray(jsize len) {
1675         return functions->NewShortArray(this,len);
1676     }
1677     jintArray NewIntArray(jsize len) {
1678         return functions->NewIntArray(this,len);
1679     }
1680     jlongArray NewLongArray(jsize len) {
1681         return functions->NewLongArray(this,len);
1682     }
1683     jfloatArray NewFloatArray(jsize len) {
1684         return functions->NewFloatArray(this,len);
1685     }
1686     jdoubleArray NewDoubleArray(jsize len) {
1687         return functions->NewDoubleArray(this,len);
1688     }
1689 
1690     jboolean * GetBooleanArrayElements(jbooleanArray array, jboolean *isCopy) {
1691         return functions->GetBooleanArrayElements(this,array,isCopy);
1692     }
1693     jbyte * GetByteArrayElements(jbyteArray array, jboolean *isCopy) {
1694         return functions->GetByteArrayElements(this,array,isCopy);
1695     }
1696     jchar * GetCharArrayElements(jcharArray array, jboolean *isCopy) {
1697         return functions->GetCharArrayElements(this,array,isCopy);
1698     }
1699     jshort * GetShortArrayElements(jshortArray array, jboolean *isCopy) {
1700         return functions->GetShortArrayElements(this,array,isCopy);
1701     }
1702     jint * GetIntArrayElements(jintArray array, jboolean *isCopy) {
1703         return functions->GetIntArrayElements(this,array,isCopy);
1704     }
1705     jlong * GetLongArrayElements(jlongArray array, jboolean *isCopy) {
1706         return functions->GetLongArrayElements(this,array,isCopy);
1707     }
1708     jfloat * GetFloatArrayElements(jfloatArray array, jboolean *isCopy) {
1709         return functions->GetFloatArrayElements(this,array,isCopy);
1710     }
1711     jdouble * GetDoubleArrayElements(jdoubleArray array, jboolean *isCopy) {
1712         return functions->GetDoubleArrayElements(this,array,isCopy);
1713     }
1714 
1715     void ReleaseBooleanArrayElements(jbooleanArray array,
1716                                      jboolean *elems,
1717                                      jint mode) {
1718         functions->ReleaseBooleanArrayElements(this,array,elems,mode);
1719     }
1720     void ReleaseByteArrayElements(jbyteArray array,
1721                                   jbyte *elems,
1722                                   jint mode) {
1723         functions->ReleaseByteArrayElements(this,array,elems,mode);
1724     }
1725     void ReleaseCharArrayElements(jcharArray array,
1726                                   jchar *elems,
1727                                   jint mode) {
1728         functions->ReleaseCharArrayElements(this,array,elems,mode);
1729     }
1730     void ReleaseShortArrayElements(jshortArray array,
1731                                    jshort *elems,
1732                                    jint mode) {
1733         functions->ReleaseShortArrayElements(this,array,elems,mode);
1734     }
1735     void ReleaseIntArrayElements(jintArray array,
1736                                  jint *elems,
1737                                  jint mode) {
1738         functions->ReleaseIntArrayElements(this,array,elems,mode);
1739     }
1740     void ReleaseLongArrayElements(jlongArray array,
1741                                   jlong *elems,
1742                                   jint mode) {
1743         functions->ReleaseLongArrayElements(this,array,elems,mode);
1744     }
1745     void ReleaseFloatArrayElements(jfloatArray array,
1746                                    jfloat *elems,
1747                                    jint mode) {
1748         functions->ReleaseFloatArrayElements(this,array,elems,mode);
1749     }
1750     void ReleaseDoubleArrayElements(jdoubleArray array,
1751                                     jdouble *elems,
1752                                     jint mode) {
1753         functions->ReleaseDoubleArrayElements(this,array,elems,mode);
1754     }
1755 
1756     void GetBooleanArrayRegion(jbooleanArray array,
1757                                jsize start, jsize len, jboolean *buf) {
1758         functions->GetBooleanArrayRegion(this,array,start,len,buf);
1759     }
1760     void GetByteArrayRegion(jbyteArray array,
1761                             jsize start, jsize len, jbyte *buf) {
1762         functions->GetByteArrayRegion(this,array,start,len,buf);
1763     }
1764     void GetCharArrayRegion(jcharArray array,
1765                             jsize start, jsize len, jchar *buf) {
1766         functions->GetCharArrayRegion(this,array,start,len,buf);
1767     }
1768     void GetShortArrayRegion(jshortArray array,
1769                              jsize start, jsize len, jshort *buf) {
1770         functions->GetShortArrayRegion(this,array,start,len,buf);
1771     }
1772     void GetIntArrayRegion(jintArray array,
1773                            jsize start, jsize len, jint *buf) {
1774         functions->GetIntArrayRegion(this,array,start,len,buf);
1775     }
1776     void GetLongArrayRegion(jlongArray array,
1777                             jsize start, jsize len, jlong *buf) {
1778         functions->GetLongArrayRegion(this,array,start,len,buf);
1779     }
1780     void GetFloatArrayRegion(jfloatArray array,
1781                              jsize start, jsize len, jfloat *buf) {
1782         functions->GetFloatArrayRegion(this,array,start,len,buf);
1783     }
1784     void GetDoubleArrayRegion(jdoubleArray array,
1785                               jsize start, jsize len, jdouble *buf) {
1786         functions->GetDoubleArrayRegion(this,array,start,len,buf);
1787     }
1788 
1789     void SetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len,
1790                                const jboolean *buf) {
1791         functions->SetBooleanArrayRegion(this,array,start,len,buf);
1792     }
1793     void SetByteArrayRegion(jbyteArray array, jsize start, jsize len,
1794                             const jbyte *buf) {
1795         functions->SetByteArrayRegion(this,array,start,len,buf);
1796     }
1797     void SetCharArrayRegion(jcharArray array, jsize start, jsize len,
1798                             const jchar *buf) {
1799         functions->SetCharArrayRegion(this,array,start,len,buf);
1800     }
1801     void SetShortArrayRegion(jshortArray array, jsize start, jsize len,
1802                              const jshort *buf) {
1803         functions->SetShortArrayRegion(this,array,start,len,buf);
1804     }
1805     void SetIntArrayRegion(jintArray array, jsize start, jsize len,
1806                            const jint *buf) {
1807         functions->SetIntArrayRegion(this,array,start,len,buf);
1808     }
1809     void SetLongArrayRegion(jlongArray array, jsize start, jsize len,
1810                             const jlong *buf) {
1811         functions->SetLongArrayRegion(this,array,start,len,buf);
1812     }
1813     void SetFloatArrayRegion(jfloatArray array, jsize start, jsize len,
1814                              const jfloat *buf) {
1815         functions->SetFloatArrayRegion(this,array,start,len,buf);
1816     }
1817     void SetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len,
1818                               const jdouble *buf) {
1819         functions->SetDoubleArrayRegion(this,array,start,len,buf);
1820     }
1821 
1822     jint RegisterNatives(jclass clazz, const JNINativeMethod *methods,
1823                          jint nMethods) {
1824         return functions->RegisterNatives(this,clazz,methods,nMethods);
1825     }
1826     jint UnregisterNatives(jclass clazz) {
1827         return functions->UnregisterNatives(this,clazz);
1828     }
1829 
1830     jint MonitorEnter(jobject obj) {
1831         return functions->MonitorEnter(this,obj);
1832     }
1833     jint MonitorExit(jobject obj) {
1834         return functions->MonitorExit(this,obj);
1835     }
1836 
1837     jint GetJavaVM(JavaVM **vm) {
1838         return functions->GetJavaVM(this,vm);
1839     }
1840 
1841     void GetStringRegion(jstring str, jsize start, jsize len, jchar *buf) {
1842         functions->GetStringRegion(this,str,start,len,buf);
1843     }
1844     void GetStringUTFRegion(jstring str, jsize start, jsize len, char *buf) {
1845         functions->GetStringUTFRegion(this,str,start,len,buf);
1846     }
1847 
1848     void * GetPrimitiveArrayCritical(jarray array, jboolean *isCopy) {
1849         return functions->GetPrimitiveArrayCritical(this,array,isCopy);
1850     }
1851     void ReleasePrimitiveArrayCritical(jarray array, void *carray, jint mode) {
1852         functions->ReleasePrimitiveArrayCritical(this,array,carray,mode);
1853     }
1854 
1855     const jchar * GetStringCritical(jstring string, jboolean *isCopy) {
1856         return functions->GetStringCritical(this,string,isCopy);
1857     }
1858     void ReleaseStringCritical(jstring string, const jchar *cstring) {
1859         functions->ReleaseStringCritical(this,string,cstring);
1860     }
1861 
1862     jweak NewWeakGlobalRef(jobject obj) {
1863         return functions->NewWeakGlobalRef(this,obj);
1864     }
1865     void DeleteWeakGlobalRef(jweak ref) {
1866         functions->DeleteWeakGlobalRef(this,ref);
1867     }
1868 
1869     jboolean ExceptionCheck() {
1870         return functions->ExceptionCheck(this);
1871     }
1872 
1873     jobject NewDirectByteBuffer(void* address, jlong capacity) {
1874         return functions->NewDirectByteBuffer(this, address, capacity);
1875     }
1876     void* GetDirectBufferAddress(jobject buf) {
1877         return functions->GetDirectBufferAddress(this, buf);
1878     }
1879     jlong GetDirectBufferCapacity(jobject buf) {
1880         return functions->GetDirectBufferCapacity(this, buf);
1881     }
1882     jobjectRefType GetObjectRefType(jobject obj) {
1883         return functions->GetObjectRefType(this, obj);
1884     }
1885 
1886     /* Module Features */
1887 
1888     jobject GetModule(jclass clazz) {
1889         return functions->GetModule(this, clazz);
1890     }
1891 
1892     /* Virtual threads */
1893 
1894     jboolean IsVirtualThread(jobject obj) {
1895         return functions->IsVirtualThread(this, obj);
1896     }
1897 
1898     /* Value classes */
1899 
1900     jboolean IsValueObject(jobject obj) {
1901         return functions->IsValueObject(this, obj);
1902     }
1903 
1904 #endif /* __cplusplus */
1905 };
1906 
1907 /*
1908  * optionString may be any option accepted by the JVM, or one of the
1909  * following:
1910  *
1911  * -D<name>=<value>          Set a system property.
1912  * -verbose[:class|gc|jni]   Enable verbose output, comma-separated. E.g.
1913  *                           "-verbose:class" or "-verbose:gc,class"
1914  *                           Standard names include: gc, class, and jni.
1915  *                           All nonstandard (VM-specific) names must begin
1916  *                           with "X".
1917  * vfprintf                  extraInfo is a pointer to the vfprintf hook.
1918  * exit                      extraInfo is a pointer to the exit hook.
1919  * abort                     extraInfo is a pointer to the abort hook.
1920  */
1921 typedef struct JavaVMOption {
1922     char *optionString;
1923     void *extraInfo;
1924 } JavaVMOption;
1925 
1926 typedef struct JavaVMInitArgs {
1927     jint version;
1928 
1929     jint nOptions;
1930     JavaVMOption *options;
1931     jboolean ignoreUnrecognized;
1932 } JavaVMInitArgs;
1933 
1934 typedef struct JavaVMAttachArgs {
1935     jint version;
1936 
1937     char *name;
1938     jobject group;
1939 } JavaVMAttachArgs;
1940 
1941 /* These will be VM-specific. */
1942 
1943 #define JDK1_2
1944 #define JDK1_4
1945 
1946 /* End VM-specific. */
1947 
1948 struct JNIInvokeInterface_ {
1949     void *reserved0;
1950     void *reserved1;
1951     void *reserved2;
1952 
1953     jint (JNICALL *DestroyJavaVM)(JavaVM *vm);
1954 
1955     jint (JNICALL *AttachCurrentThread)(JavaVM *vm, void **penv, void *args);
1956 
1957     jint (JNICALL *DetachCurrentThread)(JavaVM *vm);
1958 
1959     jint (JNICALL *GetEnv)(JavaVM *vm, void **penv, jint version);
1960 
1961     jint (JNICALL *AttachCurrentThreadAsDaemon)(JavaVM *vm, void **penv, void *args);
1962 };
1963 
1964 struct JavaVM_ {
1965     const struct JNIInvokeInterface_ *functions;
1966 #ifdef __cplusplus
1967 
1968     jint DestroyJavaVM() {
1969         return functions->DestroyJavaVM(this);
1970     }
1971     jint AttachCurrentThread(void **penv, void *args) {
1972         return functions->AttachCurrentThread(this, penv, args);
1973     }
1974     jint DetachCurrentThread() {
1975         return functions->DetachCurrentThread(this);
1976     }
1977 
1978     jint GetEnv(void **penv, jint version) {
1979         return functions->GetEnv(this, penv, version);
1980     }
1981     jint AttachCurrentThreadAsDaemon(void **penv, void *args) {
1982         return functions->AttachCurrentThreadAsDaemon(this, penv, args);
1983     }
1984 #endif
1985 };
1986 
1987 #ifdef _JNI_IMPLEMENTATION_
1988 #define _JNI_IMPORT_OR_EXPORT_ JNIEXPORT
1989 #else
1990 #define _JNI_IMPORT_OR_EXPORT_ JNIIMPORT
1991 #endif
1992 _JNI_IMPORT_OR_EXPORT_ jint JNICALL
1993 JNI_GetDefaultJavaVMInitArgs(void *args);
1994 
1995 _JNI_IMPORT_OR_EXPORT_ jint JNICALL
1996 JNI_CreateJavaVM(JavaVM **pvm, void **penv, void *args);
1997 
1998 _JNI_IMPORT_OR_EXPORT_ jint JNICALL
1999 JNI_GetCreatedJavaVMs(JavaVM **, jsize, jsize *);
2000 
2001 /* Defined by native libraries. */
2002 JNIEXPORT jint JNICALL
2003 JNI_OnLoad(JavaVM *vm, void *reserved);
2004 
2005 JNIEXPORT void JNICALL
2006 JNI_OnUnload(JavaVM *vm, void *reserved);
2007 
2008 #define JNI_VERSION_1_1 0x00010001
2009 #define JNI_VERSION_1_2 0x00010002
2010 #define JNI_VERSION_1_4 0x00010004
2011 #define JNI_VERSION_1_6 0x00010006
2012 #define JNI_VERSION_1_8 0x00010008
2013 #define JNI_VERSION_9   0x00090000
2014 #define JNI_VERSION_10  0x000a0000
2015 #define JNI_VERSION_19  0x00130000
2016 #define JNI_VERSION_20  0x00140000
2017 #define JNI_VERSION_21  0x00150000
2018 #define JNI_VERSION_24  0x00180000
2019 
2020 #ifdef __cplusplus
2021 } /* extern "C" */
2022 #endif /* __cplusplus */
2023 
2024 #endif /* !_JAVASOFT_JNI_H_ */