- added authors
[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: Reinhard Grafl
28             Roman Obermaisser
29
30    Changes: Christian Thalinger
31
32    $Id: jni.h 1921 2005-02-10 10:34:40Z twisti $
33
34 */
35
36
37 #ifndef _JNI_H
38 #define _JNI_H
39
40 #include <stdio.h>
41 #include <stdarg.h>
42
43 #include "types.h"
44 #include "vm/global.h"
45
46
47 /* JNI versions */
48
49 #define JNI_VERSION_1_1    0x00010001
50 #define JNI_VERSION_1_2    0x00010002
51 #define JNI_VERSION_1_4    0x00010004
52
53 #define JNIEXPORT
54 #define JNICALL
55
56
57 /* JNI-Boolean */
58
59 #define JNI_FALSE        0
60 #define JNI_TRUE         1
61
62
63 /* Error codes */
64
65 #define JNI_OK           0
66 #define JNI_ERR          (-1)
67 #define JNI_EDETACHED    (-2)              /* thread detached from the VM */
68 #define JNI_EVERSION     (-3)              /* JNI version error */
69
70
71 /* JNI datatypes */
72
73 #define jboolean        u1
74 #define jbyte           s1
75 #define jchar           u2
76 #define jshort          s2
77 #define jint            s4
78 #define jlong           s8
79 #define jfloat          float
80 #define jdouble         double
81
82 #define jobject         java_objectheader*
83 #define jclass          struct classinfo*
84 #define jthrowable      jobject
85 #define jweak           jobject
86 #define jarray          java_arrayheader*
87 #define jlongArray      java_longarray*
88 #define jbooleanArray   java_booleanarray*
89 #define jintArray       java_intarray*
90 #define jcharArray      java_chararray*
91 #define jbyteArray      java_bytearray*
92 #define jshortArray     java_shortarray*
93 #define jdoubleArray    java_doublearray*
94 #define jfloatArray     java_floatarray*
95 #define jobjectArray    java_objectarray*
96 #define jstring         jobject
97
98 #define jsize           jint
99 #define jfieldID        fieldinfo*
100 #define jmethodID       methodinfo*     
101
102
103 typedef union jvalue {
104     jboolean z;
105     jbyte    b;
106     jchar    c;
107     jshort   s;
108     jint     i;
109     jlong    j;
110     jfloat   f;
111     jdouble  d;
112     jobject  l;
113 } jvalue;
114
115
116 typedef struct JDK1_1InitArgs JDK1_1InitArgs;
117
118 struct JDK1_1InitArgs {
119         /* The first two fields were reserved in JDK 1.1, and
120            formally introduced in JDK 1.1.2. */
121         /* Java VM version */
122         jint version;
123
124         /* System properties. */
125         char **properties;
126
127         /* whether to check the Java source files are newer than
128          * compiled class files. */
129         jint checkSource;
130
131         /* maximum native stack size of Java-created threads. */
132         jint nativeStackSize;
133
134         /* maximum Java stack size. */
135         jint javaStackSize;
136
137         /* initial heap size. */
138         jint minHeapSize;
139
140         /* maximum heap size. */
141         jint maxHeapSize;
142
143         /* controls whether Java byte code should be verified:
144          * 0 -- none, 1 -- remotely loaded code, 2 -- all code. */ 
145         jint verifyMode;
146
147         /* the local directory path for class loading. */
148         const char *classpath;
149
150         /* a hook for a function that redirects all VM messages. */
151         jint (*vfprintf)(FILE *fp, const char *format,
152                                          va_list args);
153
154         /* a VM exit hook. */
155         void (*exit)(jint code);
156
157         /* a VM abort hook. */
158         void (*abort)();
159
160         /* whether to enable class GC. */
161         jint enableClassGC;
162
163         /* whether GC messages will appear. */
164         jint enableVerboseGC;
165
166         /* whether asynchronous GC is allowed. */
167         jint disableAsyncGC;
168
169         /* Three reserved fields. */
170         jint reserved0;
171         jint reserved1;
172         jint reserved2;
173 };
174
175
176 typedef struct JDK1_1AttachArgs {
177         /*
178          * JDK 1.1 does not need any arguments to attach a
179          * native thread. The padding is here to satisfy the C
180          * compiler which does not permit empty structures.
181          */
182         void *__padding;
183 } JDK1_1AttachArgs;
184
185
186 typedef struct JNIInvokeInterface *JavaVM;
187 /*  typedef struct _JavaVM *JavaVM; */
188
189 /*  struct _JavaVM { */
190 struct JNIInvokeInterface {
191    void *(*reserved0) ();
192    void *(*reserved1) ();
193    void *(*reserved2) ();
194    jint (*DestroyJavaVM) (JavaVM *);
195    jint (*AttachCurrentThread) (JavaVM *, void **, void *);
196    jint (*DetachCurrentThread) (JavaVM *);
197    jint (*GetEnv) (JavaVM *, void **, jint);
198    jint (*AttachCurrentThreadAsDaemon) (JavaVM *, void **, void *);
199 };
200
201
202 /* native method name, signature and function pointer for use in RegisterNatives */
203
204 typedef struct {
205     char *name;
206     char *signature;
207     void *fnPtr;
208 } JNINativeMethod;
209
210
211 /* 
212         JNI function table, contains functions for the following usages:        
213         
214         Version Information 
215         Class Operations 
216         Exceptions 
217         Global and Local References 
218         Object Operations 
219         Accessing Fields of Objects 
220         Calling Instance Methods 
221         Accessing Static Fields 
222         Calling Static Methods 
223         String Operations 
224         Array Operations 
225         Registering Native Methods 
226         Monitor Operations 
227         Java VM Interface 
228 */
229
230 typedef struct JNINativeInterface *JNIEnv;
231 /*  typedef struct JNI_Table *JNIEnv; */
232
233 /*  struct JNI_Table { */
234 struct JNINativeInterface {
235     /* reserverd for future JNI-functions */
236     void *unused0;
237     void *unused1;
238     void *unused2;
239     void *unused3;
240     
241     /* version information */
242     
243     jint (*GetVersion) (JNIEnv*);
244
245     /* class operations */
246
247     jclass (*DefineClass) (JNIEnv*, const char *name, jobject loader, const jbyte *buf, jsize len);
248     jclass (*FindClass) (JNIEnv*, const char *name);
249
250     jmethodID (*FromReflectedMethod) (JNIEnv*, jobject method);
251     jfieldID (*FromReflectedField) (JNIEnv*, jobject field);
252
253     jobject (*ToReflectedMethod) (JNIEnv*, jclass cls, jmethodID methodID, jboolean isStatic);
254
255     jclass (*GetSuperclass) (JNIEnv*, jclass sub);
256     jboolean (*IsAssignableFrom) (JNIEnv*, jclass sub, jclass sup);
257
258     jobject (*ToReflectedField) (JNIEnv*, jclass cls, jfieldID fieldID, jboolean isStatic);
259
260     /* exceptions */ 
261
262     jint (*Throw) (JNIEnv*, jthrowable obj);
263     jint (*ThrowNew) (JNIEnv*, jclass clazz, const char *msg);
264     jthrowable (*ExceptionOccurred) (JNIEnv*);
265     void (*ExceptionDescribe) (JNIEnv*);
266     void (*ExceptionClear) (JNIEnv*);
267     void (*FatalError) (JNIEnv*, const char *msg);
268
269     /* global and local references */
270
271     jint (*PushLocalFrame) (JNIEnv*, jint capacity);
272     jobject (*PopLocalFrame) (JNIEnv*, jobject result);
273     
274     jobject (*NewGlobalRef) (JNIEnv*, jobject lobj);
275     void (*DeleteGlobalRef) (JNIEnv*, jobject gref);
276     void (*DeleteLocalRef) (JNIEnv*, jobject obj);
277     jboolean (*IsSameObject) (JNIEnv*, jobject obj1, jobject obj2);
278     jobject (*NewLocalRef) (JNIEnv*, jobject ref);
279     jint (*EnsureLocalCapacity) (JNIEnv*, jint capacity);
280
281     /* object operations */ 
282
283     jobject (*AllocObject) (JNIEnv*, jclass clazz);
284     jobject (*NewObject) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
285     jobject (*NewObjectV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
286     jobject (*NewObjectA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
287
288     jclass (*GetObjectClass) (JNIEnv*, jobject obj);
289     jboolean (*IsInstanceOf) (JNIEnv*, jobject obj, jclass clazz);
290
291     jmethodID (*GetMethodID) (JNIEnv*, jclass clazz, const char *name, const char *sig);
292
293     /* calling instance methods */ 
294
295     jobject (*CallObjectMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
296     jobject (*CallObjectMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
297     jobject (*CallObjectMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue * args);
298
299     jboolean (*CallBooleanMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
300     jboolean (*CallBooleanMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
301     jboolean (*CallBooleanMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue * args);
302
303     jbyte (*CallByteMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
304     jbyte (*CallByteMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
305     jbyte (*CallByteMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
306
307     jchar (*CallCharMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
308     jchar (*CallCharMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
309     jchar (*CallCharMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
310
311     jshort (*CallShortMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
312     jshort (*CallShortMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
313     jshort (*CallShortMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
314
315     jint (*CallIntMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
316     jint (*CallIntMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
317     jint (*CallIntMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
318
319     jlong (*CallLongMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
320     jlong (*CallLongMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
321     jlong (*CallLongMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
322
323     jfloat (*CallFloatMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
324     jfloat (*CallFloatMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
325     jfloat (*CallFloatMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
326
327     jdouble (*CallDoubleMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
328     jdouble (*CallDoubleMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
329     jdouble (*CallDoubleMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
330
331     void (*CallVoidMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
332     void (*CallVoidMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
333     void (*CallVoidMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue * args);
334
335     jobject (*CallNonvirtualObjectMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
336     jobject (*CallNonvirtualObjectMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
337     jobject (*CallNonvirtualObjectMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue * args);
338
339     jboolean (*CallNonvirtualBooleanMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
340     jboolean (*CallNonvirtualBooleanMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
341     jboolean (*CallNonvirtualBooleanMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue * args);
342
343     jbyte (*CallNonvirtualByteMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
344     jbyte (*CallNonvirtualByteMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
345     jbyte (*CallNonvirtualByteMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
346
347     jchar (*CallNonvirtualCharMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
348     jchar (*CallNonvirtualCharMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
349     jchar (*CallNonvirtualCharMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
350
351     jshort (*CallNonvirtualShortMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
352     jshort (*CallNonvirtualShortMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
353     jshort (*CallNonvirtualShortMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
354
355     jint (*CallNonvirtualIntMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
356     jint (*CallNonvirtualIntMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
357     jint (*CallNonvirtualIntMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
358
359     jlong (*CallNonvirtualLongMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
360     jlong (*CallNonvirtualLongMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
361     jlong (*CallNonvirtualLongMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
362
363     jfloat (*CallNonvirtualFloatMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
364     jfloat (*CallNonvirtualFloatMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
365     jfloat (*CallNonvirtualFloatMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
366
367     jdouble (*CallNonvirtualDoubleMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
368     jdouble (*CallNonvirtualDoubleMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
369     jdouble (*CallNonvirtualDoubleMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
370
371     void (*CallNonvirtualVoidMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
372     void (*CallNonvirtualVoidMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
373     void (*CallNonvirtualVoidMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue * args);
374
375     /* accessing fields */
376
377     jfieldID (*GetFieldID) (JNIEnv*, jclass clazz, const char *name, const char *sig);
378
379     jobject (*GetObjectField) (JNIEnv*, jobject obj, jfieldID fieldID);
380     jboolean (*GetBooleanField) (JNIEnv*, jobject obj, jfieldID fieldID);
381     jbyte (*GetByteField) (JNIEnv*, jobject obj, jfieldID fieldID);
382     jchar (*GetCharField) (JNIEnv*, jobject obj, jfieldID fieldID);
383     jshort (*GetShortField) (JNIEnv*, jobject obj, jfieldID fieldID);
384     jint (*GetIntField) (JNIEnv*, jobject obj, jfieldID fieldID);
385     jlong (*GetLongField) (JNIEnv*, jobject obj, jfieldID fieldID);
386     jfloat (*GetFloatField) (JNIEnv*, jobject obj, jfieldID fieldID);
387     jdouble (*GetDoubleField) (JNIEnv*, jobject obj, jfieldID fieldID);
388
389     void (*SetObjectField) (JNIEnv*, jobject obj, jfieldID fieldID, jobject val);
390     void (*SetBooleanField) (JNIEnv*, jobject obj, jfieldID fieldID, jboolean val);
391     void (*SetByteField) (JNIEnv*, jobject obj, jfieldID fieldID, jbyte val);
392     void (*SetCharField) (JNIEnv*, jobject obj, jfieldID fieldID, jchar val);
393     void (*SetShortField) (JNIEnv*, jobject obj, jfieldID fieldID, jshort val);
394     void (*SetIntField) (JNIEnv*, jobject obj, jfieldID fieldID, jint val);
395     void (*SetLongField) (JNIEnv*, jobject obj, jfieldID fieldID, jlong val);
396     void (*SetFloatField) (JNIEnv*, jobject obj, jfieldID fieldID, jfloat val);
397     void (*SetDoubleField) (JNIEnv*, jobject obj, jfieldID fieldID, jdouble val);
398
399     /* calling static methods */ 
400     
401     jmethodID (*GetStaticMethodID) (JNIEnv*, jclass clazz, const char *name, const char *sig);
402
403     jobject (*CallStaticObjectMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
404     jobject (*CallStaticObjectMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
405     jobject (*CallStaticObjectMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
406
407     jboolean (*CallStaticBooleanMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
408     jboolean (*CallStaticBooleanMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
409     jboolean (*CallStaticBooleanMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
410
411     jbyte (*CallStaticByteMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
412     jbyte (*CallStaticByteMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
413     jbyte (*CallStaticByteMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
414
415     jchar (*CallStaticCharMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
416     jchar (*CallStaticCharMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
417     jchar (*CallStaticCharMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
418
419     jshort (*CallStaticShortMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
420     jshort (*CallStaticShortMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
421     jshort (*CallStaticShortMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
422
423     jint (*CallStaticIntMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
424     jint (*CallStaticIntMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
425     jint (*CallStaticIntMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
426
427     jlong (*CallStaticLongMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
428     jlong (*CallStaticLongMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
429     jlong (*CallStaticLongMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
430
431     jfloat (*CallStaticFloatMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
432     jfloat (*CallStaticFloatMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
433     jfloat (*CallStaticFloatMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
434
435     jdouble (*CallStaticDoubleMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
436     jdouble (*CallStaticDoubleMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
437     jdouble (*CallStaticDoubleMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
438
439     void (*CallStaticVoidMethod) (JNIEnv*, jclass cls, jmethodID methodID, ...);
440     void (*CallStaticVoidMethodV) (JNIEnv*, jclass cls, jmethodID methodID, va_list args);
441     void (*CallStaticVoidMethodA) (JNIEnv*, jclass cls, jmethodID methodID, jvalue * args);
442
443     /* accessing static fields */
444
445     jfieldID (*GetStaticFieldID) (JNIEnv*, jclass clazz, const char *name, const char *sig);
446     jobject (*GetStaticObjectField) (JNIEnv*, jclass clazz, jfieldID fieldID);
447     jboolean (*GetStaticBooleanField) (JNIEnv*, jclass clazz, jfieldID fieldID);
448     jbyte (*GetStaticByteField) (JNIEnv*, jclass clazz, jfieldID fieldID);
449     jchar (*GetStaticCharField) (JNIEnv*, jclass clazz, jfieldID fieldID);
450     jshort (*GetStaticShortField) (JNIEnv*, jclass clazz, jfieldID fieldID);
451     jint (*GetStaticIntField) (JNIEnv*, jclass clazz, jfieldID fieldID);
452     jlong (*GetStaticLongField) (JNIEnv*, jclass clazz, jfieldID fieldID);
453     jfloat (*GetStaticFloatField) (JNIEnv*, jclass clazz, jfieldID fieldID);
454     jdouble (*GetStaticDoubleField) (JNIEnv*, jclass clazz, jfieldID fieldID);
455
456     void (*SetStaticObjectField) (JNIEnv*, jclass clazz, jfieldID fieldID, jobject value);
457     void (*SetStaticBooleanField) (JNIEnv*, jclass clazz, jfieldID fieldID, jboolean value);
458     void (*SetStaticByteField) (JNIEnv*, jclass clazz, jfieldID fieldID, jbyte value);
459     void (*SetStaticCharField) (JNIEnv*, jclass clazz, jfieldID fieldID, jchar value);
460     void (*SetStaticShortField) (JNIEnv*, jclass clazz, jfieldID fieldID, jshort value);
461     void (*SetStaticIntField) (JNIEnv*, jclass clazz, jfieldID fieldID, jint value);
462     void (*SetStaticLongField) (JNIEnv*, jclass clazz, jfieldID fieldID, jlong value);
463     void (*SetStaticFloatField) (JNIEnv*, jclass clazz, jfieldID fieldID, jfloat value);
464     void (*SetStaticDoubleField) (JNIEnv*, jclass clazz, jfieldID fieldID, jdouble value);
465
466     /* string operations */ 
467
468     jstring (*NewString) (JNIEnv*, const jchar *unicode, jsize len);
469     jsize (*GetStringLength) (JNIEnv*, jstring str);
470     const jchar *(*GetStringChars) (JNIEnv*, jstring str, jboolean *isCopy);
471     void (*ReleaseStringChars) (JNIEnv*, jstring str, const jchar *chars);
472
473     jstring (*NewStringUTF) (JNIEnv*, const char *bytes);
474     jsize (*GetStringUTFLength) (JNIEnv*, jstring str);
475     const char* (*GetStringUTFChars) (JNIEnv*, jstring str, jboolean *isCopy);
476     void (*ReleaseStringUTFChars) (JNIEnv*, jstring str, const char* chars);
477
478     /* array operations */
479
480     jsize (*GetArrayLength) (JNIEnv*, jarray array);
481
482     jobjectArray (*NewObjectArray) (JNIEnv*, jsize len, jclass clazz, jobject init);
483     jobject (*GetObjectArrayElement) (JNIEnv*, jobjectArray array, jsize index);
484     void (*SetObjectArrayElement) (JNIEnv*, jobjectArray array, jsize index, jobject val);
485
486     jbooleanArray (*NewBooleanArray) (JNIEnv*, jsize len);
487     jbyteArray (*NewByteArray) (JNIEnv*, jsize len);
488     jcharArray (*NewCharArray) (JNIEnv*, jsize len);
489     jshortArray (*NewShortArray) (JNIEnv*, jsize len);
490     jintArray (*NewIntArray) (JNIEnv*, jsize len);
491     jlongArray (*NewLongArray) (JNIEnv*, jsize len);
492     jfloatArray (*NewFloatArray) (JNIEnv*, jsize len);
493     jdoubleArray (*NewDoubleArray) (JNIEnv*, jsize len);
494
495     jboolean * (*GetBooleanArrayElements) (JNIEnv*, jbooleanArray array, jboolean *isCopy);
496     jbyte * (*GetByteArrayElements) (JNIEnv*, jbyteArray array, jboolean *isCopy);
497     jchar * (*GetCharArrayElements) (JNIEnv*, jcharArray array, jboolean *isCopy);
498     jshort * (*GetShortArrayElements) (JNIEnv*, jshortArray array, jboolean *isCopy);
499     jint * (*GetIntArrayElements) (JNIEnv*, jintArray array, jboolean *isCopy);
500     jlong * (*GetLongArrayElements) (JNIEnv*, jlongArray array, jboolean *isCopy);
501     jfloat * (*GetFloatArrayElements) (JNIEnv*, jfloatArray array, jboolean *isCopy);
502     jdouble * (*GetDoubleArrayElements) (JNIEnv*, jdoubleArray array, jboolean *isCopy);
503
504     void (*ReleaseBooleanArrayElements) (JNIEnv*, jbooleanArray array, jboolean *elems, jint mode);
505     void (*ReleaseByteArrayElements) (JNIEnv*, jbyteArray array, jbyte *elems, jint mode);
506     void (*ReleaseCharArrayElements) (JNIEnv*, jcharArray array, jchar *elems, jint mode);
507     void (*ReleaseShortArrayElements) (JNIEnv*, jshortArray array, jshort *elems, jint mode);
508     void (*ReleaseIntArrayElements) (JNIEnv*, jintArray array, jint *elems, jint mode);
509     void (*ReleaseLongArrayElements) (JNIEnv*, jlongArray array, jlong *elems, jint mode);
510     void (*ReleaseFloatArrayElements) (JNIEnv*, jfloatArray array, jfloat *elems, jint mode);
511     void (*ReleaseDoubleArrayElements) (JNIEnv*, jdoubleArray array, jdouble *elems, jint mode);
512
513     void (*GetBooleanArrayRegion) (JNIEnv*, jbooleanArray array, jsize start, jsize l, jboolean *buf);
514     void (*GetByteArrayRegion) (JNIEnv*, jbyteArray array, jsize start, jsize len, jbyte *buf);
515     void (*GetCharArrayRegion) (JNIEnv*, jcharArray array, jsize start, jsize len, jchar *buf);
516     void (*GetShortArrayRegion) (JNIEnv*, jshortArray array, jsize start, jsize len, jshort *buf);
517     void (*GetIntArrayRegion) (JNIEnv*, jintArray array, jsize start, jsize len, jint *buf);
518     void (*GetLongArrayRegion) (JNIEnv*, jlongArray array, jsize start, jsize len, jlong *buf);
519     void (*GetFloatArrayRegion) (JNIEnv*, jfloatArray array, jsize start, jsize len, jfloat *buf);
520     void (*GetDoubleArrayRegion) (JNIEnv*, jdoubleArray array, jsize start, jsize len, jdouble *buf);
521
522     void (*SetBooleanArrayRegion) (JNIEnv*, jbooleanArray array, jsize start, jsize l, jboolean *buf);
523     void (*SetByteArrayRegion) (JNIEnv*, jbyteArray array, jsize start, jsize len, jbyte *buf);
524     void (*SetCharArrayRegion) (JNIEnv*, jcharArray array, jsize start, jsize len, jchar *buf);
525     void (*SetShortArrayRegion) (JNIEnv*, jshortArray array, jsize start, jsize len, jshort *buf);
526     void (*SetIntArrayRegion) (JNIEnv*, jintArray array, jsize start, jsize len, jint *buf);
527     void (*SetLongArrayRegion) (JNIEnv*, jlongArray array, jsize start, jsize len, jlong *buf);
528     void (*SetFloatArrayRegion) (JNIEnv*, jfloatArray array, jsize start, jsize len, jfloat *buf);
529     void (*SetDoubleArrayRegion) (JNIEnv*, jdoubleArray array, jsize start, jsize len, jdouble *buf);
530
531     /* registering native methods */
532
533     jint (*RegisterNatives) (JNIEnv*, jclass clazz, const JNINativeMethod *methods, jint nMethods);
534     jint (*UnregisterNatives) (JNIEnv*, jclass clazz);
535
536     /* monitor operations */
537
538     jint (*MonitorEnter) (JNIEnv*, jobject obj);
539     jint (*MonitorExit) (JNIEnv*, jobject obj);
540
541     /* JavaVM interface */
542
543     jint (*GetJavaVM) (JNIEnv*, JavaVM **vm);
544
545         /* new JNI 1.2 functions */
546
547     void (*GetStringRegion) (JNIEnv*, jstring str, jsize start, jsize len, jchar *buf);
548     void (*GetStringUTFRegion) (JNIEnv*, jstring str, jsize start, jsize len, char *buf);
549
550     void * (*GetPrimitiveArrayCritical) (JNIEnv*, jarray array, jboolean *isCopy);
551     void (*ReleasePrimitiveArrayCritical) (JNIEnv*, jarray array, void *carray, jint mode);
552
553     const jchar * (*GetStringCritical) (JNIEnv*, jstring string, jboolean *isCopy);
554     void (*ReleaseStringCritical) (JNIEnv*, jstring string, const jchar *cstring);
555
556     jweak (*NewWeakGlobalRef) (JNIEnv*, jobject obj);
557     void (*DeleteWeakGlobalRef) (JNIEnv*, jweak ref);
558
559     jboolean (*ExceptionCheck) (JNIEnv*);
560
561         /* new JNI 1.4 functions */
562
563         jobject (*NewDirectByteBuffer) (JNIEnv *env, void* address, jlong capacity);
564         void* (*GetDirectBufferAddress) (JNIEnv *env, jobject buf);
565         jlong (*GetDirectBufferCapacity) (JNIEnv *env, jobject buf);
566 };
567
568
569 /* function prototypes ********************************************************/
570
571 jint JNI_GetDefaultJavaVMInitArgs(void *vm_args);
572 jint JNI_GetCreatedJavaVMs(JavaVM **vmBuf, jsize bufLen, jsize *nVMs);
573 jint JNI_CreateJavaVM(JavaVM **p_vm, JNIEnv **p_env, void *vm_args);
574
575 jfieldID getFieldID_critical(JNIEnv *env, jclass clazz, char *name, char *sig);
576
577 jobject GetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID);
578 jboolean GetBooleanField(JNIEnv *env, jobject obj, jfieldID fieldID);
579 jbyte GetByteField(JNIEnv *env, jobject obj, jfieldID fieldID);
580 jchar GetCharField(JNIEnv *env, jobject obj, jfieldID fieldID);
581 jshort GetShortField(JNIEnv *env, jobject obj, jfieldID fieldID);
582 jint GetIntField(JNIEnv *env, jobject obj, jfieldID fieldID);
583 jlong GetLongField(JNIEnv *env, jobject obj, jfieldID fieldID);
584 jfloat GetFloatField(JNIEnv *env, jobject obj, jfieldID fieldID);
585 jdouble GetDoubleField(JNIEnv *env, jobject obj, jfieldID fieldID);
586
587 void SetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID, jobject val);
588 void SetBooleanField(JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val);
589 void SetByteField(JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val);
590 void SetCharField(JNIEnv *env, jobject obj, jfieldID fieldID, jchar val);
591 void SetShortField(JNIEnv *env, jobject obj, jfieldID fieldID, jshort val);
592 void SetIntField(JNIEnv *env, jobject obj, jfieldID fieldID, jint val);
593 void SetLongField(JNIEnv *env, jobject obj, jfieldID fieldID, jlong val);
594 void SetFloatField(JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val);
595 void SetDoubleField(JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val);
596
597
598 #define setField(obj,typ,var,val) *((typ*) ((long int) obj + (long int) var->offset))=val;
599 #define getField(obj,typ,var)     *((typ*) ((long int) obj + (long int) var->offset))
600 #define setfield_critical(clazz,obj,name,sig,jdatatype,val) setField(obj,jdatatype,getFieldID_critical(env,clazz,name,sig),val);
601
602 jobject *jni_method_invokeNativeHelper(JNIEnv *env,struct methodinfo *mi,jobject obj, java_objectarray *params);
603
604 void jni_init ();
605
606 #endif /* _JNI_H */
607
608
609 /*
610  * These are local overrides for various environment variables in Emacs.
611  * Please do not remove this and leave it at the end of the file, where
612  * Emacs will automagically detect them.
613  * ---------------------------------------------------------------------
614  * Local variables:
615  * mode: c
616  * indent-tabs-mode: t
617  * c-basic-offset: 4
618  * tab-width: 4
619  * End:
620  */