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  * JNI specification, as defined by Sun:
18  * http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html
19  *
20  * Everything here is expected to be VM-neutral.
21  */
22 #ifndef JNI_H_
23 #define JNI_H_
24 #include <stdarg.h>
25 #include <stdint.h>
26 /* Primitive types that match up with Java equivalents. */
27 typedef uint8_t  jboolean; /* unsigned 8 bits */
28 typedef int8_t   jbyte;    /* signed 8 bits */
29 typedef uint16_t jchar;    /* unsigned 16 bits */
30 typedef int16_t  jshort;   /* signed 16 bits */
31 typedef int32_t  jint;     /* signed 32 bits */
32 typedef int64_t  jlong;    /* signed 64 bits */
33 typedef float    jfloat;   /* 32-bit IEEE 754 */
34 typedef double   jdouble;  /* 64-bit IEEE 754 */
35 /* "cardinal indices and sizes" */
36 typedef jint     jsize;
37 #ifdef __cplusplus
38 /*
39  * Reference types, in C++
40  */
41 class _jobject {};
42 class _jclass : public _jobject {};
43 class _jstring : public _jobject {};
44 class _jarray : public _jobject {};
45 class _jobjectArray : public _jarray {};
46 class _jbooleanArray : public _jarray {};
47 class _jbyteArray : public _jarray {};
48 class _jcharArray : public _jarray {};
49 class _jshortArray : public _jarray {};
50 class _jintArray : public _jarray {};
51 class _jlongArray : public _jarray {};
52 class _jfloatArray : public _jarray {};
53 class _jdoubleArray : public _jarray {};
54 class _jthrowable : public _jobject {};
55 typedef _jobject*       jobject;
56 typedef _jclass*        jclass;
57 typedef _jstring*       jstring;
58 typedef _jarray*        jarray;
59 typedef _jobjectArray*  jobjectArray;
60 typedef _jbooleanArray* jbooleanArray;
61 typedef _jbyteArray*    jbyteArray;
62 typedef _jcharArray*    jcharArray;
63 typedef _jshortArray*   jshortArray;
64 typedef _jintArray*     jintArray;
65 typedef _jlongArray*    jlongArray;
66 typedef _jfloatArray*   jfloatArray;
67 typedef _jdoubleArray*  jdoubleArray;
68 typedef _jthrowable*    jthrowable;
69 typedef _jobject*       jweak;
70 #else /* not __cplusplus */
71 /*
72  * Reference types, in C.
73  */
74 typedef void*           jobject;
75 typedef jobject         jclass;
76 typedef jobject         jstring;
77 typedef jobject         jarray;
78 typedef jarray          jobjectArray;
79 typedef jarray          jbooleanArray;
80 typedef jarray          jbyteArray;
81 typedef jarray          jcharArray;
82 typedef jarray          jshortArray;
83 typedef jarray          jintArray;
84 typedef jarray          jlongArray;
85 typedef jarray          jfloatArray;
86 typedef jarray          jdoubleArray;
87 typedef jobject         jthrowable;
88 typedef jobject         jweak;
89 #endif /* not __cplusplus */
90 struct _jfieldID;                       /* opaque structure */
91 typedef struct _jfieldID* jfieldID;     /* field IDs */
92 struct _jmethodID;                      /* opaque structure */
93 typedef struct _jmethodID* jmethodID;   /* method IDs */
94 struct JNIInvokeInterface;
95 typedef union jvalue {
96     jboolean    z;
97     jbyte       b;
98     jchar       c;
99     jshort      s;
100     jint        i;
101     jlong       j;
102     jfloat      f;
103     jdouble     d;
104     jobject     l;
105 } jvalue;
106 typedef enum jobjectRefType {
107     JNIInvalidRefType = 0,
108     JNILocalRefType = 1,
109     JNIGlobalRefType = 2,
110     JNIWeakGlobalRefType = 3
111 } jobjectRefType;
112 typedef struct {
113     const char* name;
114     const char* signature;
115     void*       fnPtr;
116 } JNINativeMethod;
117 struct _JNIEnv;
118 struct _JavaVM;
119 typedef const struct JNINativeInterface* C_JNIEnv;
120 #if defined(__cplusplus)
121 typedef _JNIEnv JNIEnv;
122 typedef _JavaVM JavaVM;
123 #else
124 typedef const struct JNINativeInterface* JNIEnv;
125 typedef const struct JNIInvokeInterface* JavaVM;
126 #endif
127 /*
128  * Table of interface function pointers.
129  */
130 struct JNINativeInterface {
131     void*       reserved0;
132     void*       reserved1;
133     void*       reserved2;
134     void*       reserved3;
135     jint        (*GetVersion)(JNIEnv *);
136     jclass      (*DefineClass)(JNIEnv*, const char*, jobject, const jbyte*,
137                         jsize);
138     jclass      (*FindClass)(JNIEnv*, const char*);
139     jmethodID   (*FromReflectedMethod)(JNIEnv*, jobject);
140     jfieldID    (*FromReflectedField)(JNIEnv*, jobject);
141     /* spec doesn't show jboolean parameter */
142     jobject     (*ToReflectedMethod)(JNIEnv*, jclass, jmethodID, jboolean);
143     jclass      (*GetSuperclass)(JNIEnv*, jclass);
144     jboolean    (*IsAssignableFrom)(JNIEnv*, jclass, jclass);
145     /* spec doesn't show jboolean parameter */
146     jobject     (*ToReflectedField)(JNIEnv*, jclass, jfieldID, jboolean);
147     jint        (*Throw)(JNIEnv*, jthrowable);
148     jint        (*ThrowNew)(JNIEnv *, jclass, const char *);
149     jthrowable  (*ExceptionOccurred)(JNIEnv*);
150     void        (*ExceptionDescribe)(JNIEnv*);
151     void        (*ExceptionClear)(JNIEnv*);
152     void        (*FatalError)(JNIEnv*, const char*);
153     jint        (*PushLocalFrame)(JNIEnv*, jint);
154     jobject     (*PopLocalFrame)(JNIEnv*, jobject);
155     jobject     (*NewGlobalRef)(JNIEnv*, jobject);
156     void        (*DeleteGlobalRef)(JNIEnv*, jobject);
157     void        (*DeleteLocalRef)(JNIEnv*, jobject);
158     jboolean    (*IsSameObject)(JNIEnv*, jobject, jobject);
159     jobject     (*NewLocalRef)(JNIEnv*, jobject);
160     jint        (*EnsureLocalCapacity)(JNIEnv*, jint);
161     jobject     (*AllocObject)(JNIEnv*, jclass);
162     jobject     (*NewObject)(JNIEnv*, jclass, jmethodID, ...);
163     jobject     (*NewObjectV)(JNIEnv*, jclass, jmethodID, va_list);
164     jobject     (*NewObjectA)(JNIEnv*, jclass, jmethodID, jvalue*);
165     jclass      (*GetObjectClass)(JNIEnv*, jobject);
166     jboolean    (*IsInstanceOf)(JNIEnv*, jobject, jclass);
167     jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
168     jobject     (*CallObjectMethod)(JNIEnv*, jobject, jmethodID, ...);
169     jobject     (*CallObjectMethodV)(JNIEnv*, jobject, jmethodID, va_list);
170     jobject     (*CallObjectMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
171     jboolean    (*CallBooleanMethod)(JNIEnv*, jobject, jmethodID, ...);
172     jboolean    (*CallBooleanMethodV)(JNIEnv*, jobject, jmethodID, va_list);
173     jboolean    (*CallBooleanMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
174     jbyte       (*CallByteMethod)(JNIEnv*, jobject, jmethodID, ...);
175     jbyte       (*CallByteMethodV)(JNIEnv*, jobject, jmethodID, va_list);
176     jbyte       (*CallByteMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
177     jchar       (*CallCharMethod)(JNIEnv*, jobject, jmethodID, ...);
178     jchar       (*CallCharMethodV)(JNIEnv*, jobject, jmethodID, va_list);
179     jchar       (*CallCharMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
180     jshort      (*CallShortMethod)(JNIEnv*, jobject, jmethodID, ...);
181     jshort      (*CallShortMethodV)(JNIEnv*, jobject, jmethodID, va_list);
182     jshort      (*CallShortMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
183     jint        (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);
184     jint        (*CallIntMethodV)(JNIEnv*, jobject, jmethodID, va_list);
185     jint        (*CallIntMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
186     jlong       (*CallLongMethod)(JNIEnv*, jobject, jmethodID, ...);
187     jlong       (*CallLongMethodV)(JNIEnv*, jobject, jmethodID, va_list);
188     jlong       (*CallLongMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
189     jfloat      (*CallFloatMethod)(JNIEnv*, jobject, jmethodID, ...);
190     jfloat      (*CallFloatMethodV)(JNIEnv*, jobject, jmethodID, va_list);
191     jfloat      (*CallFloatMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
192     jdouble     (*CallDoubleMethod)(JNIEnv*, jobject, jmethodID, ...);
193     jdouble     (*CallDoubleMethodV)(JNIEnv*, jobject, jmethodID, va_list);
194     jdouble     (*CallDoubleMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
195     void        (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
196     void        (*CallVoidMethodV)(JNIEnv*, jobject, jmethodID, va_list);
197     void        (*CallVoidMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
198     jobject     (*CallNonvirtualObjectMethod)(JNIEnv*, jobject, jclass,
199                         jmethodID, ...);
200     jobject     (*CallNonvirtualObjectMethodV)(JNIEnv*, jobject, jclass,
201                         jmethodID, va_list);
202     jobject     (*CallNonvirtualObjectMethodA)(JNIEnv*, jobject, jclass,
203                         jmethodID, jvalue*);
204     jboolean    (*CallNonvirtualBooleanMethod)(JNIEnv*, jobject, jclass,
205                         jmethodID, ...);
206     jboolean    (*CallNonvirtualBooleanMethodV)(JNIEnv*, jobject, jclass,
207                          jmethodID, va_list);
208     jboolean    (*CallNonvirtualBooleanMethodA)(JNIEnv*, jobject, jclass,
209                          jmethodID, jvalue*);
210     jbyte       (*CallNonvirtualByteMethod)(JNIEnv*, jobject, jclass,
211                         jmethodID, ...);
212     jbyte       (*CallNonvirtualByteMethodV)(JNIEnv*, jobject, jclass,
213                         jmethodID, va_list);
214     jbyte       (*CallNonvirtualByteMethodA)(JNIEnv*, jobject, jclass,
215                         jmethodID, jvalue*);
216     jchar       (*CallNonvirtualCharMethod)(JNIEnv*, jobject, jclass,
217                         jmethodID, ...);
218     jchar       (*CallNonvirtualCharMethodV)(JNIEnv*, jobject, jclass,
219                         jmethodID, va_list);
220     jchar       (*CallNonvirtualCharMethodA)(JNIEnv*, jobject, jclass,
221                         jmethodID, jvalue*);
222     jshort      (*CallNonvirtualShortMethod)(JNIEnv*, jobject, jclass,
223                         jmethodID, ...);
224     jshort      (*CallNonvirtualShortMethodV)(JNIEnv*, jobject, jclass,
225                         jmethodID, va_list);
226     jshort      (*CallNonvirtualShortMethodA)(JNIEnv*, jobject, jclass,
227                         jmethodID, jvalue*);
228     jint        (*CallNonvirtualIntMethod)(JNIEnv*, jobject, jclass,
229                         jmethodID, ...);
230     jint        (*CallNonvirtualIntMethodV)(JNIEnv*, jobject, jclass,
231                         jmethodID, va_list);
232     jint        (*CallNonvirtualIntMethodA)(JNIEnv*, jobject, jclass,
233                         jmethodID, jvalue*);
234     jlong       (*CallNonvirtualLongMethod)(JNIEnv*, jobject, jclass,
235                         jmethodID, ...);
236     jlong       (*CallNonvirtualLongMethodV)(JNIEnv*, jobject, jclass,
237                         jmethodID, va_list);
238     jlong       (*CallNonvirtualLongMethodA)(JNIEnv*, jobject, jclass,
239                         jmethodID, jvalue*);
240     jfloat      (*CallNonvirtualFloatMethod)(JNIEnv*, jobject, jclass,
241                         jmethodID, ...);
242     jfloat      (*CallNonvirtualFloatMethodV)(JNIEnv*, jobject, jclass,
243                         jmethodID, va_list);
244     jfloat      (*CallNonvirtualFloatMethodA)(JNIEnv*, jobject, jclass,
245                         jmethodID, jvalue*);
246     jdouble     (*CallNonvirtualDoubleMethod)(JNIEnv*, jobject, jclass,
247                         jmethodID, ...);
248     jdouble     (*CallNonvirtualDoubleMethodV)(JNIEnv*, jobject, jclass,
249                         jmethodID, va_list);
250     jdouble     (*CallNonvirtualDoubleMethodA)(JNIEnv*, jobject, jclass,
251                         jmethodID, jvalue*);
252     void        (*CallNonvirtualVoidMethod)(JNIEnv*, jobject, jclass,
253                         jmethodID, ...);
254     void        (*CallNonvirtualVoidMethodV)(JNIEnv*, jobject, jclass,
255                         jmethodID, va_list);
256     void        (*CallNonvirtualVoidMethodA)(JNIEnv*, jobject, jclass,
257                         jmethodID, jvalue*);
258     jfieldID    (*GetFieldID)(JNIEnv*, jclass, const char*, const char*);
259     jobject     (*GetObjectField)(JNIEnv*, jobject, jfieldID);
260     jboolean    (*GetBooleanField)(JNIEnv*, jobject, jfieldID);
261     jbyte       (*GetByteField)(JNIEnv*, jobject, jfieldID);
262     jchar       (*GetCharField)(JNIEnv*, jobject, jfieldID);
263     jshort      (*GetShortField)(JNIEnv*, jobject, jfieldID);
264     jint        (*GetIntField)(JNIEnv*, jobject, jfieldID);
265     jlong       (*GetLongField)(JNIEnv*, jobject, jfieldID);
266     jfloat      (*GetFloatField)(JNIEnv*, jobject, jfieldID);
267     jdouble     (*GetDoubleField)(JNIEnv*, jobject, jfieldID);
268     void        (*SetObjectField)(JNIEnv*, jobject, jfieldID, jobject);
269     void        (*SetBooleanField)(JNIEnv*, jobject, jfieldID, jboolean);
270     void        (*SetByteField)(JNIEnv*, jobject, jfieldID, jbyte);
271     void        (*SetCharField)(JNIEnv*, jobject, jfieldID, jchar);
272     void        (*SetShortField)(JNIEnv*, jobject, jfieldID, jshort);
273     void        (*SetIntField)(JNIEnv*, jobject, jfieldID, jint);
274     void        (*SetLongField)(JNIEnv*, jobject, jfieldID, jlong);
275     void        (*SetFloatField)(JNIEnv*, jobject, jfieldID, jfloat);
276     void        (*SetDoubleField)(JNIEnv*, jobject, jfieldID, jdouble);
277     jmethodID   (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);
278     jobject     (*CallStaticObjectMethod)(JNIEnv*, jclass, jmethodID, ...);
279     jobject     (*CallStaticObjectMethodV)(JNIEnv*, jclass, jmethodID, va_list);
280     jobject     (*CallStaticObjectMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
281     jboolean    (*CallStaticBooleanMethod)(JNIEnv*, jclass, jmethodID, ...);
282     jboolean    (*CallStaticBooleanMethodV)(JNIEnv*, jclass, jmethodID,
283                         va_list);
284     jboolean    (*CallStaticBooleanMethodA)(JNIEnv*, jclass, jmethodID,
285                         jvalue*);
286     jbyte       (*CallStaticByteMethod)(JNIEnv*, jclass, jmethodID, ...);
287     jbyte       (*CallStaticByteMethodV)(JNIEnv*, jclass, jmethodID, va_list);
288     jbyte       (*CallStaticByteMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
289     jchar       (*CallStaticCharMethod)(JNIEnv*, jclass, jmethodID, ...);
290     jchar       (*CallStaticCharMethodV)(JNIEnv*, jclass, jmethodID, va_list);
291     jchar       (*CallStaticCharMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
292     jshort      (*CallStaticShortMethod)(JNIEnv*, jclass, jmethodID, ...);
293     jshort      (*CallStaticShortMethodV)(JNIEnv*, jclass, jmethodID, va_list);
294     jshort      (*CallStaticShortMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
295     jint        (*CallStaticIntMethod)(JNIEnv*, jclass, jmethodID, ...);
296     jint        (*CallStaticIntMethodV)(JNIEnv*, jclass, jmethodID, va_list);
297     jint        (*CallStaticIntMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
298     jlong       (*CallStaticLongMethod)(JNIEnv*, jclass, jmethodID, ...);
299     jlong       (*CallStaticLongMethodV)(JNIEnv*, jclass, jmethodID, va_list);
300     jlong       (*CallStaticLongMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
301     jfloat      (*CallStaticFloatMethod)(JNIEnv*, jclass, jmethodID, ...);
302     jfloat      (*CallStaticFloatMethodV)(JNIEnv*, jclass, jmethodID, va_list);
303     jfloat      (*CallStaticFloatMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
304     jdouble     (*CallStaticDoubleMethod)(JNIEnv*, jclass, jmethodID, ...);
305     jdouble     (*CallStaticDoubleMethodV)(JNIEnv*, jclass, jmethodID, va_list);
306     jdouble     (*CallStaticDoubleMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
307     void        (*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...);
308     void        (*CallStaticVoidMethodV)(JNIEnv*, jclass, jmethodID, va_list);
309     void        (*CallStaticVoidMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
310     jfieldID    (*GetStaticFieldID)(JNIEnv*, jclass, const char*,
311                         const char*);
312     jobject     (*GetStaticObjectField)(JNIEnv*, jclass, jfieldID);
313     jboolean    (*GetStaticBooleanField)(JNIEnv*, jclass, jfieldID);
314     jbyte       (*GetStaticByteField)(JNIEnv*, jclass, jfieldID);
315     jchar       (*GetStaticCharField)(JNIEnv*, jclass, jfieldID);
316     jshort      (*GetStaticShortField)(JNIEnv*, jclass, jfieldID);
317     jint        (*GetStaticIntField)(JNIEnv*, jclass, jfieldID);
318     jlong       (*GetStaticLongField)(JNIEnv*, jclass, jfieldID);
319     jfloat      (*GetStaticFloatField)(JNIEnv*, jclass, jfieldID);
320     jdouble     (*GetStaticDoubleField)(JNIEnv*, jclass, jfieldID);
321     void        (*SetStaticObjectField)(JNIEnv*, jclass, jfieldID, jobject);
322     void        (*SetStaticBooleanField)(JNIEnv*, jclass, jfieldID, jboolean);
323     void        (*SetStaticByteField)(JNIEnv*, jclass, jfieldID, jbyte);
324     void        (*SetStaticCharField)(JNIEnv*, jclass, jfieldID, jchar);
325     void        (*SetStaticShortField)(JNIEnv*, jclass, jfieldID, jshort);
326     void        (*SetStaticIntField)(JNIEnv*, jclass, jfieldID, jint);
327     void        (*SetStaticLongField)(JNIEnv*, jclass, jfieldID, jlong);
328     void        (*SetStaticFloatField)(JNIEnv*, jclass, jfieldID, jfloat);
329     void        (*SetStaticDoubleField)(JNIEnv*, jclass, jfieldID, jdouble);
330     jstring     (*NewString)(JNIEnv*, const jchar*, jsize);
331     jsize       (*GetStringLength)(JNIEnv*, jstring);
332     const jchar* (*GetStringChars)(JNIEnv*, jstring, jboolean*);
333     void        (*ReleaseStringChars)(JNIEnv*, jstring, const jchar*);
334     jstring     (*NewStringUTF)(JNIEnv*, const char*);
335     jsize       (*GetStringUTFLength)(JNIEnv*, jstring);
336     /* JNI spec says this returns const jbyte*, but that's inconsistent */
337     const char* (*GetStringUTFChars)(JNIEnv*, jstring, jboolean*);
338     void        (*ReleaseStringUTFChars)(JNIEnv*, jstring, const char*);
339     jsize       (*GetArrayLength)(JNIEnv*, jarray);
340     jobjectArray (*NewObjectArray)(JNIEnv*, jsize, jclass, jobject);
341     jobject     (*GetObjectArrayElement)(JNIEnv*, jobjectArray, jsize);
342     void        (*SetObjectArrayElement)(JNIEnv*, jobjectArray, jsize, jobject);
343     jbooleanArray (*NewBooleanArray)(JNIEnv*, jsize);
344     jbyteArray    (*NewByteArray)(JNIEnv*, jsize);
345     jcharArray    (*NewCharArray)(JNIEnv*, jsize);
346     jshortArray   (*NewShortArray)(JNIEnv*, jsize);
347     jintArray     (*NewIntArray)(JNIEnv*, jsize);
348     jlongArray    (*NewLongArray)(JNIEnv*, jsize);
349     jfloatArray   (*NewFloatArray)(JNIEnv*, jsize);
350     jdoubleArray  (*NewDoubleArray)(JNIEnv*, jsize);
351     jboolean*   (*GetBooleanArrayElements)(JNIEnv*, jbooleanArray, jboolean*);
352     jbyte*      (*GetByteArrayElements)(JNIEnv*, jbyteArray, jboolean*);
353     jchar*      (*GetCharArrayElements)(JNIEnv*, jcharArray, jboolean*);
354     jshort*     (*GetShortArrayElements)(JNIEnv*, jshortArray, jboolean*);
355     jint*       (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);
356     jlong*      (*GetLongArrayElements)(JNIEnv*, jlongArray, jboolean*);
357     jfloat*     (*GetFloatArrayElements)(JNIEnv*, jfloatArray, jboolean*);
358     jdouble*    (*GetDoubleArrayElements)(JNIEnv*, jdoubleArray, jboolean*);
359     void        (*ReleaseBooleanArrayElements)(JNIEnv*, jbooleanArray,
360                         jboolean*, jint);
361     void        (*ReleaseByteArrayElements)(JNIEnv*, jbyteArray,
362                         jbyte*, jint);
363     void        (*ReleaseCharArrayElements)(JNIEnv*, jcharArray,
364                         jchar*, jint);
365     void        (*ReleaseShortArrayElements)(JNIEnv*, jshortArray,
366                         jshort*, jint);
367     void        (*ReleaseIntArrayElements)(JNIEnv*, jintArray,
368                         jint*, jint);
369     void        (*ReleaseLongArrayElements)(JNIEnv*, jlongArray,
370                         jlong*, jint);
371     void        (*ReleaseFloatArrayElements)(JNIEnv*, jfloatArray,
372                         jfloat*, jint);
373     void        (*ReleaseDoubleArrayElements)(JNIEnv*, jdoubleArray,
374                         jdouble*, jint);
375     void        (*GetBooleanArrayRegion)(JNIEnv*, jbooleanArray,
376                         jsize, jsize, jboolean*);
377     void        (*GetByteArrayRegion)(JNIEnv*, jbyteArray,
378                         jsize, jsize, jbyte*);
379     void        (*GetCharArrayRegion)(JNIEnv*, jcharArray,
380                         jsize, jsize, jchar*);
381     void        (*GetShortArrayRegion)(JNIEnv*, jshortArray,
382                         jsize, jsize, jshort*);
383     void        (*GetIntArrayRegion)(JNIEnv*, jintArray,
384                         jsize, jsize, jint*);
385     void        (*GetLongArrayRegion)(JNIEnv*, jlongArray,
386                         jsize, jsize, jlong*);
387     void        (*GetFloatArrayRegion)(JNIEnv*, jfloatArray,
388                         jsize, jsize, jfloat*);
389     void        (*GetDoubleArrayRegion)(JNIEnv*, jdoubleArray,
390                         jsize, jsize, jdouble*);
391     /* spec shows these without const; some jni.h do, some don't */
392     void        (*SetBooleanArrayRegion)(JNIEnv*, jbooleanArray,
393                         jsize, jsize, const jboolean*);
394     void        (*SetByteArrayRegion)(JNIEnv*, jbyteArray,
395                         jsize, jsize, const jbyte*);
396     void        (*SetCharArrayRegion)(JNIEnv*, jcharArray,
397                         jsize, jsize, const jchar*);
398     void        (*SetShortArrayRegion)(JNIEnv*, jshortArray,
399                         jsize, jsize, const jshort*);
400     void        (*SetIntArrayRegion)(JNIEnv*, jintArray,
401                         jsize, jsize, const jint*);
402     void        (*SetLongArrayRegion)(JNIEnv*, jlongArray,
403                         jsize, jsize, const jlong*);
404     void        (*SetFloatArrayRegion)(JNIEnv*, jfloatArray,
405                         jsize, jsize, const jfloat*);
406     void        (*SetDoubleArrayRegion)(JNIEnv*, jdoubleArray,
407                         jsize, jsize, const jdouble*);
408     jint        (*RegisterNatives)(JNIEnv*, jclass, const JNINativeMethod*,
409                         jint);
410     jint        (*UnregisterNatives)(JNIEnv*, jclass);
411     jint        (*MonitorEnter)(JNIEnv*, jobject);
412     jint        (*MonitorExit)(JNIEnv*, jobject);
413     jint        (*GetJavaVM)(JNIEnv*, JavaVM**);
414     void        (*GetStringRegion)(JNIEnv*, jstring, jsize, jsize, jchar*);
415     void        (*GetStringUTFRegion)(JNIEnv*, jstring, jsize, jsize, char*);
416     void*       (*GetPrimitiveArrayCritical)(JNIEnv*, jarray, jboolean*);
417     void        (*ReleasePrimitiveArrayCritical)(JNIEnv*, jarray, void*, jint);
418     const jchar* (*GetStringCritical)(JNIEnv*, jstring, jboolean*);
419     void        (*ReleaseStringCritical)(JNIEnv*, jstring, const jchar*);
420     jweak       (*NewWeakGlobalRef)(JNIEnv*, jobject);
421     void        (*DeleteWeakGlobalRef)(JNIEnv*, jweak);
422     jboolean    (*ExceptionCheck)(JNIEnv*);
423     jobject     (*NewDirectByteBuffer)(JNIEnv*, void*, jlong);
424     void*       (*GetDirectBufferAddress)(JNIEnv*, jobject);
425     jlong       (*GetDirectBufferCapacity)(JNIEnv*, jobject);
426     /* added in JNI 1.6 */
427     jobjectRefType (*GetObjectRefType)(JNIEnv*, jobject);
428 };
429 /*
430  * C++ object wrapper.
431  *
432  * This is usually overlaid on a C struct whose first element is a
433  * JNINativeInterface*.  We rely somewhat on compiler behavior.
434  */
435 struct _JNIEnv {
436     /* do not rename this; it does not seem to be entirely opaque */
437     const struct JNINativeInterface* functions;
438 #if defined(__cplusplus)
GetVersion_JNIEnv439     jint GetVersion()
440     { return functions->GetVersion(this); }
DefineClass_JNIEnv441     jclass DefineClass(const char *name, jobject loader, const jbyte* buf,
442         jsize bufLen)
443     { return functions->DefineClass(this, name, loader, buf, bufLen); }
FindClass_JNIEnv444     jclass FindClass(const char* name)
445     { return functions->FindClass(this, name); }
FromReflectedMethod_JNIEnv446     jmethodID FromReflectedMethod(jobject method)
447     { return functions->FromReflectedMethod(this, method); }
FromReflectedField_JNIEnv448     jfieldID FromReflectedField(jobject field)
449     { return functions->FromReflectedField(this, field); }
ToReflectedMethod_JNIEnv450     jobject ToReflectedMethod(jclass cls, jmethodID methodID, jboolean isStatic)
451     { return functions->ToReflectedMethod(this, cls, methodID, isStatic); }
GetSuperclass_JNIEnv452     jclass GetSuperclass(jclass clazz)
453     { return functions->GetSuperclass(this, clazz); }
IsAssignableFrom_JNIEnv454     jboolean IsAssignableFrom(jclass clazz1, jclass clazz2)
455     { return functions->IsAssignableFrom(this, clazz1, clazz2); }
ToReflectedField_JNIEnv456     jobject ToReflectedField(jclass cls, jfieldID fieldID, jboolean isStatic)
457     { return functions->ToReflectedField(this, cls, fieldID, isStatic); }
Throw_JNIEnv458     jint Throw(jthrowable obj)
459     { return functions->Throw(this, obj); }
ThrowNew_JNIEnv460     jint ThrowNew(jclass clazz, const char* message)
461     { return functions->ThrowNew(this, clazz, message); }
ExceptionOccurred_JNIEnv462     jthrowable ExceptionOccurred()
463     { return functions->ExceptionOccurred(this); }
ExceptionDescribe_JNIEnv464     void ExceptionDescribe()
465     { functions->ExceptionDescribe(this); }
ExceptionClear_JNIEnv466     void ExceptionClear()
467     { functions->ExceptionClear(this); }
FatalError_JNIEnv468     void FatalError(const char* msg)
469     { functions->FatalError(this, msg); }
PushLocalFrame_JNIEnv470     jint PushLocalFrame(jint capacity)
471     { return functions->PushLocalFrame(this, capacity); }
PopLocalFrame_JNIEnv472     jobject PopLocalFrame(jobject result)
473     { return functions->PopLocalFrame(this, result); }
NewGlobalRef_JNIEnv474     jobject NewGlobalRef(jobject obj)
475     { return functions->NewGlobalRef(this, obj); }
DeleteGlobalRef_JNIEnv476     void DeleteGlobalRef(jobject globalRef)
477     { functions->DeleteGlobalRef(this, globalRef); }
DeleteLocalRef_JNIEnv478     void DeleteLocalRef(jobject localRef)
479     { functions->DeleteLocalRef(this, localRef); }
IsSameObject_JNIEnv480     jboolean IsSameObject(jobject ref1, jobject ref2)
481     { return functions->IsSameObject(this, ref1, ref2); }
NewLocalRef_JNIEnv482     jobject NewLocalRef(jobject ref)
483     { return functions->NewLocalRef(this, ref); }
EnsureLocalCapacity_JNIEnv484     jint EnsureLocalCapacity(jint capacity)
485     { return functions->EnsureLocalCapacity(this, capacity); }
AllocObject_JNIEnv486     jobject AllocObject(jclass clazz)
487     { return functions->AllocObject(this, clazz); }
NewObject_JNIEnv488     jobject NewObject(jclass clazz, jmethodID methodID, ...)
489     {
490         va_list args;
491         va_start(args, methodID);
492         jobject result = functions->NewObjectV(this, clazz, methodID, args);
493         va_end(args);
494         return result;
495     }
NewObjectV_JNIEnv496     jobject NewObjectV(jclass clazz, jmethodID methodID, va_list args)
497     { return functions->NewObjectV(this, clazz, methodID, args); }
NewObjectA_JNIEnv498     jobject NewObjectA(jclass clazz, jmethodID methodID, jvalue* args)
499     { return functions->NewObjectA(this, clazz, methodID, args); }
GetObjectClass_JNIEnv500     jclass GetObjectClass(jobject obj)
501     { return functions->GetObjectClass(this, obj); }
IsInstanceOf_JNIEnv502     jboolean IsInstanceOf(jobject obj, jclass clazz)
503     { return functions->IsInstanceOf(this, obj, clazz); }
GetMethodID_JNIEnv504     jmethodID GetMethodID(jclass clazz, const char* name, const char* sig)
505     { return functions->GetMethodID(this, clazz, name, sig); }
506 #define CALL_TYPE_METHOD(_jtype, _jname)                                    \
507     _jtype Call##_jname##Method(jobject obj, jmethodID methodID, ...)       \
508     {                                                                       \
509         _jtype result;                                                      \
510         va_list args;                                                       \
511         va_start(args, methodID);                                           \
512         result = functions->Call##_jname##MethodV(this, obj, methodID,      \
513                     args);                                                  \
514         va_end(args);                                                       \
515         return result;                                                      \
516     }
517 #define CALL_TYPE_METHODV(_jtype, _jname)                                   \
518     _jtype Call##_jname##MethodV(jobject obj, jmethodID methodID,           \
519         va_list args)                                                       \
520     { return functions->Call##_jname##MethodV(this, obj, methodID, args); }
521 #define CALL_TYPE_METHODA(_jtype, _jname)                                   \
522     _jtype Call##_jname##MethodA(jobject obj, jmethodID methodID,           \
523         jvalue* args)                                                       \
524     { return functions->Call##_jname##MethodA(this, obj, methodID, args); }
525 #define CALL_TYPE(_jtype, _jname)                                           \
526     CALL_TYPE_METHOD(_jtype, _jname)                                        \
527     CALL_TYPE_METHODV(_jtype, _jname)                                       \
528     CALL_TYPE_METHODA(_jtype, _jname)
CALL_TYPE_JNIEnv529     CALL_TYPE(jobject, Object)
530     CALL_TYPE(jboolean, Boolean)
531     CALL_TYPE(jbyte, Byte)
532     CALL_TYPE(jchar, Char)
533     CALL_TYPE(jshort, Short)
534     CALL_TYPE(jint, Int)
535     CALL_TYPE(jlong, Long)
536     CALL_TYPE(jfloat, Float)
537     CALL_TYPE(jdouble, Double)
538     void CallVoidMethod(jobject obj, jmethodID methodID, ...)
539     {
540         va_list args;
541         va_start(args, methodID);
542         functions->CallVoidMethodV(this, obj, methodID, args);
543         va_end(args);
544     }
CallVoidMethodV_JNIEnv545     void CallVoidMethodV(jobject obj, jmethodID methodID, va_list args)
546     { functions->CallVoidMethodV(this, obj, methodID, args); }
CallVoidMethodA_JNIEnv547     void CallVoidMethodA(jobject obj, jmethodID methodID, jvalue* args)
548     { functions->CallVoidMethodA(this, obj, methodID, args); }
549 #define CALL_NONVIRT_TYPE_METHOD(_jtype, _jname)                            \
550     _jtype CallNonvirtual##_jname##Method(jobject obj, jclass clazz,        \
551         jmethodID methodID, ...)                                            \
552     {                                                                       \
553         _jtype result;                                                      \
554         va_list args;                                                       \
555         va_start(args, methodID);                                           \
556         result = functions->CallNonvirtual##_jname##MethodV(this, obj,      \
557                     clazz, methodID, args);                                 \
558         va_end(args);                                                       \
559         return result;                                                      \
560     }
561 #define CALL_NONVIRT_TYPE_METHODV(_jtype, _jname)                           \
562     _jtype CallNonvirtual##_jname##MethodV(jobject obj, jclass clazz,       \
563         jmethodID methodID, va_list args)                                   \
564     { return functions->CallNonvirtual##_jname##MethodV(this, obj, clazz,   \
565         methodID, args); }
566 #define CALL_NONVIRT_TYPE_METHODA(_jtype, _jname)                           \
567     _jtype CallNonvirtual##_jname##MethodA(jobject obj, jclass clazz,       \
568         jmethodID methodID, jvalue* args)                                   \
569     { return functions->CallNonvirtual##_jname##MethodA(this, obj, clazz,   \
570         methodID, args); }
571 #define CALL_NONVIRT_TYPE(_jtype, _jname)                                   \
572     CALL_NONVIRT_TYPE_METHOD(_jtype, _jname)                                \
573     CALL_NONVIRT_TYPE_METHODV(_jtype, _jname)                               \
574     CALL_NONVIRT_TYPE_METHODA(_jtype, _jname)
CALL_NONVIRT_TYPE_JNIEnv575     CALL_NONVIRT_TYPE(jobject, Object)
576     CALL_NONVIRT_TYPE(jboolean, Boolean)
577     CALL_NONVIRT_TYPE(jbyte, Byte)
578     CALL_NONVIRT_TYPE(jchar, Char)
579     CALL_NONVIRT_TYPE(jshort, Short)
580     CALL_NONVIRT_TYPE(jint, Int)
581     CALL_NONVIRT_TYPE(jlong, Long)
582     CALL_NONVIRT_TYPE(jfloat, Float)
583     CALL_NONVIRT_TYPE(jdouble, Double)
584     void CallNonvirtualVoidMethod(jobject obj, jclass clazz,
585         jmethodID methodID, ...)
586     {
587         va_list args;
588         va_start(args, methodID);
589         functions->CallNonvirtualVoidMethodV(this, obj, clazz, methodID, args);
590         va_end(args);
591     }
CallNonvirtualVoidMethodV_JNIEnv592     void CallNonvirtualVoidMethodV(jobject obj, jclass clazz,
593         jmethodID methodID, va_list args)
594     { functions->CallNonvirtualVoidMethodV(this, obj, clazz, methodID, args); }
CallNonvirtualVoidMethodA_JNIEnv595     void CallNonvirtualVoidMethodA(jobject obj, jclass clazz,
596         jmethodID methodID, jvalue* args)
597     { functions->CallNonvirtualVoidMethodA(this, obj, clazz, methodID, args); }
GetFieldID_JNIEnv598     jfieldID GetFieldID(jclass clazz, const char* name, const char* sig)
599     { return functions->GetFieldID(this, clazz, name, sig); }
GetObjectField_JNIEnv600     jobject GetObjectField(jobject obj, jfieldID fieldID)
601     { return functions->GetObjectField(this, obj, fieldID); }
GetBooleanField_JNIEnv602     jboolean GetBooleanField(jobject obj, jfieldID fieldID)
603     { return functions->GetBooleanField(this, obj, fieldID); }
GetByteField_JNIEnv604     jbyte GetByteField(jobject obj, jfieldID fieldID)
605     { return functions->GetByteField(this, obj, fieldID); }
GetCharField_JNIEnv606     jchar GetCharField(jobject obj, jfieldID fieldID)
607     { return functions->GetCharField(this, obj, fieldID); }
GetShortField_JNIEnv608     jshort GetShortField(jobject obj, jfieldID fieldID)
609     { return functions->GetShortField(this, obj, fieldID); }
GetIntField_JNIEnv610     jint GetIntField(jobject obj, jfieldID fieldID)
611     { return functions->GetIntField(this, obj, fieldID); }
GetLongField_JNIEnv612     jlong GetLongField(jobject obj, jfieldID fieldID)
613     { return functions->GetLongField(this, obj, fieldID); }
GetFloatField_JNIEnv614     jfloat GetFloatField(jobject obj, jfieldID fieldID)
615     { return functions->GetFloatField(this, obj, fieldID); }
GetDoubleField_JNIEnv616     jdouble GetDoubleField(jobject obj, jfieldID fieldID)
617     { return functions->GetDoubleField(this, obj, fieldID); }
SetObjectField_JNIEnv618     void SetObjectField(jobject obj, jfieldID fieldID, jobject value)
619     { functions->SetObjectField(this, obj, fieldID, value); }
SetBooleanField_JNIEnv620     void SetBooleanField(jobject obj, jfieldID fieldID, jboolean value)
621     { functions->SetBooleanField(this, obj, fieldID, value); }
SetByteField_JNIEnv622     void SetByteField(jobject obj, jfieldID fieldID, jbyte value)
623     { functions->SetByteField(this, obj, fieldID, value); }
SetCharField_JNIEnv624     void SetCharField(jobject obj, jfieldID fieldID, jchar value)
625     { functions->SetCharField(this, obj, fieldID, value); }
SetShortField_JNIEnv626     void SetShortField(jobject obj, jfieldID fieldID, jshort value)
627     { functions->SetShortField(this, obj, fieldID, value); }
SetIntField_JNIEnv628     void SetIntField(jobject obj, jfieldID fieldID, jint value)
629     { functions->SetIntField(this, obj, fieldID, value); }
SetLongField_JNIEnv630     void SetLongField(jobject obj, jfieldID fieldID, jlong value)
631     { functions->SetLongField(this, obj, fieldID, value); }
SetFloatField_JNIEnv632     void SetFloatField(jobject obj, jfieldID fieldID, jfloat value)
633     { functions->SetFloatField(this, obj, fieldID, value); }
SetDoubleField_JNIEnv634     void SetDoubleField(jobject obj, jfieldID fieldID, jdouble value)
635     { functions->SetDoubleField(this, obj, fieldID, value); }
GetStaticMethodID_JNIEnv636     jmethodID GetStaticMethodID(jclass clazz, const char* name, const char* sig)
637     { return functions->GetStaticMethodID(this, clazz, name, sig); }
638 #define CALL_STATIC_TYPE_METHOD(_jtype, _jname)                             \
639     _jtype CallStatic##_jname##Method(jclass clazz, jmethodID methodID,     \
640         ...)                                                                \
641     {                                                                       \
642         _jtype result;                                                      \
643         va_list args;                                                       \
644         va_start(args, methodID);                                           \
645         result = functions->CallStatic##_jname##MethodV(this, clazz,        \
646                     methodID, args);                                        \
647         va_end(args);                                                       \
648         return result;                                                      \
649     }
650 #define CALL_STATIC_TYPE_METHODV(_jtype, _jname)                            \
651     _jtype CallStatic##_jname##MethodV(jclass clazz, jmethodID methodID,    \
652         va_list args)                                                       \
653     { return functions->CallStatic##_jname##MethodV(this, clazz, methodID,  \
654         args); }
655 #define CALL_STATIC_TYPE_METHODA(_jtype, _jname)                            \
656     _jtype CallStatic##_jname##MethodA(jclass clazz, jmethodID methodID,    \
657         jvalue* args)                                                       \
658     { return functions->CallStatic##_jname##MethodA(this, clazz, methodID,  \
659         args); }
660 #define CALL_STATIC_TYPE(_jtype, _jname)                                    \
661     CALL_STATIC_TYPE_METHOD(_jtype, _jname)                                 \
662     CALL_STATIC_TYPE_METHODV(_jtype, _jname)                                \
663     CALL_STATIC_TYPE_METHODA(_jtype, _jname)
CALL_STATIC_TYPE_JNIEnv664     CALL_STATIC_TYPE(jobject, Object)
665     CALL_STATIC_TYPE(jboolean, Boolean)
666     CALL_STATIC_TYPE(jbyte, Byte)
667     CALL_STATIC_TYPE(jchar, Char)
668     CALL_STATIC_TYPE(jshort, Short)
669     CALL_STATIC_TYPE(jint, Int)
670     CALL_STATIC_TYPE(jlong, Long)
671     CALL_STATIC_TYPE(jfloat, Float)
672     CALL_STATIC_TYPE(jdouble, Double)
673     void CallStaticVoidMethod(jclass clazz, jmethodID methodID, ...)
674     {
675         va_list args;
676         va_start(args, methodID);
677         functions->CallStaticVoidMethodV(this, clazz, methodID, args);
678         va_end(args);
679     }
CallStaticVoidMethodV_JNIEnv680     void CallStaticVoidMethodV(jclass clazz, jmethodID methodID, va_list args)
681     { functions->CallStaticVoidMethodV(this, clazz, methodID, args); }
CallStaticVoidMethodA_JNIEnv682     void CallStaticVoidMethodA(jclass clazz, jmethodID methodID, jvalue* args)
683     { functions->CallStaticVoidMethodA(this, clazz, methodID, args); }
GetStaticFieldID_JNIEnv684     jfieldID GetStaticFieldID(jclass clazz, const char* name, const char* sig)
685     { return functions->GetStaticFieldID(this, clazz, name, sig); }
GetStaticObjectField_JNIEnv686     jobject GetStaticObjectField(jclass clazz, jfieldID fieldID)
687     { return functions->GetStaticObjectField(this, clazz, fieldID); }
GetStaticBooleanField_JNIEnv688     jboolean GetStaticBooleanField(jclass clazz, jfieldID fieldID)
689     { return functions->GetStaticBooleanField(this, clazz, fieldID); }
GetStaticByteField_JNIEnv690     jbyte GetStaticByteField(jclass clazz, jfieldID fieldID)
691     { return functions->GetStaticByteField(this, clazz, fieldID); }
GetStaticCharField_JNIEnv692     jchar GetStaticCharField(jclass clazz, jfieldID fieldID)
693     { return functions->GetStaticCharField(this, clazz, fieldID); }
GetStaticShortField_JNIEnv694     jshort GetStaticShortField(jclass clazz, jfieldID fieldID)
695     { return functions->GetStaticShortField(this, clazz, fieldID); }
GetStaticIntField_JNIEnv696     jint GetStaticIntField(jclass clazz, jfieldID fieldID)
697     { return functions->GetStaticIntField(this, clazz, fieldID); }
GetStaticLongField_JNIEnv698     jlong GetStaticLongField(jclass clazz, jfieldID fieldID)
699     { return functions->GetStaticLongField(this, clazz, fieldID); }
GetStaticFloatField_JNIEnv700     jfloat GetStaticFloatField(jclass clazz, jfieldID fieldID)
701     { return functions->GetStaticFloatField(this, clazz, fieldID); }
GetStaticDoubleField_JNIEnv702     jdouble GetStaticDoubleField(jclass clazz, jfieldID fieldID)
703     { return functions->GetStaticDoubleField(this, clazz, fieldID); }
SetStaticObjectField_JNIEnv704     void SetStaticObjectField(jclass clazz, jfieldID fieldID, jobject value)
705     { functions->SetStaticObjectField(this, clazz, fieldID, value); }
SetStaticBooleanField_JNIEnv706     void SetStaticBooleanField(jclass clazz, jfieldID fieldID, jboolean value)
707     { functions->SetStaticBooleanField(this, clazz, fieldID, value); }
SetStaticByteField_JNIEnv708     void SetStaticByteField(jclass clazz, jfieldID fieldID, jbyte value)
709     { functions->SetStaticByteField(this, clazz, fieldID, value); }
SetStaticCharField_JNIEnv710     void SetStaticCharField(jclass clazz, jfieldID fieldID, jchar value)
711     { functions->SetStaticCharField(this, clazz, fieldID, value); }
SetStaticShortField_JNIEnv712     void SetStaticShortField(jclass clazz, jfieldID fieldID, jshort value)
713     { functions->SetStaticShortField(this, clazz, fieldID, value); }
SetStaticIntField_JNIEnv714     void SetStaticIntField(jclass clazz, jfieldID fieldID, jint value)
715     { functions->SetStaticIntField(this, clazz, fieldID, value); }
SetStaticLongField_JNIEnv716     void SetStaticLongField(jclass clazz, jfieldID fieldID, jlong value)
717     { functions->SetStaticLongField(this, clazz, fieldID, value); }
SetStaticFloatField_JNIEnv718     void SetStaticFloatField(jclass clazz, jfieldID fieldID, jfloat value)
719     { functions->SetStaticFloatField(this, clazz, fieldID, value); }
SetStaticDoubleField_JNIEnv720     void SetStaticDoubleField(jclass clazz, jfieldID fieldID, jdouble value)
721     { functions->SetStaticDoubleField(this, clazz, fieldID, value); }
NewString_JNIEnv722     jstring NewString(const jchar* unicodeChars, jsize len)
723     { return functions->NewString(this, unicodeChars, len); }
GetStringLength_JNIEnv724     jsize GetStringLength(jstring string)
725     { return functions->GetStringLength(this, string); }
GetStringChars_JNIEnv726     const jchar* GetStringChars(jstring string, jboolean* isCopy)
727     { return functions->GetStringChars(this, string, isCopy); }
ReleaseStringChars_JNIEnv728     void ReleaseStringChars(jstring string, const jchar* chars)
729     { functions->ReleaseStringChars(this, string, chars); }
NewStringUTF_JNIEnv730     jstring NewStringUTF(const char* bytes)
731     { return functions->NewStringUTF(this, bytes); }
GetStringUTFLength_JNIEnv732     jsize GetStringUTFLength(jstring string)
733     { return functions->GetStringUTFLength(this, string); }
GetStringUTFChars_JNIEnv734     const char* GetStringUTFChars(jstring string, jboolean* isCopy)
735     { return functions->GetStringUTFChars(this, string, isCopy); }
ReleaseStringUTFChars_JNIEnv736     void ReleaseStringUTFChars(jstring string, const char* utf)
737     { functions->ReleaseStringUTFChars(this, string, utf); }
GetArrayLength_JNIEnv738     jsize GetArrayLength(jarray array)
739     { return functions->GetArrayLength(this, array); }
NewObjectArray_JNIEnv740     jobjectArray NewObjectArray(jsize length, jclass elementClass,
741         jobject initialElement)
742     { return functions->NewObjectArray(this, length, elementClass,
743         initialElement); }
GetObjectArrayElement_JNIEnv744     jobject GetObjectArrayElement(jobjectArray array, jsize index)
745     { return functions->GetObjectArrayElement(this, array, index); }
SetObjectArrayElement_JNIEnv746     void SetObjectArrayElement(jobjectArray array, jsize index, jobject value)
747     { functions->SetObjectArrayElement(this, array, index, value); }
NewBooleanArray_JNIEnv748     jbooleanArray NewBooleanArray(jsize length)
749     { return functions->NewBooleanArray(this, length); }
NewByteArray_JNIEnv750     jbyteArray NewByteArray(jsize length)
751     { return functions->NewByteArray(this, length); }
NewCharArray_JNIEnv752     jcharArray NewCharArray(jsize length)
753     { return functions->NewCharArray(this, length); }
NewShortArray_JNIEnv754     jshortArray NewShortArray(jsize length)
755     { return functions->NewShortArray(this, length); }
NewIntArray_JNIEnv756     jintArray NewIntArray(jsize length)
757     { return functions->NewIntArray(this, length); }
NewLongArray_JNIEnv758     jlongArray NewLongArray(jsize length)
759     { return functions->NewLongArray(this, length); }
NewFloatArray_JNIEnv760     jfloatArray NewFloatArray(jsize length)
761     { return functions->NewFloatArray(this, length); }
NewDoubleArray_JNIEnv762     jdoubleArray NewDoubleArray(jsize length)
763     { return functions->NewDoubleArray(this, length); }
GetBooleanArrayElements_JNIEnv764     jboolean* GetBooleanArrayElements(jbooleanArray array, jboolean* isCopy)
765     { return functions->GetBooleanArrayElements(this, array, isCopy); }
GetByteArrayElements_JNIEnv766     jbyte* GetByteArrayElements(jbyteArray array, jboolean* isCopy)
767     { return functions->GetByteArrayElements(this, array, isCopy); }
GetCharArrayElements_JNIEnv768     jchar* GetCharArrayElements(jcharArray array, jboolean* isCopy)
769     { return functions->GetCharArrayElements(this, array, isCopy); }
GetShortArrayElements_JNIEnv770     jshort* GetShortArrayElements(jshortArray array, jboolean* isCopy)
771     { return functions->GetShortArrayElements(this, array, isCopy); }
GetIntArrayElements_JNIEnv772     jint* GetIntArrayElements(jintArray array, jboolean* isCopy)
773     { return functions->GetIntArrayElements(this, array, isCopy); }
GetLongArrayElements_JNIEnv774     jlong* GetLongArrayElements(jlongArray array, jboolean* isCopy)
775     { return functions->GetLongArrayElements(this, array, isCopy); }
GetFloatArrayElements_JNIEnv776     jfloat* GetFloatArrayElements(jfloatArray array, jboolean* isCopy)
777     { return functions->GetFloatArrayElements(this, array, isCopy); }
GetDoubleArrayElements_JNIEnv778     jdouble* GetDoubleArrayElements(jdoubleArray array, jboolean* isCopy)
779     { return functions->GetDoubleArrayElements(this, array, isCopy); }
ReleaseBooleanArrayElements_JNIEnv780     void ReleaseBooleanArrayElements(jbooleanArray array, jboolean* elems,
781         jint mode)
782     { functions->ReleaseBooleanArrayElements(this, array, elems, mode); }
ReleaseByteArrayElements_JNIEnv783     void ReleaseByteArrayElements(jbyteArray array, jbyte* elems,
784         jint mode)
785     { functions->ReleaseByteArrayElements(this, array, elems, mode); }
ReleaseCharArrayElements_JNIEnv786     void ReleaseCharArrayElements(jcharArray array, jchar* elems,
787         jint mode)
788     { functions->ReleaseCharArrayElements(this, array, elems, mode); }
ReleaseShortArrayElements_JNIEnv789     void ReleaseShortArrayElements(jshortArray array, jshort* elems,
790         jint mode)
791     { functions->ReleaseShortArrayElements(this, array, elems, mode); }
ReleaseIntArrayElements_JNIEnv792     void ReleaseIntArrayElements(jintArray array, jint* elems,
793         jint mode)
794     { functions->ReleaseIntArrayElements(this, array, elems, mode); }
ReleaseLongArrayElements_JNIEnv795     void ReleaseLongArrayElements(jlongArray array, jlong* elems,
796         jint mode)
797     { functions->ReleaseLongArrayElements(this, array, elems, mode); }
ReleaseFloatArrayElements_JNIEnv798     void ReleaseFloatArrayElements(jfloatArray array, jfloat* elems,
799         jint mode)
800     { functions->ReleaseFloatArrayElements(this, array, elems, mode); }
ReleaseDoubleArrayElements_JNIEnv801     void ReleaseDoubleArrayElements(jdoubleArray array, jdouble* elems,
802         jint mode)
803     { functions->ReleaseDoubleArrayElements(this, array, elems, mode); }
GetBooleanArrayRegion_JNIEnv804     void GetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len,
805         jboolean* buf)
806     { functions->GetBooleanArrayRegion(this, array, start, len, buf); }
GetByteArrayRegion_JNIEnv807     void GetByteArrayRegion(jbyteArray array, jsize start, jsize len,
808         jbyte* buf)
809     { functions->GetByteArrayRegion(this, array, start, len, buf); }
GetCharArrayRegion_JNIEnv810     void GetCharArrayRegion(jcharArray array, jsize start, jsize len,
811         jchar* buf)
812     { functions->GetCharArrayRegion(this, array, start, len, buf); }
GetShortArrayRegion_JNIEnv813     void GetShortArrayRegion(jshortArray array, jsize start, jsize len,
814         jshort* buf)
815     { functions->GetShortArrayRegion(this, array, start, len, buf); }
GetIntArrayRegion_JNIEnv816     void GetIntArrayRegion(jintArray array, jsize start, jsize len,
817         jint* buf)
818     { functions->GetIntArrayRegion(this, array, start, len, buf); }
GetLongArrayRegion_JNIEnv819     void GetLongArrayRegion(jlongArray array, jsize start, jsize len,
820         jlong* buf)
821     { functions->GetLongArrayRegion(this, array, start, len, buf); }
GetFloatArrayRegion_JNIEnv822     void GetFloatArrayRegion(jfloatArray array, jsize start, jsize len,
823         jfloat* buf)
824     { functions->GetFloatArrayRegion(this, array, start, len, buf); }
GetDoubleArrayRegion_JNIEnv825     void GetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len,
826         jdouble* buf)
827     { functions->GetDoubleArrayRegion(this, array, start, len, buf); }
SetBooleanArrayRegion_JNIEnv828     void SetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len,
829         const jboolean* buf)
830     { functions->SetBooleanArrayRegion(this, array, start, len, buf); }
SetByteArrayRegion_JNIEnv831     void SetByteArrayRegion(jbyteArray array, jsize start, jsize len,
832         const jbyte* buf)
833     { functions->SetByteArrayRegion(this, array, start, len, buf); }
SetCharArrayRegion_JNIEnv834     void SetCharArrayRegion(jcharArray array, jsize start, jsize len,
835         const jchar* buf)
836     { functions->SetCharArrayRegion(this, array, start, len, buf); }
SetShortArrayRegion_JNIEnv837     void SetShortArrayRegion(jshortArray array, jsize start, jsize len,
838         const jshort* buf)
839     { functions->SetShortArrayRegion(this, array, start, len, buf); }
SetIntArrayRegion_JNIEnv840     void SetIntArrayRegion(jintArray array, jsize start, jsize len,
841         const jint* buf)
842     { functions->SetIntArrayRegion(this, array, start, len, buf); }
SetLongArrayRegion_JNIEnv843     void SetLongArrayRegion(jlongArray array, jsize start, jsize len,
844         const jlong* buf)
845     { functions->SetLongArrayRegion(this, array, start, len, buf); }
SetFloatArrayRegion_JNIEnv846     void SetFloatArrayRegion(jfloatArray array, jsize start, jsize len,
847         const jfloat* buf)
848     { functions->SetFloatArrayRegion(this, array, start, len, buf); }
SetDoubleArrayRegion_JNIEnv849     void SetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len,
850         const jdouble* buf)
851     { functions->SetDoubleArrayRegion(this, array, start, len, buf); }
RegisterNatives_JNIEnv852     jint RegisterNatives(jclass clazz, const JNINativeMethod* methods,
853         jint nMethods)
854     { return functions->RegisterNatives(this, clazz, methods, nMethods); }
UnregisterNatives_JNIEnv855     jint UnregisterNatives(jclass clazz)
856     { return functions->UnregisterNatives(this, clazz); }
MonitorEnter_JNIEnv857     jint MonitorEnter(jobject obj)
858     { return functions->MonitorEnter(this, obj); }
MonitorExit_JNIEnv859     jint MonitorExit(jobject obj)
860     { return functions->MonitorExit(this, obj); }
GetJavaVM_JNIEnv861     jint GetJavaVM(JavaVM** vm)
862     { return functions->GetJavaVM(this, vm); }
GetStringRegion_JNIEnv863     void GetStringRegion(jstring str, jsize start, jsize len, jchar* buf)
864     { functions->GetStringRegion(this, str, start, len, buf); }
GetStringUTFRegion_JNIEnv865     void GetStringUTFRegion(jstring str, jsize start, jsize len, char* buf)
866     { return functions->GetStringUTFRegion(this, str, start, len, buf); }
GetPrimitiveArrayCritical_JNIEnv867     void* GetPrimitiveArrayCritical(jarray array, jboolean* isCopy)
868     { return functions->GetPrimitiveArrayCritical(this, array, isCopy); }
ReleasePrimitiveArrayCritical_JNIEnv869     void ReleasePrimitiveArrayCritical(jarray array, void* carray, jint mode)
870     { functions->ReleasePrimitiveArrayCritical(this, array, carray, mode); }
GetStringCritical_JNIEnv871     const jchar* GetStringCritical(jstring string, jboolean* isCopy)
872     { return functions->GetStringCritical(this, string, isCopy); }
ReleaseStringCritical_JNIEnv873     void ReleaseStringCritical(jstring string, const jchar* carray)
874     { functions->ReleaseStringCritical(this, string, carray); }
NewWeakGlobalRef_JNIEnv875     jweak NewWeakGlobalRef(jobject obj)
876     { return functions->NewWeakGlobalRef(this, obj); }
DeleteWeakGlobalRef_JNIEnv877     void DeleteWeakGlobalRef(jweak obj)
878     { functions->DeleteWeakGlobalRef(this, obj); }
ExceptionCheck_JNIEnv879     jboolean ExceptionCheck()
880     { return functions->ExceptionCheck(this); }
NewDirectByteBuffer_JNIEnv881     jobject NewDirectByteBuffer(void* address, jlong capacity)
882     { return functions->NewDirectByteBuffer(this, address, capacity); }
GetDirectBufferAddress_JNIEnv883     void* GetDirectBufferAddress(jobject buf)
884     { return functions->GetDirectBufferAddress(this, buf); }
GetDirectBufferCapacity_JNIEnv885     jlong GetDirectBufferCapacity(jobject buf)
886     { return functions->GetDirectBufferCapacity(this, buf); }
887     /* added in JNI 1.6 */
GetObjectRefType_JNIEnv888     jobjectRefType GetObjectRefType(jobject obj)
889     { return functions->GetObjectRefType(this, obj); }
890 #endif /*__cplusplus*/
891 };
892 /*
893  * JNI invocation interface.
894  */
895 struct JNIInvokeInterface {
896     void*       reserved0;
897     void*       reserved1;
898     void*       reserved2;
899     jint        (*DestroyJavaVM)(JavaVM*);
900     jint        (*AttachCurrentThread)(JavaVM*, JNIEnv**, void*);
901     jint        (*DetachCurrentThread)(JavaVM*);
902     jint        (*GetEnv)(JavaVM*, void**, jint);
903     jint        (*AttachCurrentThreadAsDaemon)(JavaVM*, JNIEnv**, void*);
904 };
905 /*
906  * C++ version.
907  */
908 struct _JavaVM {
909     const struct JNIInvokeInterface* functions;
910 #if defined(__cplusplus)
DestroyJavaVM_JavaVM911     jint DestroyJavaVM()
912     { return functions->DestroyJavaVM(this); }
AttachCurrentThread_JavaVM913     jint AttachCurrentThread(JNIEnv** p_env, void* thr_args)
914     { return functions->AttachCurrentThread(this, p_env, thr_args); }
DetachCurrentThread_JavaVM915     jint DetachCurrentThread()
916     { return functions->DetachCurrentThread(this); }
GetEnv_JavaVM917     jint GetEnv(void** env, jint version)
918     { return functions->GetEnv(this, env, version); }
AttachCurrentThreadAsDaemon_JavaVM919     jint AttachCurrentThreadAsDaemon(JNIEnv** p_env, void* thr_args)
920     { return functions->AttachCurrentThreadAsDaemon(this, p_env, thr_args); }
921 #endif /*__cplusplus*/
922 };
923 struct JavaVMAttachArgs {
924     jint        version;    /* must be >= JNI_VERSION_1_2 */
925     const char* name;       /* NULL or name of thread as modified UTF-8 str */
926     jobject     group;      /* global ref of a ThreadGroup object, or NULL */
927 };
928 typedef struct JavaVMAttachArgs JavaVMAttachArgs;
929 /*
930  * JNI 1.2+ initialization.  (As of 1.6, the pre-1.2 structures are no
931  * longer supported.)
932  */
933 typedef struct JavaVMOption {
934     const char* optionString;
935     void*       extraInfo;
936 } JavaVMOption;
937 typedef struct JavaVMInitArgs {
938     jint        version;    /* use JNI_VERSION_1_2 or later */
939     jint        nOptions;
940     JavaVMOption* options;
941     jboolean    ignoreUnrecognized;
942 } JavaVMInitArgs;
943 #ifdef __cplusplus
944 extern "C" {
945 #endif
946 /*
947  * VM initialization functions.
948  *
949  * Note these are the only symbols exported for JNI by the VM.
950  */
951 jint JNI_GetDefaultJavaVMInitArgs(void*);
952 jint JNI_CreateJavaVM(JavaVM**, JNIEnv**, void*);
953 jint JNI_GetCreatedJavaVMs(JavaVM**, jsize, jsize*);
954 #define JNIIMPORT
955 #ifdef _WIN32
956 #define JNIEXPORT // Not from Android, added for compatibility with Windows // __declspec(dllexport) not used because we use a .def
957 #else
958 #define JNIEXPORT  __attribute__ ((visibility ("default")))
959 #endif
960 #define JNICALL
961 /*
962  * Prototypes for functions exported by loadable shared libs.  These are
963  * called by JNI, not provided by JNI.
964  */
965 JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved);
966 JNIEXPORT void JNI_OnUnload(JavaVM* vm, void* reserved);
967 #ifdef __cplusplus
968 }
969 #endif
970 /*
971  * Manifest constants.
972  */
973 #define JNI_FALSE   0
974 #define JNI_TRUE    1
975 #define JNI_VERSION_1_1 0x00010001
976 #define JNI_VERSION_1_2 0x00010002
977 #define JNI_VERSION_1_4 0x00010004
978 #define JNI_VERSION_1_6 0x00010006
979 #define JNI_OK          (0)         /* no error */
980 #define JNI_ERR         (-1)        /* generic error */
981 #define JNI_EDETACHED   (-2)        /* thread detached from the VM */
982 #define JNI_EVERSION    (-3)        /* JNI version error */
983 #define JNI_COMMIT      1           /* copy content, do not free buffer */
984 #define JNI_ABORT       2           /* free buffer w/o copying back */
985 #endif  /* JNI_H_ */
986