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