GNU header update.
[cacao.git] / src / native / jni.h
1 /* native/jni.h - JNI types and data structures
2
3    Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4    R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5    C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6    Institut f. Computersprachen - TU Wien
7
8    This file is part of CACAO.
9
10    This program is free software; you can redistribute it and/or
11    modify it under the terms of the GNU General Public License as
12    published by the Free Software Foundation; either version 2, or (at
13    your option) any later version.
14
15    This program is distributed in the hope that it will be useful, but
16    WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18    General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, write to the Free Software
22    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
23    02111-1307, USA.
24
25    Contact: cacao@complang.tuwien.ac.at
26
27    Authors: ?
28
29    $Id: jni.h 1735 2004-12-07 14:33:27Z twisti $
30
31 */
32
33
34 #ifndef _JNI_H
35 #define _JNI_H
36
37 #include <stdarg.h>
38
39 #include "types.h"
40 #include "vm/global.h"
41
42
43 #define JNI_VERSION       0x00010002
44
45 #define JNIEXPORT
46 #define JNICALL
47
48
49 /* JNI datatypes */
50
51 #define jobject         java_objectheader*
52 #define jclass          struct classinfo*
53 #define jthrowable      jobject
54 #define jweak           jobject
55 #define jarray          java_arrayheader*
56 #define jlongArray      java_longarray*
57 #define jbooleanArray   java_booleanarray*
58 #define jintArray       java_intarray*
59 #define jcharArray      java_chararray*
60 #define jbyteArray      java_bytearray*
61 #define jshortArray     java_shortarray*
62 #define jdoubleArray    java_doublearray*
63 #define jfloatArray     java_floatarray*
64 #define jobjectArray    java_objectarray*
65 #define jstring         jobject
66 #define jint            s4
67 #define jchar           s2
68 #define jboolean        u1
69 #define jbyte           s1
70 #define jshort          s2
71 #define jlong           s8
72 #define jfloat          float
73 #define jdouble         double
74 #define jsize           jint
75 #define jfieldID        fieldinfo*
76 #define jmethodID       methodinfo*     
77
78
79 typedef struct _JavaVM* JavaVM;
80
81 struct _JavaVM{
82    void *(*reserved0) ();
83    void *(*reserved1) ();
84    void *(*reserved2) ();
85    jint (*DestroyJavaVM) (JavaVM *);
86    jint (*AttachCurrentThread) (JavaVM *, void **, void *);
87    jint (*DetachCurrentThread) (JavaVM *);
88    jint (*GetEnv) (JavaVM *, void **, jint);
89    jint (*AttachCurrentThreadAsDaemon) (JavaVM *, void **, void *);
90
91 };
92
93
94 typedef union jvalue {
95     jboolean z;
96     jbyte    b;
97     jchar    c;
98     jshort   s;
99     jint     i;
100     jlong    j;
101     jfloat   f;
102     jdouble  d;
103     jobject  l;
104 } jvalue;
105
106 /* JNI-Boolean */
107
108 #define JNI_FALSE 0
109 #define JNI_TRUE  1
110
111 /* native method name, signature and function pointer for use in RegisterNatives */
112
113 typedef struct {
114     char *name;
115     char *signature;
116     void *fnPtr;
117 } JNINativeMethod;
118
119
120 /* 
121         JNI function table, contains functions for the following usages:        
122         
123         Version Information 
124         Class Operations 
125         Exceptions 
126         Global and Local References 
127         Object Operations 
128         Accessing Fields of Objects 
129         Calling Instance Methods 
130         Accessing Static Fields 
131         Calling Static Methods 
132         String Operations 
133         Array Operations 
134         Registering Native Methods 
135         Monitor Operations 
136         Java VM Interface 
137 */
138
139 typedef struct JNI_Table *JNIEnv;
140
141 struct JNI_Table {
142     
143     /* reserverd for future JNI-functions */
144     void *unused0;
145     void *unused1;
146     void *unused2;
147     void *unused3;
148     
149     /* version information */
150     
151     jint (*GetVersion) (JNIEnv*);
152
153     /* class operations */
154
155     jclass (*DefineClass) (JNIEnv*, const char *name, jobject loader, const jbyte *buf, jsize len);
156     jclass (*FindClass) (JNIEnv*, const char *name);
157
158     jmethodID (*FromReflectedMethod) (JNIEnv*, jobject method);
159     jfieldID (*FromReflectedField) (JNIEnv*, jobject field);
160
161     jobject (*ToReflectedMethod) (JNIEnv*, jclass cls, jmethodID methodID, jboolean isStatic);
162
163     jclass (*GetSuperclass) (JNIEnv*, jclass sub);
164     jboolean (*IsAssignableForm) (JNIEnv*, jclass sub, jclass sup);
165
166     jobject (*ToReflectedField) (JNIEnv*, jclass cls, jfieldID fieldID, jboolean isStatic);
167
168     /* exceptions */ 
169
170     jint (*Throw) (JNIEnv*, jthrowable obj);
171     jint (*ThrowNew) (JNIEnv*, jclass clazz, const char *msg);
172     jthrowable (*ExceptionOccurred) (JNIEnv*);
173     void (*ExceptionDescribe) (JNIEnv*);
174     void (*ExceptionClear) (JNIEnv*);
175     void (*FatalError) (JNIEnv*, const char *msg);
176
177     /* global and local references */
178
179     jint (*PushLocalFrame) (JNIEnv*, jint capacity);
180     jobject (*PopLocalFrame) (JNIEnv*, jobject result);
181     
182     jobject (*NewGlobalRef) (JNIEnv*, jobject lobj);
183     void (*DeleteGlobalRef) (JNIEnv*, jobject gref);
184     void (*DeleteLocalRef) (JNIEnv*, jobject obj);
185     jboolean (*IsSameObject) (JNIEnv*, jobject obj1, jobject obj2);
186     jobject (*NewLocalRef) (JNIEnv*, jobject ref);
187     jint (*EnsureLocalCapacity) (JNIEnv*, jint capacity);
188
189     /* object operations */ 
190
191     jobject (*AllocObject) (JNIEnv*, jclass clazz);
192     jobject (*NewObject) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
193     jobject (*NewObjectV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
194     jobject (*NewObjectA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
195
196     jclass (*GetObjectClass) (JNIEnv*, jobject obj);
197     jboolean (*IsInstanceOf) (JNIEnv*, jobject obj, jclass clazz);
198
199     jmethodID (*GetMethodID) (JNIEnv*, jclass clazz, const char *name, const char *sig);
200
201     /* calling instance methods */ 
202
203     jobject (*CallObjectMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
204     jobject (*CallObjectMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
205     jobject (*CallObjectMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue * args);
206
207     jboolean (*CallBooleanMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
208     jboolean (*CallBooleanMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
209     jboolean (*CallBooleanMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue * args);
210
211     jbyte (*CallByteMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
212     jbyte (*CallByteMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
213     jbyte (*CallByteMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
214
215     jchar (*CallCharMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
216     jchar (*CallCharMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
217     jchar (*CallCharMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
218
219     jshort (*CallShortMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
220     jshort (*CallShortMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
221     jshort (*CallShortMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
222
223     jint (*CallIntMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
224     jint (*CallIntMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
225     jint (*CallIntMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
226
227     jlong (*CallLongMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
228     jlong (*CallLongMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
229     jlong (*CallLongMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
230
231     jfloat (*CallFloatMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
232     jfloat (*CallFloatMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
233     jfloat (*CallFloatMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
234
235     jdouble (*CallDoubleMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
236     jdouble (*CallDoubleMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
237     jdouble (*CallDoubleMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
238
239     void (*CallVoidMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
240     void (*CallVoidMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
241     void (*CallVoidMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue * args);
242
243     jobject (*CallNonvirtualObjectMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
244     jobject (*CallNonvirtualObjectMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
245     jobject (*CallNonvirtualObjectMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue * args);
246
247     jboolean (*CallNonvirtualBooleanMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
248     jboolean (*CallNonvirtualBooleanMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
249     jboolean (*CallNonvirtualBooleanMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue * args);
250
251     jbyte (*CallNonvirtualByteMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
252     jbyte (*CallNonvirtualByteMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
253     jbyte (*CallNonvirtualByteMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
254
255     jchar (*CallNonvirtualCharMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
256     jchar (*CallNonvirtualCharMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
257     jchar (*CallNonvirtualCharMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
258
259     jshort (*CallNonvirtualShortMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
260     jshort (*CallNonvirtualShortMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
261     jshort (*CallNonvirtualShortMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
262
263     jint (*CallNonvirtualIntMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
264     jint (*CallNonvirtualIntMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
265     jint (*CallNonvirtualIntMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
266
267     jlong (*CallNonvirtualLongMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
268     jlong (*CallNonvirtualLongMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
269     jlong (*CallNonvirtualLongMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
270
271     jfloat (*CallNonvirtualFloatMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
272     jfloat (*CallNonvirtualFloatMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
273     jfloat (*CallNonvirtualFloatMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
274
275     jdouble (*CallNonvirtualDoubleMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
276     jdouble (*CallNonvirtualDoubleMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
277     jdouble (*CallNonvirtualDoubleMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
278
279     void (*CallNonvirtualVoidMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
280     void (*CallNonvirtualVoidMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
281     void (*CallNonvirtualVoidMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue * args);
282
283     /* accessing fields */
284
285     jfieldID (*GetFieldID) (JNIEnv*, jclass clazz, const char *name, const char *sig);
286
287     jobject (*GetObjectField) (JNIEnv*, jobject obj, jfieldID fieldID);
288     jboolean (*GetBooleanField) (JNIEnv*, jobject obj, jfieldID fieldID);
289     jbyte (*GetByteField) (JNIEnv*, jobject obj, jfieldID fieldID);
290     jchar (*GetCharField) (JNIEnv*, jobject obj, jfieldID fieldID);
291     jshort (*GetShortField) (JNIEnv*, jobject obj, jfieldID fieldID);
292     jint (*GetIntField) (JNIEnv*, jobject obj, jfieldID fieldID);
293     jlong (*GetLongField) (JNIEnv*, jobject obj, jfieldID fieldID);
294     jfloat (*GetFloatField) (JNIEnv*, jobject obj, jfieldID fieldID);
295     jdouble (*GetDoubleField) (JNIEnv*, jobject obj, jfieldID fieldID);
296
297     void (*SetObjectField) (JNIEnv*, jobject obj, jfieldID fieldID, jobject val);
298     void (*SetBooleanField) (JNIEnv*, jobject obj, jfieldID fieldID, jboolean val);
299     void (*SetByteField) (JNIEnv*, jobject obj, jfieldID fieldID, jbyte val);
300     void (*SetCharField) (JNIEnv*, jobject obj, jfieldID fieldID, jchar val);
301     void (*SetShortField) (JNIEnv*, jobject obj, jfieldID fieldID, jshort val);
302     void (*SetIntField) (JNIEnv*, jobject obj, jfieldID fieldID, jint val);
303     void (*SetLongField) (JNIEnv*, jobject obj, jfieldID fieldID, jlong val);
304     void (*SetFloatField) (JNIEnv*, jobject obj, jfieldID fieldID, jfloat val);
305     void (*SetDoubleField) (JNIEnv*, jobject obj, jfieldID fieldID, jdouble val);
306
307     /* calling static methods */ 
308     
309     jmethodID (*GetStaticMethodID) (JNIEnv*, jclass clazz, const char *name, const char *sig);
310
311     jobject (*CallStaticObjectMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
312     jobject (*CallStaticObjectMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
313     jobject (*CallStaticObjectMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
314
315     jboolean (*CallStaticBooleanMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
316     jboolean (*CallStaticBooleanMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
317     jboolean (*CallStaticBooleanMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
318
319     jbyte (*CallStaticByteMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
320     jbyte (*CallStaticByteMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
321     jbyte (*CallStaticByteMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
322
323     jchar (*CallStaticCharMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
324     jchar (*CallStaticCharMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
325     jchar (*CallStaticCharMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
326
327     jshort (*CallStaticShortMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
328     jshort (*CallStaticShortMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
329     jshort (*CallStaticShortMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
330
331     jint (*CallStaticIntMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
332     jint (*CallStaticIntMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
333     jint (*CallStaticIntMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
334
335     jlong (*CallStaticLongMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
336     jlong (*CallStaticLongMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
337     jlong (*CallStaticLongMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
338
339     jfloat (*CallStaticFloatMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
340     jfloat (*CallStaticFloatMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
341     jfloat (*CallStaticFloatMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
342
343     jdouble (*CallStaticDoubleMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
344     jdouble (*CallStaticDoubleMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
345     jdouble (*CallStaticDoubleMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
346
347     void (*CallStaticVoidMethod) (JNIEnv*, jclass cls, jmethodID methodID, ...);
348     void (*CallStaticVoidMethodV) (JNIEnv*, jclass cls, jmethodID methodID, va_list args);
349     void (*CallStaticVoidMethodA) (JNIEnv*, jclass cls, jmethodID methodID, jvalue * args);
350
351     /* accessing static fields */
352
353     jfieldID (*GetStaticFieldID) (JNIEnv*, jclass clazz, const char *name, const char *sig);
354     jobject (*GetStaticObjectField) (JNIEnv*, jclass clazz, jfieldID fieldID);
355     jboolean (*GetStaticBooleanField) (JNIEnv*, jclass clazz, jfieldID fieldID);
356     jbyte (*GetStaticByteField) (JNIEnv*, jclass clazz, jfieldID fieldID);
357     jchar (*GetStaticCharField) (JNIEnv*, jclass clazz, jfieldID fieldID);
358     jshort (*GetStaticShortField) (JNIEnv*, jclass clazz, jfieldID fieldID);
359     jint (*GetStaticIntField) (JNIEnv*, jclass clazz, jfieldID fieldID);
360     jlong (*GetStaticLongField) (JNIEnv*, jclass clazz, jfieldID fieldID);
361     jfloat (*GetStaticFloatField) (JNIEnv*, jclass clazz, jfieldID fieldID);
362     jdouble (*GetStaticDoubleField) (JNIEnv*, jclass clazz, jfieldID fieldID);
363
364     void (*SetStaticObjectField) (JNIEnv*, jclass clazz, jfieldID fieldID, jobject value);
365     void (*SetStaticBooleanField) (JNIEnv*, jclass clazz, jfieldID fieldID, jboolean value);
366     void (*SetStaticByteField) (JNIEnv*, jclass clazz, jfieldID fieldID, jbyte value);
367     void (*SetStaticCharField) (JNIEnv*, jclass clazz, jfieldID fieldID, jchar value);
368     void (*SetStaticShortField) (JNIEnv*, jclass clazz, jfieldID fieldID, jshort value);
369     void (*SetStaticIntField) (JNIEnv*, jclass clazz, jfieldID fieldID, jint value);
370     void (*SetStaticLongField) (JNIEnv*, jclass clazz, jfieldID fieldID, jlong value);
371     void (*SetStaticFloatField) (JNIEnv*, jclass clazz, jfieldID fieldID, jfloat value);
372     void (*SetStaticDoubleField) (JNIEnv*, jclass clazz, jfieldID fieldID, jdouble value);
373
374     /* string operations */ 
375
376     jstring (*NewString) (JNIEnv*, const jchar *unicode, jsize len);
377     jsize (*GetStringLength) (JNIEnv*, jstring str);
378     const jchar *(*GetStringChars) (JNIEnv*, jstring str, jboolean *isCopy);
379     void (*ReleaseStringChars) (JNIEnv*, jstring str, const jchar *chars);
380
381     jstring (*NewStringUTF) (JNIEnv*, const char *utf);
382     jsize (*GetStringUTFLength) (JNIEnv*, jstring str);
383     const char* (*GetStringUTFChars) (JNIEnv*, jstring str, jboolean *isCopy);
384     void (*ReleaseStringUTFChars) (JNIEnv*, jstring str, const char* chars);
385
386     /* array operations */
387
388     jsize (*GetArrayLength) (JNIEnv*, jarray array);
389
390     jobjectArray (*NewObjectArray) (JNIEnv*, jsize len, jclass clazz, jobject init);
391     jobject (*GetObjectArrayElement) (JNIEnv*, jobjectArray array, jsize index);
392     void (*SetObjectArrayElement) (JNIEnv*, jobjectArray array, jsize index, jobject val);
393
394     jbooleanArray (*NewBooleanArray) (JNIEnv*, jsize len);
395     jbyteArray (*NewByteArray) (JNIEnv*, jsize len);
396     jcharArray (*NewCharArray) (JNIEnv*, jsize len);
397     jshortArray (*NewShortArray) (JNIEnv*, jsize len);
398     jintArray (*NewIntArray) (JNIEnv*, jsize len);
399     jlongArray (*NewLongArray) (JNIEnv*, jsize len);
400     jfloatArray (*NewFloatArray) (JNIEnv*, jsize len);
401     jdoubleArray (*NewDoubleArray) (JNIEnv*, jsize len);
402
403     jboolean * (*GetBooleanArrayElements) (JNIEnv*, jbooleanArray array, jboolean *isCopy);
404     jbyte * (*GetByteArrayElements) (JNIEnv*, jbyteArray array, jboolean *isCopy);
405     jchar * (*GetCharArrayElements) (JNIEnv*, jcharArray array, jboolean *isCopy);
406     jshort * (*GetShortArrayElements) (JNIEnv*, jshortArray array, jboolean *isCopy);
407     jint * (*GetIntArrayElements) (JNIEnv*, jintArray array, jboolean *isCopy);
408     jlong * (*GetLongArrayElements) (JNIEnv*, jlongArray array, jboolean *isCopy);
409     jfloat * (*GetFloatArrayElements) (JNIEnv*, jfloatArray array, jboolean *isCopy);
410     jdouble * (*GetDoubleArrayElements) (JNIEnv*, jdoubleArray array, jboolean *isCopy);
411
412     void (*ReleaseBooleanArrayElements) (JNIEnv*, jbooleanArray array, jboolean *elems, jint mode);
413     void (*ReleaseByteArrayElements) (JNIEnv*, jbyteArray array, jbyte *elems, jint mode);
414     void (*ReleaseCharArrayElements) (JNIEnv*, jcharArray array, jchar *elems, jint mode);
415     void (*ReleaseShortArrayElements) (JNIEnv*, jshortArray array, jshort *elems, jint mode);
416     void (*ReleaseIntArrayElements) (JNIEnv*, jintArray array, jint *elems, jint mode);
417     void (*ReleaseLongArrayElements) (JNIEnv*, jlongArray array, jlong *elems, jint mode);
418     void (*ReleaseFloatArrayElements) (JNIEnv*, jfloatArray array, jfloat *elems, jint mode);
419     void (*ReleaseDoubleArrayElements) (JNIEnv*, jdoubleArray array, jdouble *elems, jint mode);
420
421     void (*GetBooleanArrayRegion) (JNIEnv*, jbooleanArray array, jsize start, jsize l, jboolean *buf);
422     void (*GetByteArrayRegion) (JNIEnv*, jbyteArray array, jsize start, jsize len, jbyte *buf);
423     void (*GetCharArrayRegion) (JNIEnv*, jcharArray array, jsize start, jsize len, jchar *buf);
424     void (*GetShortArrayRegion) (JNIEnv*, jshortArray array, jsize start, jsize len, jshort *buf);
425     void (*GetIntArrayRegion) (JNIEnv*, jintArray array, jsize start, jsize len, jint *buf);
426     void (*GetLongArrayRegion) (JNIEnv*, jlongArray array, jsize start, jsize len, jlong *buf);
427     void (*GetFloatArrayRegion) (JNIEnv*, jfloatArray array, jsize start, jsize len, jfloat *buf);
428     void (*GetDoubleArrayRegion) (JNIEnv*, jdoubleArray array, jsize start, jsize len, jdouble *buf);
429
430     void (*SetBooleanArrayRegion) (JNIEnv*, jbooleanArray array, jsize start, jsize l, jboolean *buf);
431     void (*SetByteArrayRegion) (JNIEnv*, jbyteArray array, jsize start, jsize len, jbyte *buf);
432     void (*SetCharArrayRegion) (JNIEnv*, jcharArray array, jsize start, jsize len, jchar *buf);
433     void (*SetShortArrayRegion) (JNIEnv*, jshortArray array, jsize start, jsize len, jshort *buf);
434     void (*SetIntArrayRegion) (JNIEnv*, jintArray array, jsize start, jsize len, jint *buf);
435     void (*SetLongArrayRegion) (JNIEnv*, jlongArray array, jsize start, jsize len, jlong *buf);
436     void (*SetFloatArrayRegion) (JNIEnv*, jfloatArray array, jsize start, jsize len, jfloat *buf);
437     void (*SetDoubleArrayRegion) (JNIEnv*, jdoubleArray array, jsize start, jsize len, jdouble *buf);
438
439     /* registering native methods */
440
441     jint (*RegisterNatives) (JNIEnv*, jclass clazz, const JNINativeMethod *methods, jint nMethods);
442     jint (*UnregisterNatives) (JNIEnv*, jclass clazz);
443
444     /* monitor operations */
445
446     jint (*MonitorEnter) (JNIEnv*, jobject obj);
447     jint (*MonitorExit) (JNIEnv*, jobject obj);
448
449     /* JavaVM interface */
450     jint (*GetJavaVM) (JNIEnv*, JavaVM **vm);
451
452     void (*GetStringRegion) (JNIEnv*, jstring str, jsize start, jsize len, jchar *buf);
453     void (*GetStringUTFRegion) (JNIEnv*, jstring str, jsize start, jsize len, char *buf);
454
455     void * (*GetPrimitiveArrayCritical) (JNIEnv*, jarray array, jboolean *isCopy);
456     void (*ReleasePrimitiveArrayCritical) (JNIEnv*, jarray array, void *carray, jint mode);
457
458     const jchar * (*GetStringCritical) (JNIEnv*, jstring string, jboolean *isCopy);
459     void (*ReleaseStringCritical) (JNIEnv*, jstring string, const jchar *cstring);
460
461     jweak (*NewWeakGlobalRef) (JNIEnv*, jobject obj);
462     void (*DeleteWeakGlobalRef) (JNIEnv*, jweak ref);
463
464     jboolean (*ExceptionCheck) (JNIEnv*);
465 };
466
467
468 /* the active JNI function table */
469
470 extern JNIEnv env;
471 extern JavaVM javaVM;
472 extern struct JNI_Table envTable;
473
474
475 /* function prototypes */
476
477 jfieldID getFieldID_critical(JNIEnv *env, jclass clazz, char *name, char *sig);
478
479 jobject GetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID);
480 jboolean GetBooleanField(JNIEnv *env, jobject obj, jfieldID fieldID);
481 jbyte GetByteField(JNIEnv *env, jobject obj, jfieldID fieldID);
482 jchar GetCharField(JNIEnv *env, jobject obj, jfieldID fieldID);
483 jshort GetShortField(JNIEnv *env, jobject obj, jfieldID fieldID);
484 jint GetIntField(JNIEnv *env, jobject obj, jfieldID fieldID);
485 jlong GetLongField(JNIEnv *env, jobject obj, jfieldID fieldID);
486 jfloat GetFloatField(JNIEnv *env, jobject obj, jfieldID fieldID);
487 jdouble GetDoubleField(JNIEnv *env, jobject obj, jfieldID fieldID);
488
489 void SetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID, jobject val);
490 void SetBooleanField(JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val);
491 void SetByteField(JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val);
492 void SetCharField(JNIEnv *env, jobject obj, jfieldID fieldID, jchar val);
493 void SetShortField(JNIEnv *env, jobject obj, jfieldID fieldID, jshort val);
494 void SetIntField(JNIEnv *env, jobject obj, jfieldID fieldID, jint val);
495 void SetLongField(JNIEnv *env, jobject obj, jfieldID fieldID, jlong val);
496 void SetFloatField(JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val);
497 void SetDoubleField(JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val);
498
499
500 #define setField(obj,typ,var,val) *((typ*) ((long int) obj + (long int) var->offset))=val;
501 #define getField(obj,typ,var)     *((typ*) ((long int) obj + (long int) var->offset))
502 #define setfield_critical(clazz,obj,name,sig,jdatatype,val) setField(obj,jdatatype,getFieldID_critical(env,clazz,name,sig),val);
503
504 jobject *jni_method_invokeNativeHelper(JNIEnv *env,struct methodinfo *mi,jobject obj, java_objectarray *params);
505
506 void jni_init ();
507
508 #endif /* _JNI_H */
509
510
511 /*
512  * These are local overrides for various environment variables in Emacs.
513  * Please do not remove this and leave it at the end of the file, where
514  * Emacs will automagically detect them.
515  * ---------------------------------------------------------------------
516  * Local variables:
517  * mode: c
518  * indent-tabs-mode: t
519  * c-basic-offset: 4
520  * tab-width: 4
521  * End:
522  */