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