Android jni系统变量、函数、接口定义汇总

在做Android jni开发时,jni为我们提供了哪些函数、接口、变量,有时候一头雾水,今天就把jni.h中定义的所有内容列出来,供自己查阅: 

Java代码  Android jni系统变量、函数、接口定义汇总
    1. /* 
    2.  * Copyright (C) 2006 The Android Open Source Project 
    3.  * 
    4.  * Licensed under the Apache License, Version 2.0 (the "License"); 
    5.  * you may not use this file except in compliance with the License. 
    6.  * You may obtain a copy of the License at 
    7.  * 
    8.  *      http://www.apache.org/licenses/LICENSE-2.0 
    9.  * 
    10.  * Unless required by applicable law or agreed to in writing, software 
    11.  * distributed under the License is distributed on an "AS IS" BASIS, 
    12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
    13.  * See the License for the specific language governing permissions and 
    14.  * limitations under the License. 
    15.  */  
    16.   
    17. /* 
    18.  * JNI specification, as defined by Sun: 
    19.  * http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html 
    20.  * 
    21.  * Everything here is expected to be VM-neutral. 
    22.  */  
    23.   
    24. #ifndef JNI_H_  
    25. #define JNI_H_  
    26.   
    27. #include <sys/cdefs.h>  
    28. #include <stdarg.h>  
    29.   
    30. /* 
    31.  * Primitive types that match up with Java equivalents. 
    32.  */  
    33. #ifdef HAVE_INTTYPES_H  
    34. # include <inttypes.h>      /* C99 */  
    35. typedef uint8_t         jboolean;       /* unsigned 8 bits */  
    36. typedef int8_t          jbyte;          /* signed 8 bits */  
    37. typedef uint16_t        jchar;          /* unsigned 16 bits */  
    38. typedef int16_t         jshort;         /* signed 16 bits */  
    39. typedef int32_t         jint;           /* signed 32 bits */  
    40. typedef int64_t         jlong;          /* signed 64 bits */  
    41. typedef float           jfloat;         /* 32-bit IEEE 754 */  
    42. typedef double          jdouble;        /* 64-bit IEEE 754 */  
    43. #else  
    44. typedef unsigned char   jboolean;       /* unsigned 8 bits */  
    45. typedef signed char     jbyte;          /* signed 8 bits */  
    46. typedef unsigned short  jchar;          /* unsigned 16 bits */  
    47. typedef short           jshort;         /* signed 16 bits */  
    48. typedef int             jint;           /* signed 32 bits */  
    49. typedef long long       jlong;          /* signed 64 bits */  
    50. typedef float           jfloat;         /* 32-bit IEEE 754 */  
    51. typedef double          jdouble;        /* 64-bit IEEE 754 */  
    52. #endif  
    53.   
    54. /* "cardinal indices and sizes" */  
    55. typedef jint            jsize;  
    56.   
    57. #ifdef __cplusplus  
    58. /* 
    59.  * Reference types, in C++ 
    60.  */  
    61. class _jobject {};  
    62. class _jclass : public _jobject {};  
    63. class _jstring : public _jobject {};  
    64. class _jarray : public _jobject {};  
    65. class _jobjectArray : public _jarray {};  
    66. class _jbooleanArray : public _jarray {};  
    67. class _jbyteArray : public _jarray {};  
    68. class _jcharArray : public _jarray {};  
    69. class _jshortArray : public _jarray {};  
    70. class _jintArray : public _jarray {};  
    71. class _jlongArray : public _jarray {};  
    72. class _jfloatArray : public _jarray {};  
    73. class _jdoubleArray : public _jarray {};  
    74. class _jthrowable : public _jobject {};  
    75.   
    76. typedef _jobject*       jobject;  
    77. typedef _jclass*        jclass;  
    78. typedef _jstring*       jstring;  
    79. typedef _jarray*        jarray;  
    80. typedef _jobjectArray*  jobjectArray;  
    81. typedef _jbooleanArray* jbooleanArray;  
    82. typedef _jbyteArray*    jbyteArray;  
    83. typedef _jcharArray*    jcharArray;  
    84. typedef _jshortArray*   jshortArray;  
    85. typedef _jintArray*     jintArray;  
    86. typedef _jlongArray*    jlongArray;  
    87. typedef _jfloatArray*   jfloatArray;  
    88. typedef _jdoubleArray*  jdoubleArray;  
    89. typedef _jthrowable*    jthrowable;  
    90. typedef _jobject*       jweak;  
    91.   
    92.   
    93. #else /* not __cplusplus */  
    94.   
    95. /* 
    96.  * Reference types, in C. 
    97.  */  
    98. typedef void*           jobject;  
    99. typedef jobject         jclass;  
    100. typedef jobject         jstring;  
    101. typedef jobject         jarray;  
    102. typedef jarray          jobjectArray;  
    103. typedef jarray          jbooleanArray;  
    104. typedef jarray          jbyteArray;  
    105. typedef jarray          jcharArray;  
    106. typedef jarray          jshortArray;  
    107. typedef jarray          jintArray;  
    108. typedef jarray          jlongArray;  
    109. typedef jarray          jfloatArray;  
    110. typedef jarray          jdoubleArray;  
    111. typedef jobject         jthrowable;  
    112. typedef jobject         jweak;  
    113.   
    114. #endif /* not __cplusplus */  
    115.   
    116. struct _jfieldID;                       /* opaque structure */  
    117. typedef struct _jfieldID* jfieldID;     /* field IDs */  
    118.   
    119. struct _jmethodID;                      /* opaque structure */  
    120. typedef struct _jmethodID* jmethodID;   /* method IDs */  
    121.   
    122. struct JNIInvokeInterface;  
    123.   
    124. typedef union jvalue {  
    125.     jboolean    z;  
    126.     jbyte       b;  
    127.     jchar       c;  
    128.     jshort      s;  
    129.     jint        i;  
    130.     jlong       j;  
    131.     jfloat      f;  
    132.     jdouble     d;  
    133.     jobject     l;  
    134. } jvalue;  
    135.   
    136. typedef enum jobjectRefType {  
    137.     JNIInvalidRefType = 0,  
    138.     JNILocalRefType = 1,  
    139.     JNIGlobalRefType = 2,  
    140.     JNIWeakGlobalRefType = 3  
    141. } jobjectRefType;  
    142.   
    143. typedef struct {  
    144.     const char* name;  
    145.     const char* signature;  
    146.     void*       fnPtr;  
    147. } JNINativeMethod;  
    148.   
    149. struct _JNIEnv;  
    150. struct _JavaVM;  
    151. typedef const struct JNINativeInterface* C_JNIEnv;  
    152.   
    153. #if defined(__cplusplus)  
    154. typedef _JNIEnv JNIEnv;  
    155. typedef _JavaVM JavaVM;  
    156. #else  
    157. typedef const struct JNINativeInterface* JNIEnv;  
    158. typedef const struct JNIInvokeInterface* JavaVM;  
    159. #endif  
    160.   
    161. /* 
    162.  * Table of interface function pointers. 
    163.  */  
    164. struct JNINativeInterface {  
    165.     void*       reserved0;  
    166.     void*       reserved1;  
    167.     void*       reserved2;  
    168.     void*       reserved3;  
    169.   
    170.     jint        (*GetVersion)(JNIEnv *);  
    171.   
    172.     jclass      (*DefineClass)(JNIEnv*, const char*, jobject, const jbyte*,  
    173.                         jsize);  
    174.     jclass      (*FindClass)(JNIEnv*, const char*);  
    175.   
    176.     jmethodID   (*FromReflectedMethod)(JNIEnv*, jobject);  
    177.     jfieldID    (*FromReflectedField)(JNIEnv*, jobject);  
    178.     /* spec doesn't show jboolean parameter */  
    179.     jobject     (*ToReflectedMethod)(JNIEnv*, jclass, jmethodID, jboolean);  
    180.   
    181.     jclass      (*GetSuperclass)(JNIEnv*, jclass);  
    182.     jboolean    (*IsAssignableFrom)(JNIEnv*, jclass, jclass);  
    183.   
    184.     /* spec doesn't show jboolean parameter */  
    185.     jobject     (*ToReflectedField)(JNIEnv*, jclass, jfieldID, jboolean);  
    186.   
    187.     jint        (*Throw)(JNIEnv*, jthrowable);  
    188.     jint        (*ThrowNew)(JNIEnv *, jclass, const char *);  
    189.     jthrowable  (*ExceptionOccurred)(JNIEnv*);  
    190.     void        (*ExceptionDescribe)(JNIEnv*);  
    191.     void        (*ExceptionClear)(JNIEnv*);  
    192.     void        (*FatalError)(JNIEnv*, const char*);  
    193.   
    194.     jint        (*PushLocalFrame)(JNIEnv*, jint);  
    195.     jobject     (*PopLocalFrame)(JNIEnv*, jobject);  
    196.   
    197.     jobject     (*NewGlobalRef)(JNIEnv*, jobject);  
    198.     void        (*DeleteGlobalRef)(JNIEnv*, jobject);  
    199.     void        (*DeleteLocalRef)(JNIEnv*, jobject);  
    200.     jboolean    (*IsSameObject)(JNIEnv*, jobject, jobject);  
    201.   
    202.     jobject     (*NewLocalRef)(JNIEnv*, jobject);  
    203.     jint        (*EnsureLocalCapacity)(JNIEnv*, jint);  
    204.   
    205.     jobject     (*AllocObject)(JNIEnv*, jclass);  
    206.     jobject     (*NewObject)(JNIEnv*, jclass, jmethodID, ...);  
    207.     jobject     (*NewObjectV)(JNIEnv*, jclass, jmethodID, va_list);  
    208.     jobject     (*NewObjectA)(JNIEnv*, jclass, jmethodID, jvalue*);  
    209.   
    210.     jclass      (*GetObjectClass)(JNIEnv*, jobject);  
    211.     jboolean    (*IsInstanceOf)(JNIEnv*, jobject, jclass);  
    212.     jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);  
    213.   
    214.     jobject     (*CallObjectMethod)(JNIEnv*, jobject, jmethodID, ...);  
    215.     jobject     (*CallObjectMethodV)(JNIEnv*, jobject, jmethodID, va_list);  
    216.     jobject     (*CallObjectMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);  
    217.     jboolean    (*CallBooleanMethod)(JNIEnv*, jobject, jmethodID, ...);  
    218.     jboolean    (*CallBooleanMethodV)(JNIEnv*, jobject, jmethodID, va_list);  
    219.     jboolean    (*CallBooleanMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);  
    220.     jbyte       (*CallByteMethod)(JNIEnv*, jobject, jmethodID, ...);  
    221.     jbyte       (*CallByteMethodV)(JNIEnv*, jobject, jmethodID, va_list);  
    222.     jbyte       (*CallByteMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);  
    223.     jchar       (*CallCharMethod)(JNIEnv*, jobject, jmethodID, ...);  
    224.     jchar       (*CallCharMethodV)(JNIEnv*, jobject, jmethodID, va_list);  
    225.     jchar       (*CallCharMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);  
    226.     jshort      (*CallShortMethod)(JNIEnv*, jobject, jmethodID, ...);  
    227.     jshort      (*CallShortMethodV)(JNIEnv*, jobject, jmethodID, va_list);  
    228.     jshort      (*CallShortMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);  
    229.     jint        (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);  
    230.     jint        (*CallIntMethodV)(JNIEnv*, jobject, jmethodID, va_list);  
    231.     jint        (*CallIntMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);  
    232.     jlong       (*CallLongMethod)(JNIEnv*, jobject, jmethodID, ...);  
    233.     jlong       (*CallLongMethodV)(JNIEnv*, jobject, jmethodID, va_list);  
    234.     jlong       (*CallLongMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);  
    235.     jfloat      (*CallFloatMethod)(JNIEnv*, jobject, jmethodID, ...) __NDK_FPABI__;  
    236.     jfloat      (*CallFloatMethodV)(JNIEnv*, jobject, jmethodID, va_list) __NDK_FPABI__;  
    237.     jfloat      (*CallFloatMethodA)(JNIEnv*, jobject, jmethodID, jvalue*) __NDK_FPABI__;  
    238.     jdouble     (*CallDoubleMethod)(JNIEnv*, jobject, jmethodID, ...) __NDK_FPABI__;  
    239.     jdouble     (*CallDoubleMethodV)(JNIEnv*, jobject, jmethodID, va_list) __NDK_FPABI__;  
    240.     jdouble     (*CallDoubleMethodA)(JNIEnv*, jobject, jmethodID, jvalue*) __NDK_FPABI__;  
    241.     void        (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);  
    242.     void        (*CallVoidMethodV)(JNIEnv*, jobject, jmethodID, va_list);  
    243.     void        (*CallVoidMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);  
    244.   
    245.     jobject     (*CallNonvirtualObjectMethod)(JNIEnv*, jobject, jclass,  
    246.                         jmethodID, ...);  
    247.     jobject     (*CallNonvirtualObjectMethodV)(JNIEnv*, jobject, jclass,  
    248.                         jmethodID, va_list);  
    249.     jobject     (*CallNonvirtualObjectMethodA)(JNIEnv*, jobject, jclass,  
    250.                         jmethodID, jvalue*);  
    251.     jboolean    (*CallNonvirtualBooleanMethod)(JNIEnv*, jobject, jclass,  
    252.                         jmethodID, ...);  
    253.     jboolean    (*CallNonvirtualBooleanMethodV)(JNIEnv*, jobject, jclass,  
    254.                          jmethodID, va_list);  
    255.     jboolean    (*CallNonvirtualBooleanMethodA)(JNIEnv*, jobject, jclass,  
    256.                          jmethodID, jvalue*);  
    257.     jbyte       (*CallNonvirtualByteMethod)(JNIEnv*, jobject, jclass,  
    258.                         jmethodID, ...);  
    259.     jbyte       (*CallNonvirtualByteMethodV)(JNIEnv*, jobject, jclass,  
    260.                         jmethodID, va_list);  
    261.     jbyte       (*CallNonvirtualByteMethodA)(JNIEnv*, jobject, jclass,  
    262.                         jmethodID, jvalue*);  
    263.     jchar       (*CallNonvirtualCharMethod)(JNIEnv*, jobject, jclass,  
    264.                         jmethodID, ...);  
    265.     jchar       (*CallNonvirtualCharMethodV)(JNIEnv*, jobject, jclass,  
    266.                         jmethodID, va_list);  
    267.     jchar       (*CallNonvirtualCharMethodA)(JNIEnv*, jobject, jclass,  
    268.                         jmethodID, jvalue*);  
    269.     jshort      (*CallNonvirtualShortMethod)(JNIEnv*, jobject, jclass,  
    270.                         jmethodID, ...);  
    271.     jshort      (*CallNonvirtualShortMethodV)(JNIEnv*, jobject, jclass,  
    272.                         jmethodID, va_list);  
    273.     jshort      (*CallNonvirtualShortMethodA)(JNIEnv*, jobject, jclass,  
    274.                         jmethodID, jvalue*);  
    275.     jint        (*CallNonvirtualIntMethod)(JNIEnv*, jobject, jclass,  
    276.                         jmethodID, ...);  
    277.     jint        (*CallNonvirtualIntMethodV)(JNIEnv*, jobject, jclass,  
    278.                         jmethodID, va_list);  
    279.     jint        (*CallNonvirtualIntMethodA)(JNIEnv*, jobject, jclass,  
    280.                         jmethodID, jvalue*);  
    281.     jlong       (*CallNonvirtualLongMethod)(JNIEnv*, jobject, jclass,  
    282.                         jmethodID, ...);  
    283.     jlong       (*CallNonvirtualLongMethodV)(JNIEnv*, jobject, jclass,  
    284.                         jmethodID, va_list);  
    285.     jlong       (*CallNonvirtualLongMethodA)(JNIEnv*, jobject, jclass,  
    286.                         jmethodID, jvalue*);  
    287.     jfloat      (*CallNonvirtualFloatMethod)(JNIEnv*, jobject, jclass,  
    288.                         jmethodID, ...) __NDK_FPABI__;  
    289.     jfloat      (*CallNonvirtualFloatMethodV)(JNIEnv*, jobject, jclass,  
    290.                         jmethodID, va_list) __NDK_FPABI__;  
    291.     jfloat      (*CallNonvirtualFloatMethodA)(JNIEnv*, jobject, jclass,  
    292.                         jmethodID, jvalue*) __NDK_FPABI__;  
    293.     jdouble     (*CallNonvirtualDoubleMethod)(JNIEnv*, jobject, jclass,  
    294.                         jmethodID, ...) __NDK_FPABI__;  
    295.     jdouble     (*CallNonvirtualDoubleMethodV)(JNIEnv*, jobject, jclass,  
    296.                         jmethodID, va_list) __NDK_FPABI__;  
    297.     jdouble     (*CallNonvirtualDoubleMethodA)(JNIEnv*, jobject, jclass,  
    298.                         jmethodID, jvalue*) __NDK_FPABI__;  
    299.     void        (*CallNonvirtualVoidMethod)(JNIEnv*, jobject, jclass,  
    300.                         jmethodID, ...);  
    301.     void        (*CallNonvirtualVoidMethodV)(JNIEnv*, jobject, jclass,  
    302.                         jmethodID, va_list);  
    303.     void        (*CallNonvirtualVoidMethodA)(JNIEnv*, jobject, jclass,  
    304.                         jmethodID, jvalue*);  
    305.   
    306.     jfieldID    (*GetFieldID)(JNIEnv*, jclass, const char*, const char*);  
    307.   
    308.     jobject     (*GetObjectField)(JNIEnv*, jobject, jfieldID);  
    309.     jboolean    (*GetBooleanField)(JNIEnv*, jobject, jfieldID);  
    310.     jbyte       (*GetByteField)(JNIEnv*, jobject, jfieldID);  
    311.     jchar       (*GetCharField)(JNIEnv*, jobject, jfieldID);  
    312.     jshort      (*GetShortField)(JNIEnv*, jobject, jfieldID);  
    313.     jint        (*GetIntField)(JNIEnv*, jobject, jfieldID);  
    314.     jlong       (*GetLongField)(JNIEnv*, jobject, jfieldID);  
    315.     jfloat      (*GetFloatField)(JNIEnv*, jobject, jfieldID) __NDK_FPABI__;  
    316.     jdouble     (*GetDoubleField)(JNIEnv*, jobject, jfieldID) __NDK_FPABI__;  
    317.   
    318.     void        (*SetObjectField)(JNIEnv*, jobject, jfieldID, jobject);  
    319.     void        (*SetBooleanField)(JNIEnv*, jobject, jfieldID, jboolean);  
    320.     void        (*SetByteField)(JNIEnv*, jobject, jfieldID, jbyte);  
    321.     void        (*SetCharField)(JNIEnv*, jobject, jfieldID, jchar);  
    322.     void        (*SetShortField)(JNIEnv*, jobject, jfieldID, jshort);  
    323.     void        (*SetIntField)(JNIEnv*, jobject, jfieldID, jint);  
    324.     void        (*SetLongField)(JNIEnv*, jobject, jfieldID, jlong);  
    325.     void        (*SetFloatField)(JNIEnv*, jobject, jfieldID, jfloat) __NDK_FPABI__;  
    326.     void        (*SetDoubleField)(JNIEnv*, jobject, jfieldID, jdouble) __NDK_FPABI__;  
    327.   
    328.     jmethodID   (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);  
    329.   
    330.     jobject     (*CallStaticObjectMethod)(JNIEnv*, jclass, jmethodID, ...);  
    331.     jobject     (*CallStaticObjectMethodV)(JNIEnv*, jclass, jmethodID, va_list);  
    332.     jobject     (*CallStaticObjectMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);  
    333.     jboolean    (*CallStaticBooleanMethod)(JNIEnv*, jclass, jmethodID, ...);  
    334.     jboolean    (*CallStaticBooleanMethodV)(JNIEnv*, jclass, jmethodID,  
    335.                         va_list);  
    336.     jboolean    (*CallStaticBooleanMethodA)(JNIEnv*, jclass, jmethodID,  
    337.                         jvalue*);  
    338.     jbyte       (*CallStaticByteMethod)(JNIEnv*, jclass, jmethodID, ...);  
    339.     jbyte       (*CallStaticByteMethodV)(JNIEnv*, jclass, jmethodID, va_list);  
    340.     jbyte       (*CallStaticByteMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);  
    341.     jchar       (*CallStaticCharMethod)(JNIEnv*, jclass, jmethodID, ...);  
    342.     jchar       (*CallStaticCharMethodV)(JNIEnv*, jclass, jmethodID, va_list);  
    343.     jchar       (*CallStaticCharMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);  
    344.     jshort      (*CallStaticShortMethod)(JNIEnv*, jclass, jmethodID, ...);  
    345.     jshort      (*CallStaticShortMethodV)(JNIEnv*, jclass, jmethodID, va_list);  
    346.     jshort      (*CallStaticShortMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);  
    347.     jint        (*CallStaticIntMethod)(JNIEnv*, jclass, jmethodID, ...);  
    348.     jint        (*CallStaticIntMethodV)(JNIEnv*, jclass, jmethodID, va_list);  
    349.     jint        (*CallStaticIntMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);  
    350.     jlong       (*CallStaticLongMethod)(JNIEnv*, jclass, jmethodID, ...);  
    351.     jlong       (*CallStaticLongMethodV)(JNIEnv*, jclass, jmethodID, va_list);  
    352.     jlong       (*CallStaticLongMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);  
    353.     jfloat      (*CallStaticFloatMethod)(JNIEnv*, jclass, jmethodID, ...) __NDK_FPABI__;  
    354.     jfloat      (*CallStaticFloatMethodV)(JNIEnv*, jclass, jmethodID, va_list) __NDK_FPABI__;  
    355.     jfloat      (*CallStaticFloatMethodA)(JNIEnv*, jclass, jmethodID, jvalue*) __NDK_FPABI__;  
    356.     jdouble     (*CallStaticDoubleMethod)(JNIEnv*, jclass, jmethodID, ...) __NDK_FPABI__;  
    357.     jdouble     (*CallStaticDoubleMethodV)(JNIEnv*, jclass, jmethodID, va_list) __NDK_FPABI__;  
    358.     jdouble     (*CallStaticDoubleMethodA)(JNIEnv*, jclass, jmethodID, jvalue*) __NDK_FPABI__;  
    359.     void        (*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...);  
    360.     void        (*CallStaticVoidMethodV)(JNIEnv*, jclass, jmethodID, va_list);  
    361.     void        (*CallStaticVoidMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);  
    362.   
    363.     jfieldID    (*GetStaticFieldID)(JNIEnv*, jclass, const char*,  
    364.                         const char*);  
    365.   
    366.     jobject     (*GetStaticObjectField)(JNIEnv*, jclass, jfieldID);  
    367.     jboolean    (*GetStaticBooleanField)(JNIEnv*, jclass, jfieldID);  
    368.     jbyte       (*GetStaticByteField)(JNIEnv*, jclass, jfieldID);  
    369.     jchar       (*GetStaticCharField)(JNIEnv*, jclass, jfieldID);  
    370.     jshort      (*GetStaticShortField)(JNIEnv*, jclass, jfieldID);  
    371.     jint        (*GetStaticIntField)(JNIEnv*, jclass, jfieldID);  
    372.     jlong       (*GetStaticLongField)(JNIEnv*, jclass, jfieldID);  
    373.     jfloat      (*GetStaticFloatField)(JNIEnv*, jclass, jfieldID) __NDK_FPABI__;  
    374.     jdouble     (*GetStaticDoubleField)(JNIEnv*, jclass, jfieldID) __NDK_FPABI__;  
    375.   
    376.     void        (*SetStaticObjectField)(JNIEnv*, jclass, jfieldID, jobject);  
    377.     void        (*SetStaticBooleanField)(JNIEnv*, jclass, jfieldID, jboolean);  
    378.     void        (*SetStaticByteField)(JNIEnv*, jclass, jfieldID, jbyte);  
    379.     void        (*SetStaticCharField)(JNIEnv*, jclass, jfieldID, jchar);  
    380.     void        (*SetStaticShortField)(JNIEnv*, jclass, jfieldID, jshort);  
    381.     void        (*SetStaticIntField)(JNIEnv*, jclass, jfieldID, jint);  
    382.     void        (*SetStaticLongField)(JNIEnv*, jclass, jfieldID, jlong);  
    383.     void        (*SetStaticFloatField)(JNIEnv*, jclass, jfieldID, jfloat) __NDK_FPABI__;  
    384.     void        (*SetStaticDoubleField)(JNIEnv*, jclass, jfieldID, jdouble) __NDK_FPABI__;  
    385.   
    386.     jstring     (*NewString)(JNIEnv*, const jchar*, jsize);  
    387.     jsize       (*GetStringLength)(JNIEnv*, jstring);  
    388.     const jchar* (*GetStringChars)(JNIEnv*, jstring, jboolean*);  
    389.     void        (*ReleaseStringChars)(JNIEnv*, jstring, const jchar*);  
    390.     jstring     (*NewStringUTF)(JNIEnv*, const char*);  
    391.     jsize       (*GetStringUTFLength)(JNIEnv*, jstring);  
    392.     /* JNI spec says this returns const jbyte*, but that's inconsistent */  
    393.     const char* (*GetStringUTFChars)(JNIEnv*, jstring, jboolean*);  
    394.     void        (*ReleaseStringUTFChars)(JNIEnv*, jstring, const char*);  
    395.     jsize       (*GetArrayLength)(JNIEnv*, jarray);  
    396.     jobjectArray (*NewObjectArray)(JNIEnv*, jsize, jclass, jobject);  
    397.     jobject     (*GetObjectArrayElement)(JNIEnv*, jobjectArray, jsize);  
    398.     void        (*SetObjectArrayElement)(JNIEnv*, jobjectArray, jsize, jobject);  
    399.   
    400.     jbooleanArray (*NewBooleanArray)(JNIEnv*, jsize);  
    401.     jbyteArray    (*NewByteArray)(JNIEnv*, jsize);  
    402.     jcharArray    (*NewCharArray)(JNIEnv*, jsize);  
    403.     jshortArray   (*NewShortArray)(JNIEnv*, jsize);  
    404.     jintArray     (*NewIntArray)(JNIEnv*, jsize);  
    405.     jlongArray    (*NewLongArray)(JNIEnv*, jsize);  
    406.     jfloatArray   (*NewFloatArray)(JNIEnv*, jsize);  
    407.     jdoubleArray  (*NewDoubleArray)(JNIEnv*, jsize);  
    408.   
    409.     jboolean*   (*GetBooleanArrayElements)(JNIEnv*, jbooleanArray, jboolean*);  
    410.     jbyte*      (*GetByteArrayElements)(JNIEnv*, jbyteArray, jboolean*);  
    411.     jchar*      (*GetCharArrayElements)(JNIEnv*, jcharArray, jboolean*);  
    412.     jshort*     (*GetShortArrayElements)(JNIEnv*, jshortArray, jboolean*);  
    413.     jint*       (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);  
    414.     jlong*      (*GetLongArrayElements)(JNIEnv*, jlongArray, jboolean*);  
    415.     jfloat*     (*GetFloatArrayElements)(JNIEnv*, jfloatArray, jboolean*);  
    416.     jdouble*    (*GetDoubleArrayElements)(JNIEnv*, jdoubleArray, jboolean*);  
    417.   
    418.     void        (*ReleaseBooleanArrayElements)(JNIEnv*, jbooleanArray,  
    419.                         jboolean*, jint);  
    420.     void        (*ReleaseByteArrayElements)(JNIEnv*, jbyteArray,  
    421.                         jbyte*, jint);  
    422.     void        (*ReleaseCharArrayElements)(JNIEnv*, jcharArray,  
    423.                         jchar*, jint);  
    424.     void        (*ReleaseShortArrayElements)(JNIEnv*, jshortArray,  
    425.                         jshort*, jint);  
    426.     void        (*ReleaseIntArrayElements)(JNIEnv*, jintArray,  
    427.                         jint*, jint);  
    428.     void        (*ReleaseLongArrayElements)(JNIEnv*, jlongArray,  
    429.                         jlong*, jint);  
    430.     void        (*ReleaseFloatArrayElements)(JNIEnv*, jfloatArray,  
    431.                         jfloat*, jint);  
    432.     void        (*ReleaseDoubleArrayElements)(JNIEnv*, jdoubleArray,  
    433.                         jdouble*, jint);  
    434.   
    435.     void        (*GetBooleanArrayRegion)(JNIEnv*, jbooleanArray,  
    436.                         jsize, jsize, jboolean*);  
    437.     void        (*GetByteArrayRegion)(JNIEnv*, jbyteArray,  
    438.                         jsize, jsize, jbyte*);  
    439.     void        (*GetCharArrayRegion)(JNIEnv*, jcharArray,  
    440.                         jsize, jsize, jchar*);  
    441.     void        (*GetShortArrayRegion)(JNIEnv*, jshortArray,  
    442.                         jsize, jsize, jshort*);  
    443.     void        (*GetIntArrayRegion)(JNIEnv*, jintArray,  
    444.                         jsize, jsize, jint*);  
    445.     void        (*GetLongArrayRegion)(JNIEnv*, jlongArray,  
    446.                         jsize, jsize, jlong*);  
    447.     void        (*GetFloatArrayRegion)(JNIEnv*, jfloatArray,  
    448.                         jsize, jsize, jfloat*);  
    449.     void        (*GetDoubleArrayRegion)(JNIEnv*, jdoubleArray,  
    450.                         jsize, jsize, jdouble*);  
    451.   
    452.     /* spec shows these without const; some jni.h do, some don't */  
    453.     void        (*SetBooleanArrayRegion)(JNIEnv*, jbooleanArray,  
    454.                         jsize, jsize, const jboolean*);  
    455.     void        (*SetByteArrayRegion)(JNIEnv*, jbyteArray,  
    456.                         jsize, jsize, const jbyte*);  
    457.     void        (*SetCharArrayRegion)(JNIEnv*, jcharArray,  
    458.                         jsize, jsize, const jchar*);  
    459.     void        (*SetShortArrayRegion)(JNIEnv*, jshortArray,  
    460.                         jsize, jsize, const jshort*);  
    461.     void        (*SetIntArrayRegion)(JNIEnv*, jintArray,  
    462.                         jsize, jsize, const jint*);  
    463.     void        (*SetLongArrayRegion)(JNIEnv*, jlongArray,  
    464.                         jsize, jsize, const jlong*);  
    465.     void        (*SetFloatArrayRegion)(JNIEnv*, jfloatArray,  
    466.                         jsize, jsize, const jfloat*);  
    467.     void        (*SetDoubleArrayRegion)(JNIEnv*, jdoubleArray,  
    468.                         jsize, jsize, const jdouble*);  
    469.   
    470.     jint        (*RegisterNatives)(JNIEnv*, jclass, const JNINativeMethod*,  
    471.                         jint);  
    472.     jint        (*UnregisterNatives)(JNIEnv*, jclass);  
    473.     jint        (*MonitorEnter)(JNIEnv*, jobject);  
    474.     jint        (*MonitorExit)(JNIEnv*, jobject);  
    475.     jint        (*GetJavaVM)(JNIEnv*, JavaVM**);  
    476.   
    477.     void        (*GetStringRegion)(JNIEnv*, jstring, jsize, jsize, jchar*);  
    478.     void        (*GetStringUTFRegion)(JNIEnv*, jstring, jsize, jsize, char*);  
    479.   
    480.     void*       (*GetPrimitiveArrayCritical)(JNIEnv*, jarray, jboolean*);  
    481.     void        (*ReleasePrimitiveArrayCritical)(JNIEnv*, jarray, void*, jint);  
    482.   
    483.     const jchar* (*GetStringCritical)(JNIEnv*, jstring, jboolean*);  
    484.     void        (*ReleaseStringCritical)(JNIEnv*, jstring, const jchar*);  
    485.   
    486.     jweak       (*NewWeakGlobalRef)(JNIEnv*, jobject);  
    487.     void        (*DeleteWeakGlobalRef)(JNIEnv*, jweak);  
    488.   
    489.     jboolean    (*ExceptionCheck)(JNIEnv*);  
    490.   
    491.     jobject     (*NewDirectByteBuffer)(JNIEnv*, void*, jlong);  
    492.     void*       (*GetDirectBufferAddress)(JNIEnv*, jobject);  
    493.     jlong       (*GetDirectBufferCapacity)(JNIEnv*, jobject);  
    494.   
    495.     /* added in JNI 1.6 */  
    496.     jobjectRefType (*GetObjectRefType)(JNIEnv*, jobject);  
    497. };  
    498.   
    499. /* 
    500.  * C++ object wrapper. 
    501.  * 
    502.  * This is usually overlaid on a C struct whose first element is a 
    503.  * JNINativeInterface*.  We rely somewhat on compiler behavior. 
    504.  */  
    505. struct _JNIEnv {  
    506.     /* do not rename this; it does not seem to be entirely opaque */  
    507.     const struct JNINativeInterface* functions;  
    508.   
    509. #if defined(__cplusplus)  
    510.   
    511.     jint GetVersion()  
    512.     { return functions->GetVersion(this); }  
    513.   
    514.     jclass DefineClass(const char *name, jobject loader, const jbyte* buf,  
    515.         jsize bufLen)  
    516.     { return functions->DefineClass(this, name, loader, buf, bufLen); }  
    517.   
    518.     jclass FindClass(const char* name)  
    519.     { return functions->FindClass(this, name); }  
    520.   
    521.     jmethodID FromReflectedMethod(jobject method)  
    522.     { return functions->FromReflectedMethod(this, method); }  
    523.   
    524.     jfieldID FromReflectedField(jobject field)  
    525.     { return functions->FromReflectedField(this, field); }  
    526.   
    527.     jobject ToReflectedMethod(jclass cls, jmethodID methodID, jboolean isStatic)  
    528.     { return functions->ToReflectedMethod(this, cls, methodID, isStatic); }  
    529.   
    530.     jclass GetSuperclass(jclass clazz)  
    531.     { return functions->GetSuperclass(this, clazz); }  
    532.   
    533.     jboolean IsAssignableFrom(jclass clazz1, jclass clazz2)  
    534.     { return functions->IsAssignableFrom(this, clazz1, clazz2); }  
    535.   
    536.     jobject ToReflectedField(jclass cls, jfieldID fieldID, jboolean isStatic)  
    537.     { return functions->ToReflectedField(this, cls, fieldID, isStatic); }  
    538.   
    539.     jint Throw(jthrowable obj)  
    540.     { return functions->Throw(this, obj); }  
    541.   
    542.     jint ThrowNew(jclass clazz, const char* message)  
    543.     { return functions->ThrowNew(this, clazz, message); }  
    544.   
    545.     jthrowable ExceptionOccurred()  
    546.     { return functions->ExceptionOccurred(this); }  
    547.   
    548.     void ExceptionDescribe()  
    549.     { functions->ExceptionDescribe(this); }  
    550.   
    551.     void ExceptionClear()  
    552.     { functions->ExceptionClear(this); }  
    553.   
    554.     void FatalError(const char* msg)  
    555.     { functions->FatalError(this, msg); }  
    556.   
    557.     jint PushLocalFrame(jint capacity)  
    558.     { return functions->PushLocalFrame(this, capacity); }  
    559.   
    560.     jobject PopLocalFrame(jobject result)  
    561.     { return functions->PopLocalFrame(this, result); }  
    562.   
    563.     jobject NewGlobalRef(jobject obj)  
    564.     { return functions->NewGlobalRef(this, obj); }  
    565.   
    566.     void DeleteGlobalRef(jobject globalRef)  
    567.     { functions->DeleteGlobalRef(this, globalRef); }  
    568.   
    569.     void DeleteLocalRef(jobject localRef)  
    570.     { functions->DeleteLocalRef(this, localRef); }  
    571.   
    572.     jboolean IsSameObject(jobject ref1, jobject ref2)  
    573.     { return functions->IsSameObject(this, ref1, ref2); }  
    574.   
    575.     jobject NewLocalRef(jobject ref)  
    576.     { return functions->NewLocalRef(this, ref); }  
    577.   
    578.     jint EnsureLocalCapacity(jint capacity)  
    579.     { return functions->EnsureLocalCapacity(this, capacity); }  
    580.   
    581.     jobject AllocObject(jclass clazz)  
    582.     { return functions->AllocObject(this, clazz); }  
    583.   
    584.     jobject NewObject(jclass clazz, jmethodID methodID, ...)  
    585.     {  
    586.         va_list args;  
    587.         va_start(args, methodID);  
    588.         jobject result = functions->NewObjectV(this, clazz, methodID, args);  
    589.         va_end(args);  
    590.         return result;  
    591.     }  
    592.   
    593.     jobject NewObjectV(jclass clazz, jmethodID methodID, va_list args)  
    594.     { return functions->NewObjectV(this, clazz, methodID, args); }  
    595.   
    596.     jobject NewObjectA(jclass clazz, jmethodID methodID, jvalue* args)  
    597.     { return functions->NewObjectA(this, clazz, methodID, args); }  
    598.   
    599.     jclass GetObjectClass(jobject obj)  
    600.     { return functions->GetObjectClass(this, obj); }  
    601.   
    602.     jboolean IsInstanceOf(jobject obj, jclass clazz)  
    603.     { return functions->IsInstanceOf(this, obj, clazz); }  
    604.   
    605.     jmethodID GetMethodID(jclass clazz, const char* name, const char* sig)  
    606.     { return functions->GetMethodID(this, clazz, name, sig); }  
    607.   
    608. #define CALL_TYPE_METHOD(_jtype, _jname)                                      
    609.     __NDK_FPABI__                                                             
    610.     _jtype Call##_jname##Method(jobject obj, jmethodID methodID, ...)         
    611.     {                                                                         
    612.         _jtype result;                                                        
    613.         va_list args;                                                         
    614.         va_start(args, methodID);                                             
    615.         result = functions->Call##_jname##MethodV(this, obj, methodID,        
    616.                     args);                                                    
    617.         va_end(args);                                                         
    618.         return result;                                                        
    619.     }  
    620. #define CALL_TYPE_METHODV(_jtype, _jname)                                     
    621.     __NDK_FPABI__                                                             
    622.     _jtype Call##_jname##MethodV(jobject obj, jmethodID methodID,             
    623.         va_list args)                                                         
    624.     { return functions->Call##_jname##MethodV(this, obj, methodID, args); }  
    625. #define CALL_TYPE_METHODA(_jtype, _jname)                                     
    626.     __NDK_FPABI__                                                             
    627.     _jtype Call##_jname##MethodA(jobject obj, jmethodID methodID,             
    628.         jvalue* args)                                                         
    629.     { return functions->Call##_jname##MethodA(this, obj, methodID, args); }  
    630.   
    631. #define CALL_TYPE(_jtype, _jname)                                             
    632.     CALL_TYPE_METHOD(_jtype, _jname)                                          
    633.     CALL_TYPE_METHODV(_jtype, _jname)                                         
    634.     CALL_TYPE_METHODA(_jtype, _jname)  
    635.   
    636.     CALL_TYPE(jobject, Object)  
    637.     CALL_TYPE(jboolean, Boolean)  
    638.     CALL_TYPE(jbyte, Byte)  
    639.     CALL_TYPE(jchar, Char)  
    640.     CALL_TYPE(jshort, Short)  
    641.     CALL_TYPE(jint, Int)  
    642.     CALL_TYPE(jlong, Long)  
    643.     CALL_TYPE(jfloat, Float)  
    644.     CALL_TYPE(jdouble, Double)  
    645.   
    646.     void CallVoidMethod(jobject obj, jmethodID methodID, ...)  
    647.     {  
    648.         va_list args;  
    649.         va_start(args, methodID);  
    650.         functions->CallVoidMethodV(this, obj, methodID, args);  
    651.         va_end(args);  
    652.     }  
    653.     void CallVoidMethodV(jobject obj, jmethodID methodID, va_list args)  
    654.     { functions->CallVoidMethodV(this, obj, methodID, args); }  
    655.     void CallVoidMethodA(jobject obj, jmethodID methodID, jvalue* args)  
    656.     { functions->CallVoidMethodA(this, obj, methodID, args); }  
    657.   
    658. #define CALL_NONVIRT_TYPE_METHOD(_jtype, _jname)                              
    659.     __NDK_FPABI__                                                             
    660.     _jtype CallNonvirtual##_jname##Method(jobject obj, jclass clazz,          
    661.         jmethodID methodID, ...)                                              
    662.     {                                                                         
    663.         _jtype result;                                                        
    664.         va_list args;                                                         
    665.         va_start(args, methodID);                                             
    666.         result = functions->CallNonvirtual##_jname##MethodV(this, obj,        
    667.                     clazz, methodID, args);                                   
    668.         va_end(args);                                                         
    669.         return result;                                                        
    670.     }  
    671. #define CALL_NONVIRT_TYPE_METHODV(_jtype, _jname)                             
    672.     __NDK_FPABI__                                                             
    673.     _jtype CallNonvirtual##_jname##MethodV(jobject obj, jclass clazz,         
    674.         jmethodID methodID, va_list args)                                     
    675.     { return functions->CallNonvirtual##_jname##MethodV(this, obj, clazz,     
    676.         methodID, args); }  
    677. #define CALL_NONVIRT_TYPE_METHODA(_jtype, _jname)                             
    678.     __NDK_FPABI__                                                             
    679.     _jtype CallNonvirtual##_jname##MethodA(jobject obj, jclass clazz,         
    680.         jmethodID methodID, jvalue* args)                                     
    681.     { return functions->CallNonvirtual##_jname##MethodA(this, obj, clazz,     
    682.         methodID, args); }  
    683.   
    684. #define CALL_NONVIRT_TYPE(_jtype, _jname)                                     
    685.     CALL_NONVIRT_TYPE_METHOD(_jtype, _jname)                                  
    686.     CALL_NONVIRT_TYPE_METHODV(_jtype, _jname)                                 
    687.     CALL_NONVIRT_TYPE_METHODA(_jtype, _jname)  
    688.   
    689.     CALL_NONVIRT_TYPE(jobject, Object)  
    690.     CALL_NONVIRT_TYPE(jboolean, Boolean)  
    691.     CALL_NONVIRT_TYPE(jbyte, Byte)  
    692.     CALL_NONVIRT_TYPE(jchar, Char)  
    693.     CALL_NONVIRT_TYPE(jshort, Short)  
    694.     CALL_NONVIRT_TYPE(jint, Int)  
    695.     CALL_NONVIRT_TYPE(jlong, Long)  
    696.     CALL_NONVIRT_TYPE(jfloat, Float)  
    697.     CALL_NONVIRT_TYPE(jdouble, Double)  
    698.   
    699.     void CallNonvirtualVoidMethod(jobject obj, jclass clazz,  
    700.         jmethodID methodID, ...)  
    701.     {  
    702.         va_list args;  
    703.         va_start(args, methodID);  
    704.         functions->CallNonvirtualVoidMethodV(this, obj, clazz, methodID, args);  
    705.         va_end(args);  
    706.     }  
    707.     void CallNonvirtualVoidMethodV(jobject obj, jclass clazz,  
    708.         jmethodID methodID, va_list args)  
    709.     { functions->CallNonvirtualVoidMethodV(this, obj, clazz, methodID, args); }  
    710.     void CallNonvirtualVoidMethodA(jobject obj, jclass clazz,  
    711.         jmethodID methodID, jvalue* args)  
    712.     { functions->CallNonvirtualVoidMethodA(this, obj, clazz, methodID, args); }  
    713.   
    714.     jfieldID GetFieldID(jclass clazz, const char* name, const char* sig)  
    715.     { return functions->GetFieldID(this, clazz, name, sig); }  
    716.   
    717.     jobject GetObjectField(jobject obj, jfieldID fieldID)  
    718.     { return functions->GetObjectField(this, obj, fieldID); }  
    719.     jboolean GetBooleanField(jobject obj, jfieldID fieldID)  
    720.     { return functions->GetBooleanField(this, obj, fieldID); }  
    721.     jbyte GetByteField(jobject obj, jfieldID fieldID)  
    722.     { return functions->GetByteField(this, obj, fieldID); }  
    723.     jchar GetCharField(jobject obj, jfieldID fieldID)  
    724.     { return functions->GetCharField(this, obj, fieldID); }  
    725.     jshort GetShortField(jobject obj, jfieldID fieldID)  
    726.     { return functions->GetShortField(this, obj, fieldID); }  
    727.     jint GetIntField(jobject obj, jfieldID fieldID)  
    728.     { return functions->GetIntField(this, obj, fieldID); }  
    729.     jlong GetLongField(jobject obj, jfieldID fieldID)  
    730.     { return functions->GetLongField(this, obj, fieldID); }  
    731.     __NDK_FPABI__  
    732.     jfloat GetFloatField(jobject obj, jfieldID fieldID)  
    733.     { return functions->GetFloatField(this, obj, fieldID); }  
    734.     __NDK_FPABI__  
    735.     jdouble GetDoubleField(jobject obj, jfieldID fieldID)  
    736.     { return functions->GetDoubleField(this, obj, fieldID); }  
    737.   
    738.     void SetObjectField(jobject obj, jfieldID fieldID, jobject value)  
    739.     { functions->SetObjectField(this, obj, fieldID, value); }  
    740.     void SetBooleanField(jobject obj, jfieldID fieldID, jboolean value)  
    741.     { functions->SetBooleanField(this, obj, fieldID, value); }  
    742.     void SetByteField(jobject obj, jfieldID fieldID, jbyte value)  
    743.     { functions->SetByteField(this, obj, fieldID, value); }  
    744.     void SetCharField(jobject obj, jfieldID fieldID, jchar value)  
    745.     { functions->SetCharField(this, obj, fieldID, value); }  
    746.     void SetShortField(jobject obj, jfieldID fieldID, jshort value)  
    747.     { functions->SetShortField(this, obj, fieldID, value); }  
    748.     void SetIntField(jobject obj, jfieldID fieldID, jint value)  
    749.     { functions->SetIntField(this, obj, fieldID, value); }  
    750.     void SetLongField(jobject obj, jfieldID fieldID, jlong value)  
    751.     { functions->SetLongField(this, obj, fieldID, value); }  
    752.     __NDK_FPABI__  
    753.     void SetFloatField(jobject obj, jfieldID fieldID, jfloat value)  
    754.     { functions->SetFloatField(this, obj, fieldID, value); }  
    755.     __NDK_FPABI__  
    756.     void SetDoubleField(jobject obj, jfieldID fieldID, jdouble value)  
    757.     { functions->SetDoubleField(this, obj, fieldID, value); }  
    758.   
    759.     jmethodID GetStaticMethodID(jclass clazz, const char* name, const char* sig)  
    760.     { return functions->GetStaticMethodID(this, clazz, name, sig); }  
    761.   
    762. #define CALL_STATIC_TYPE_METHOD(_jtype, _jname)                               
    763.     __NDK_FPABI__                                                             
    764.     _jtype CallStatic##_jname##Method(jclass clazz, jmethodID methodID,       
    765.         ...)                                                                  
    766.     {                                                                         
    767.         _jtype result;                                                        
    768.         va_list args;                                                         
    769.         va_start(args, methodID);                                             
    770.         result = functions->CallStatic##_jname##MethodV(this, clazz,          
    771.                     methodID, args);                                          
    772.         va_end(args);                                                         
    773.         return result;                                                        
    774.     }  
    775. #define CALL_STATIC_TYPE_METHODV(_jtype, _jname)                              
    776.     __NDK_FPABI__                                                             
    777.     _jtype CallStatic##_jname##MethodV(jclass clazz, jmethodID methodID,      
    778.         va_list args)                                                         
    779.     { return functions->CallStatic##_jname##MethodV(this, clazz, methodID,    
    780.         args); }  
    781. #define CALL_STATIC_TYPE_METHODA(_jtype, _jname)                              
    782.     __NDK_FPABI__                                                             
    783.     _jtype CallStatic##_jname##MethodA(jclass clazz, jmethodID methodID,      
    784.         jvalue* args)                                                         
    785.     { return functions->CallStatic##_jname##MethodA(this, clazz, methodID,    
    786.         args); }  
    787.   
    788. #define CALL_STATIC_TYPE(_jtype, _jname)                                      
    789.     CALL_STATIC_TYPE_METHOD(_jtype, _jname)                                   
    790.     CALL_STATIC_TYPE_METHODV(_jtype, _jname)                                  
    791.     CALL_STATIC_TYPE_METHODA(_jtype, _jname)  
    792.   
    793.     CALL_STATIC_TYPE(jobject, Object)  
    794.     CALL_STATIC_TYPE(jboolean, Boolean)  
    795.     CALL_STATIC_TYPE(jbyte, Byte)  
    796.     CALL_STATIC_TYPE(jchar, Char)  
    797.     CALL_STATIC_TYPE(jshort, Short)  
    798.     CALL_STATIC_TYPE(jint, Int)  
    799.     CALL_STATIC_TYPE(jlong, Long)  
    800.     CALL_STATIC_TYPE(jfloat, Float)  
    801.     CALL_STATIC_TYPE(jdouble, Double)  
    802.   
    803.     void CallStaticVoidMethod(jclass clazz, jmethodID methodID, ...)  
    804.     {  
    805.         va_list args;  
    806.         va_start(args, methodID);  
    807.         functions->CallStaticVoidMethodV(this, clazz, methodID, args);  
    808.         va_end(args);  
    809.     }  
    810.     void CallStaticVoidMethodV(jclass clazz, jmethodID methodID, va_list args)  
    811.     { functions->CallStaticVoidMethodV(this, clazz, methodID, args); }  
    812.     void CallStaticVoidMethodA(jclass clazz, jmethodID methodID, jvalue* args)  
    813.     { functions->CallStaticVoidMethodA(this, clazz, methodID, args); }  
    814.   
    815.     jfieldID GetStaticFieldID(jclass clazz, const char* name, const char* sig)  
    816.     { return functions->GetStaticFieldID(this, clazz, name, sig); }  
    817.   
    818.     jobject GetStaticObjectField(jclass clazz, jfieldID fieldID)  
    819.     { return functions->GetStaticObjectField(this, clazz, fieldID); }  
    820.     jboolean GetStaticBooleanField(jclass clazz, jfieldID fieldID)  
    821.     { return functions->GetStaticBooleanField(this, clazz, fieldID); }  
    822.     jbyte GetStaticByteField(jclass clazz, jfieldID fieldID)  
    823.     { return functions->GetStaticByteField(this, clazz, fieldID); }  
    824.     jchar GetStaticCharField(jclass clazz, jfieldID fieldID)  
    825.     { return functions->GetStaticCharField(this, clazz, fieldID); }  
    826.     jshort GetStaticShortField(jclass clazz, jfieldID fieldID)  
    827.     { return functions->GetStaticShortField(this, clazz, fieldID); }  
    828.     jint GetStaticIntField(jclass clazz, jfieldID fieldID)  
    829.     { return functions->GetStaticIntField(this, clazz, fieldID); }  
    830.     jlong GetStaticLongField(jclass clazz, jfieldID fieldID)  
    831.     { return functions->GetStaticLongField(this, clazz, fieldID); }  
    832.     __NDK_FPABI__  
    833.     jfloat GetStaticFloatField(jclass clazz, jfieldID fieldID)  
    834.     { return functions->GetStaticFloatField(this, clazz, fieldID); }  
    835.     __NDK_FPABI__  
    836.     jdouble GetStaticDoubleField(jclass clazz, jfieldID fieldID)  
    837.     { return functions->GetStaticDoubleField(this, clazz, fieldID); }  
    838.   
    839.     void SetStaticObjectField(jclass clazz, jfieldID fieldID, jobject value)  
    840.     { functions->SetStaticObjectField(this, clazz, fieldID, value); }  
    841.     void SetStaticBooleanField(jclass clazz, jfieldID fieldID, jboolean value)  
    842.     { functions->SetStaticBooleanField(this, clazz, fieldID, value); }  
    843.     void SetStaticByteField(jclass clazz, jfieldID fieldID, jbyte value)  
    844.     { functions->SetStaticByteField(this, clazz, fieldID, value); }  
    845.     void SetStaticCharField(jclass clazz, jfieldID fieldID, jchar value)  
    846.     { functions->SetStaticCharField(this, clazz, fieldID, value); }  
    847.     void SetStaticShortField(jclass clazz, jfieldID fieldID, jshort value)  
    848.     { functions->SetStaticShortField(this, clazz, fieldID, value); }  
    849.     void SetStaticIntField(jclass clazz, jfieldID fieldID, jint value)  
    850.     { functions->SetStaticIntField(this, clazz, fieldID, value); }  
    851.     void SetStaticLongField(jclass clazz, jfieldID fieldID, jlong value)  
    852.     { functions->SetStaticLongField(this, clazz, fieldID, value); }  
    853.     __NDK_FPABI__  
    854.     void SetStaticFloatField(jclass clazz, jfieldID fieldID, jfloat value)  
    855.     { functions->SetStaticFloatField(this, clazz, fieldID, value); }  
    856.     __NDK_FPABI__  
    857.     void SetStaticDoubleField(jclass clazz, jfieldID fieldID, jdouble value)  
    858.     { functions->SetStaticDoubleField(this, clazz, fieldID, value); }  
    859.   
    860.     jstring NewString(const jchar* unicodeChars, jsize len)  
    861.     { return functions->NewString(this, unicodeChars, len); }  
    862.   
    863.     jsize GetStringLength(jstring string)  
    864.     { return functions->GetStringLength(this, string); }  
    865.   
    866.     const jchar* GetStringChars(jstring string, jboolean* isCopy)  
    867.     { return functions->GetStringChars(this, string, isCopy); }  
    868.   
    869.     void ReleaseStringChars(jstring string, const jchar* chars)  
    870.     { functions->ReleaseStringChars(this, string, chars); }  
    871.   
    872.     jstring NewStringUTF(const char* bytes)  
    873.     { return functions->NewStringUTF(this, bytes); }  
    874.   
    875.     jsize GetStringUTFLength(jstring string)  
    876.     { return functions->GetStringUTFLength(this, string); }  
    877.   
    878.     const char* GetStringUTFChars(jstring string, jboolean* isCopy)  
    879.     { return functions->GetStringUTFChars(this, string, isCopy); }  
    880.   
    881.     void ReleaseStringUTFChars(jstring string, const char* utf)  
    882.     { functions->ReleaseStringUTFChars(this, string, utf); }  
    883.   
    884.     jsize GetArrayLength(jarray array)  
    885.     { return functions->GetArrayLength(this, array); }  
    886.   
    887.     jobjectArray NewObjectArray(jsize length, jclass elementClass,  
    888.         jobject initialElement)  
    889.     { return functions->NewObjectArray(this, length, elementClass,  
    890.         initialElement); }  
    891.   
    892.     jobject GetObjectArrayElement(jobjectArray array, jsize index)  
    893.     { return functions->GetObjectArrayElement(this, array, index); }  
    894.   
    895.     void SetObjectArrayElement(jobjectArray array, jsize index, jobject value)  
    896.     { functions->SetObjectArrayElement(this, array, index, value); }  
    897.   
    898.     jbooleanArray NewBooleanArray(jsize length)  
    899.     { return functions->NewBooleanArray(this, length); }  
    900.     jbyteArray NewByteArray(jsize length)  
    901.     { return functions->NewByteArray(this, length); }  
    902.     jcharArray NewCharArray(jsize length)  
    903.     { return functions->NewCharArray(this, length); }  
    904.     jshortArray NewShortArray(jsize length)  
    905.     { return functions->NewShortArray(this, length); }  
    906.     jintArray NewIntArray(jsize length)  
    907.     { return functions->NewIntArray(this, length); }  
    908.     jlongArray NewLongArray(jsize length)  
    909.     { return functions->NewLongArray(this, length); }  
    910.     jfloatArray NewFloatArray(jsize length)  
    911.     { return functions->NewFloatArray(this, length); }  
    912.     jdoubleArray NewDoubleArray(jsize length)  
    913.     { return functions->NewDoubleArray(this, length); }  
    914.   
    915.     jboolean* GetBooleanArrayElements(jbooleanArray array, jboolean* isCopy)  
    916.     { return functions->GetBooleanArrayElements(this, array, isCopy); }  
    917.     jbyte* GetByteArrayElements(jbyteArray array, jboolean* isCopy)  
    918.     { return functions->GetByteArrayElements(this, array, isCopy); }  
    919.     jchar* GetCharArrayElements(jcharArray array, jboolean* isCopy)  
    920.     { return functions->GetCharArrayElements(this, array, isCopy); }  
    921.     jshort* GetShortArrayElements(jshortArray array, jboolean* isCopy)  
    922.     { return functions->GetShortArrayElements(this, array, isCopy); }  
    923.     jint* GetIntArrayElements(jintArray array, jboolean* isCopy)  
    924.     { return functions->GetIntArrayElements(this, array, isCopy); }  
    925.     jlong* GetLongArrayElements(jlongArray array, jboolean* isCopy)  
    926.     { return functions->GetLongArrayElements(this, array, isCopy); }  
    927.     jfloat* GetFloatArrayElements(jfloatArray array, jboolean* isCopy)  
    928.     { return functions->GetFloatArrayElements(this, array, isCopy); }  
    929.     jdouble* GetDoubleArrayElements(jdoubleArray array, jboolean* isCopy)  
    930.     { return functions->GetDoubleArrayElements(this, array, isCopy); }  
    931.   
    932.     void ReleaseBooleanArrayElements(jbooleanArray array, jboolean* elems,  
    933.         jint mode)  
    934.     { functions->ReleaseBooleanArrayElements(this, array, elems, mode); }  
    935.     void ReleaseByteArrayElements(jbyteArray array, jbyte* elems,  
    936.         jint mode)  
    937.     { functions->ReleaseByteArrayElements(this, array, elems, mode); }  
    938.     void ReleaseCharArrayElements(jcharArray array, jchar* elems,  
    939.         jint mode)  
    940.     { functions->ReleaseCharArrayElements(this, array, elems, mode); }  
    941.     void ReleaseShortArrayElements(jshortArray array, jshort* elems,  
    942.         jint mode)  
    943.     { functions->ReleaseShortArrayElements(this, array, elems, mode); }  
    944.     void ReleaseIntArrayElements(jintArray array, jint* elems,  
    945.         jint mode)  
    946.     { functions->ReleaseIntArrayElements(this, array, elems, mode); }  
    947.     void ReleaseLongArrayElements(jlongArray array, jlong* elems,  
    948.         jint mode)  
    949.     { functions->ReleaseLongArrayElements(this, array, elems, mode); }  
    950.     void ReleaseFloatArrayElements(jfloatArray array, jfloat* elems,  
    951.         jint mode)  
    952.     { functions->ReleaseFloatArrayElements(this, array, elems, mode); }  
    953.     void ReleaseDoubleArrayElements(jdoubleArray array, jdouble* elems,  
    954.         jint mode)  
    955.     { functions->ReleaseDoubleArrayElements(this, array, elems, mode); }  
    956.   
    957.     void GetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len,  
    958.         jboolean* buf)  
    959.     { functions->GetBooleanArrayRegion(this, array, start, len, buf); }  
    960.     void GetByteArrayRegion(jbyteArray array, jsize start, jsize len,  
    961.         jbyte* buf)  
    962.     { functions->GetByteArrayRegion(this, array, start, len, buf); }  
    963.     void GetCharArrayRegion(jcharArray array, jsize start, jsize len,  
    964.         jchar* buf)  
    965.     { functions->GetCharArrayRegion(this, array, start, len, buf); }  
    966.     void GetShortArrayRegion(jshortArray array, jsize start, jsize len,  
    967.         jshort* buf)  
    968.     { functions->GetShortArrayRegion(this, array, start, len, buf); }  
    969.     void GetIntArrayRegion(jintArray array, jsize start, jsize len,  
    970.         jint* buf)  
    971.     { functions->GetIntArrayRegion(this, array, start, len, buf); }  
    972.     void GetLongArrayRegion(jlongArray array, jsize start, jsize len,  
    973.         jlong* buf)  
    974.     { functions->GetLongArrayRegion(this, array, start, len, buf); }  
    975.     void GetFloatArrayRegion(jfloatArray array, jsize start, jsize len,  
    976.         jfloat* buf)  
    977.     { functions->GetFloatArrayRegion(this, array, start, len, buf); }  
    978.     void GetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len,  
    979.         jdouble* buf)  
    980.     { functions->GetDoubleArrayRegion(this, array, start, len, buf); }  
    981.   
    982.     void SetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len,  
    983.         const jboolean* buf)  
    984.     { functions->SetBooleanArrayRegion(this, array, start, len, buf); }  
    985.     void SetByteArrayRegion(jbyteArray array, jsize start, jsize len,  
    986.         const jbyte* buf)  
    987.     { functions->SetByteArrayRegion(this, array, start, len, buf); }  
    988.     void SetCharArrayRegion(jcharArray array, jsize start, jsize len,  
    989.         const jchar* buf)  
    990.     { functions->SetCharArrayRegion(this, array, start, len, buf); }  
    991.     void SetShortArrayRegion(jshortArray array, jsize start, jsize len,  
    992.         const jshort* buf)  
    993.     { functions->SetShortArrayRegion(this, array, start, len, buf); }  
    994.     void SetIntArrayRegion(jintArray array, jsize start, jsize len,  
    995.         const jint* buf)  
    996.     { functions->SetIntArrayRegion(this, array, start, len, buf); }  
    997.     void SetLongArrayRegion(jlongArray array, jsize start, jsize len,  
    998.         const jlong* buf)  
    999.     { functions->SetLongArrayRegion(this, array, start, len, buf); }  
    1000.     void SetFloatArrayRegion(jfloatArray array, jsize start, jsize len,  
    1001.         const jfloat* buf)  
    1002.     { functions->SetFloatArrayRegion(this, array, start, len, buf); }  
    1003.     void SetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len,  
    1004.         const jdouble* buf)  
    1005.     { functions->SetDoubleArrayRegion(this, array, start, len, buf); }  
    1006.   
    1007.     jint RegisterNatives(jclass clazz, const JNINativeMethod* methods,  
    1008.         jint nMethods)  
    1009.     { return functions->RegisterNatives(this, clazz, methods, nMethods); }  
    1010.   
    1011.     jint UnregisterNatives(jclass clazz)  
    1012.     { return functions->UnregisterNatives(this, clazz); }  
    1013.   
    1014.     jint MonitorEnter(jobject obj)  
    1015.     { return functions->MonitorEnter(this, obj); }  
    1016.   
    1017.     jint MonitorExit(jobject obj)  
    1018.     { return functions->MonitorExit(this, obj); }  
    1019.   
    1020.     jint GetJavaVM(JavaVM** vm)  
    1021.     { return functions->GetJavaVM(this, vm); }  
    1022.   
    1023.     void GetStringRegion(jstring str, jsize start, jsize len, jchar* buf)  
    1024.     { functions->GetStringRegion(this, str, start, len, buf); }  
    1025.   
    1026.     void GetStringUTFRegion(jstring str, jsize start, jsize len, char* buf)  
    1027.     { return functions->GetStringUTFRegion(this, str, start, len, buf); }  
    1028.   
    1029.     void* GetPrimitiveArrayCritical(jarray array, jboolean* isCopy)  
    1030.     { return functions->GetPrimitiveArrayCritical(this, array, isCopy); }  
    1031.   
    1032.     void ReleasePrimitiveArrayCritical(jarray array, void* carray, jint mode)  
    1033.     { functions->ReleasePrimitiveArrayCritical(this, array, carray, mode); }  
    1034.   
    1035.     const jchar* GetStringCritical(jstring string, jboolean* isCopy)  
    1036.     { return functions->GetStringCritical(this, string, isCopy); }  
    1037.   
    1038.     void ReleaseStringCritical(jstring string, const jchar* carray)  
    1039.     { functions->ReleaseStringCritical(this, string, carray); }  
    1040.   
    1041.     jweak NewWeakGlobalRef(jobject obj)  
    1042.     { return functions->NewWeakGlobalRef(this, obj); }  
    1043.   
    1044.     void DeleteWeakGlobalRef(jweak obj)  
    1045.     { functions->DeleteWeakGlobalRef(this, obj); }  
    1046.   
    1047.     jboolean ExceptionCheck()  
    1048.     { return functions->ExceptionCheck(this); }  
    1049.   
    1050.     jobject NewDirectByteBuffer(void* address, jlong capacity)  
    1051.     { return functions->NewDirectByteBuffer(this, address, capacity); }  
    1052.   
    1053.     void* GetDirectBufferAddress(jobject buf)  
    1054.     { return functions->GetDirectBufferAddress(this, buf); }  
    1055.   
    1056.     jlong GetDirectBufferCapacity(jobject buf)  
    1057.     { return functions->GetDirectBufferCapacity(this, buf); }  
    1058.   
    1059.     /* added in JNI 1.6 */  
    1060.     jobjectRefType GetObjectRefType(jobject obj)  
    1061.     { return functions->GetObjectRefType(this, obj); }  
    1062. #endif /*__cplusplus*/  
    1063. };  
    1064.   
    1065.   
    1066. /* 
    1067.  * JNI invocation interface. 
    1068.  */  
    1069. struct JNIInvokeInterface {  
    1070.     void*       reserved0;  
    1071.     void*       reserved1;  
    1072.     void*       reserved2;  
    1073.   
    1074.     jint        (*DestroyJavaVM)(JavaVM*);  
    1075.     jint        (*AttachCurrentThread)(JavaVM*, JNIEnv**, void*);  
    1076.     jint        (*DetachCurrentThread)(JavaVM*);  
    1077.     jint        (*GetEnv)(JavaVM*, void**, jint);  
    1078.     jint        (*AttachCurrentThreadAsDaemon)(JavaVM*, JNIEnv**, void*);  
    1079. };  
    1080.   
    1081. /* 
    1082.  * C++ version. 
    1083.  */  
    1084. struct _JavaVM {  
    1085.     const struct JNIInvokeInterface* functions;  
    1086.   
    1087. #if defined(__cplusplus)  
    1088.     jint DestroyJavaVM()  
    1089.     { return functions->DestroyJavaVM(this); }  
    1090.     jint AttachCurrentThread(JNIEnv** p_env, void* thr_args)  
    1091.     { return functions->AttachCurrentThread(this, p_env, thr_args); }  
    1092.     jint DetachCurrentThread()  
    1093.     { return functions->DetachCurrentThread(this); }  
    1094.     jint GetEnv(void** env, jint version)  
    1095.     { return functions->GetEnv(this, env, version); }  
    1096.     jint AttachCurrentThreadAsDaemon(JNIEnv** p_env, void* thr_args)  
    1097.     { return functions->AttachCurrentThreadAsDaemon(this, p_env, thr_args); }  
    1098. #endif /*__cplusplus*/  
    1099. };  
    1100.   
    1101. struct JavaVMAttachArgs {  
    1102.     jint        version;    /* must be >= JNI_VERSION_1_2 */  
    1103.     const char* name;       /* NULL or name of thread as modified UTF-8 str */  
    1104.     jobject     group;      /* global ref of a ThreadGroup object, or NULL */  
    1105. };  
    1106. typedef struct JavaVMAttachArgs JavaVMAttachArgs;  
    1107.   
    1108. /* 
    1109.  * JNI 1.2+ initialization.  (As of 1.6, the pre-1.2 structures are no 
    1110.  * longer supported.) 
    1111.  */  
    1112. typedef struct JavaVMOption {  
    1113.     const char* optionString;  
    1114.     void*       extraInfo;  
    1115. } JavaVMOption;  
    1116.   
    1117. typedef struct JavaVMInitArgs {  
    1118.     jint        version;    /* use JNI_VERSION_1_2 or later */  
    1119.   
    1120.     jint        nOptions;  
    1121.     JavaVMOption* options;  
    1122.     jboolean    ignoreUnrecognized;  
    1123. } JavaVMInitArgs;  
    1124.   
    1125. #ifdef __cplusplus  
    1126. extern "C" {  
    1127. #endif  
    1128. /* 
    1129.  * VM initialization functions. 
    1130.  * 
    1131.  * Note these are the only symbols exported for JNI by the VM. 
    1132.  */  
    1133. #if 0  /* In practice, these are not exported by the NDK so don't declare them */  
    1134. jint JNI_GetDefaultJavaVMInitArgs(void*);  
    1135. jint JNI_CreateJavaVM(JavaVM**, JNIEnv**, void*);  
    1136. jint JNI_GetCreatedJavaVMs(JavaVM**, jsize, jsize*);  
    1137. #endif  
    1138.   
    1139. #define JNIIMPORT  
    1140. #define JNIEXPORT  __attribute__ ((visibility ("default")))  
    1141. #define JNICALL __NDK_FPABI__  
    1142.   
    1143. /* 
    1144.  * Prototypes for functions exported by loadable shared libs.  These are 
    1145.  * called by JNI, not provided by JNI. 
    1146.  */  
    1147. JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved);  
    1148. JNIEXPORT void JNICALL JNI_OnUnload(JavaVM* vm, void* reserved);  
    1149.   
    1150. #ifdef __cplusplus  
    1151. }  
    1152. #endif  
    1153.   
    1154.   
    1155. /* 
    1156.  * Manifest constants. 
    1157.  */  
    1158. #define JNI_FALSE   0  
    1159. #define JNI_TRUE    1  
    1160.   
    1161. #define JNI_VERSION_1_1 0x00010001  
    1162. #define JNI_VERSION_1_2 0x00010002  
    1163. #define JNI_VERSION_1_4 0x00010004  
    1164. #define JNI_VERSION_1_6 0x00010006  
    1165.   
    1166. #define JNI_OK          (0)         /* no error */  
    1167. #define JNI_ERR         (-1)        /* generic error */  
    1168. #define JNI_EDETACHED   (-2)        /* thread detached from the VM */  
    1169. #define JNI_EVERSION    (-3)        /* JNI version error */  
    1170.   
    1171. #define JNI_COMMIT      1           /* copy content, do not free buffer */  
    1172. #define JNI_ABORT       2           /* free buffer w/o copying back */  
    1173.   
    1174. #endif  /* JNI_H_ */