2 * Copyright (C) 2003, 2004, 2005, 2006, 2007
3 * Robert Lougher <rob@lougher.org.uk>.
5 * This file is part of JamVM.
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2,
10 * or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
27 #define JNI_VERSION_1_1 0x00010001
28 #define JNI_VERSION_1_2 0x00010002
29 #define JNI_VERSION_1_4 0x00010004
36 #define JNI_EDETACHED (-2)
37 #define JNI_EVERSION (-3)
46 typedef long long jlong
;
47 typedef signed char jbyte
;
48 typedef unsigned char jboolean
;
49 typedef unsigned short jchar
;
52 typedef double jdouble
;
55 typedef void *jobject
;
56 typedef jobject jclass
;
57 typedef jobject jthrowable
;
58 typedef jobject jstring
;
59 typedef jobject jarray
;
60 typedef jarray jbooleanArray
;
61 typedef jarray jbyteArray
;
62 typedef jarray jcharArray
;
63 typedef jarray jshortArray
;
64 typedef jarray jintArray
;
65 typedef jarray jlongArray
;
66 typedef jarray jfloatArray
;
67 typedef jarray jdoubleArray
;
68 typedef jarray jobjectArray
;
70 typedef jobject jweak
;
72 typedef union jvalue
{
90 typedef void *jfieldID
;
91 typedef void *jmethodID
;
93 struct _JNINativeInterface
;
94 typedef const struct _JNINativeInterface
*JNIEnv
;
96 struct _JNIInvokeInterface
;
97 typedef const struct _JNIInvokeInterface
*JavaVM
;
99 #define VIRTUAL_METHOD(type, native_type) \
100 native_type (*Call##type##Method)(JNIEnv *env, jobject obj, jmethodID mID, ...); \
101 native_type (*Call##type##MethodV)(JNIEnv *env, jobject obj, jmethodID mID, va_list jargs); \
102 native_type (*Call##type##MethodA)(JNIEnv *env, jobject obj, jmethodID mID, jvalue *jargs);
104 #define NONVIRTUAL_METHOD(type, native_type) \
105 native_type (*CallNonvirtual##type##Method)(JNIEnv *env, jobject obj, jclass clazz, \
106 jmethodID methodID, ...); \
107 native_type (*CallNonvirtual##type##MethodV)(JNIEnv *env, jobject obj, jclass clazz, \
108 jmethodID methodID, va_list jargs); \
109 native_type (*CallNonvirtual##type##MethodA)(JNIEnv *env, jobject obj, jclass clazz, \
110 jmethodID methodID, jvalue *jargs);
112 #define STATIC_METHOD(type, native_type) \
113 native_type (*CallStatic##type##Method)(JNIEnv *env, jclass clazz, jmethodID methodID, ...);\
114 native_type (*CallStatic##type##MethodV)(JNIEnv *env, jclass clazz, jmethodID methodID, \
116 native_type (*CallStatic##type##MethodA)(JNIEnv *env, jclass clazz, jmethodID methodID, \
119 #define VOID_VIRTUAL_METHOD \
120 void (*CallVoidMethod)(JNIEnv *env, jobject obj, jmethodID methodID, ...); \
121 void (*CallVoidMethodV)(JNIEnv *env, jobject obj, jmethodID methodID, va_list jargs); \
122 void (*CallVoidMethodA)(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *jargs); \
124 #define VOID_NONVIRTUAL_METHOD \
125 void (*CallNonvirtualVoidMethod)(JNIEnv *env, jobject obj, jclass clazz, \
126 jmethodID methodID, ...); \
127 void (*CallNonvirtualVoidMethodV)(JNIEnv *env, jobject obj, jclass clazz, \
128 jmethodID methodID, va_list jargs); \
129 void (*CallNonvirtualVoidMethodA)(JNIEnv *env, jobject obj, jclass clazz, \
130 jmethodID methodID, jvalue *jargs);
132 #define VOID_STATIC_METHOD \
133 void (*CallStaticVoidMethod)(JNIEnv *env, jclass clazz, jmethodID methodID, ...); \
134 void (*CallStaticVoidMethodV)(JNIEnv *env, jclass clazz, jmethodID methodID, va_list jargs);\
135 void (*CallStaticVoidMethodA)(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *jargs);
137 #define CALL_METHOD(access) \
138 access##_METHOD(Object, jobject); \
139 access##_METHOD(Boolean, jboolean); \
140 access##_METHOD(Byte, jbyte); \
141 access##_METHOD(Char, jchar); \
142 access##_METHOD(Short, jshort); \
143 access##_METHOD(Int, jint); \
144 access##_METHOD(Long, jlong); \
145 access##_METHOD(Float, jfloat); \
146 access##_METHOD(Double, jdouble); \
147 VOID_##access##_METHOD;
150 #define NEW_PRIM_ARRAY(type, native_type, array_type) \
151 native_type##Array (*New##type##Array)(JNIEnv *env, jsize length);
153 #define GET_ELEMENTS_PRIM_ARRAY(type, native_type, array_type) \
154 native_type *(*Get##type##ArrayElements)(JNIEnv *env, native_type##Array array, jboolean *isCopy);
156 #define RELEASE_ELEMENTS_PRIM_ARRAY(type, native_type, array_type) \
157 void (*Release##type##ArrayElements)(JNIEnv *env, native_type##Array array, native_type *elems, jint mode);
159 #define GET_REGION_PRIM_ARRAY(type, native_type, array_type) \
160 void (*Get##type##ArrayRegion)(JNIEnv *env, native_type##Array array, jsize start, jsize len, native_type *buf);
162 #define SET_REGION_PRIM_ARRAY(type, native_type, array_type) \
163 void (*Set##type##ArrayRegion)(JNIEnv *env, native_type##Array array, jsize start, jsize len, native_type *buf);
165 #define PRIM_ARRAY_OP(op) \
166 op##_PRIM_ARRAY(Boolean, jboolean, T_BOOLEAN); \
167 op##_PRIM_ARRAY(Byte, jbyte, T_BYTE); \
168 op##_PRIM_ARRAY(Char, jchar, T_CHAR); \
169 op##_PRIM_ARRAY(Short, jshort, T_SHORT); \
170 op##_PRIM_ARRAY(Int, jint, T_INT); \
171 op##_PRIM_ARRAY(Long, jlong, T_LONG); \
172 op##_PRIM_ARRAY(Float, jfloat, T_FLOAT); \
173 op##_PRIM_ARRAY(Double, jdouble, T_DOUBLE);
176 #define GET_FIELD(type, native_type) \
177 native_type (*Get##type##Field)(JNIEnv *env, jobject obj, jfieldID fieldID);
179 #define SET_FIELD(type, native_type) \
180 void (*Set##type##Field)(JNIEnv *env, jobject obj, jfieldID fieldID, native_type value);
182 #define GET_STATIC_FIELD(type, native_type) \
183 native_type (*GetStatic##type##Field)(JNIEnv *env, jclass clazz, jfieldID fieldID);
185 #define SET_STATIC_FIELD(type, native_type) \
186 void (*SetStatic##type##Field)(JNIEnv *env, jclass clazz, jfieldID fieldID, native_type value);
188 #define FIELD_OP(op) \
189 op##_FIELD(Object, jobject); \
190 op##_FIELD(Boolean, jboolean); \
191 op##_FIELD(Byte, jbyte); \
192 op##_FIELD(Char, jchar); \
193 op##_FIELD(Short, jshort); \
194 op##_FIELD(Int, jint); \
195 op##_FIELD(Long, jlong); \
196 op##_FIELD(Float, jfloat); \
197 op##_FIELD(Double, jdouble);
200 struct _JNINativeInterface
{
206 jint (*GetVersion
)(JNIEnv
*env
);
208 jclass (*DefineClass
)(JNIEnv
*env
, const char *name
, jobject loader
, const jbyte
*buf
, jsize len
);
209 jclass (*FindClass
)(JNIEnv
*env
, const char *name
);
211 jmethodID (*FromReflectedMethod
)(JNIEnv
*env
, jobject method
);
212 jfieldID (*FromReflectedField
)(JNIEnv
*env
, jobject field
);
213 jobject (*ToReflectedMethod
)(JNIEnv
*env
, jclass cls
, jmethodID methodID
, jboolean isStatic
);
215 jclass (*GetSuperclass
)(JNIEnv
*env
, jclass sub
);
216 jboolean (*IsAssignableFrom
)(JNIEnv
*env
, jclass sub
, jclass sup
);
218 jobject (*ToReflectedField
)(JNIEnv
*env
, jclass cls
, jfieldID fieldID
, jboolean isStatic
);
220 jint (*Throw
)(JNIEnv
*env
, jthrowable obj
);
221 jint (*ThrowNew
)(JNIEnv
*env
, jclass clazz
, const char *msg
);
223 jthrowable (*ExceptionOccurred
)(JNIEnv
*env
);
224 void (*ExceptionDescribe
)(JNIEnv
*env
);
225 void (*ExceptionClear
)(JNIEnv
*env
);
226 void (*FatalError
)(JNIEnv
*env
, const char *msg
);
228 jint (*PushLocalFrame
)(JNIEnv
*env
, jint capacity
);
229 jobject (*PopLocalFrame
)(JNIEnv
*env
, jobject result
);
231 jobject (*NewGlobalRef
)(JNIEnv
*env
, jobject obj
);
232 void (*DeleteGlobalRef
)(JNIEnv
*env
, jobject obj
);
233 void (*DeleteLocalRef
)(JNIEnv
*env
, jobject obj
);
234 jboolean (*IsSameObject
)(JNIEnv
*env
, jobject obj1
, jobject obj2
);
236 jobject (*NewLocalRef
)(JNIEnv
*env
, jobject obj
);
237 jint (*EnsureLocalCapacity
)(JNIEnv
*env
, jint capacity
);
239 jobject (*AllocObject
)(JNIEnv
*env
, jclass clazz
);
240 jobject (*NewObject
)(JNIEnv
*env
, jclass clazz
, jmethodID methodID
, ...);
241 jobject (*NewObjectV
)(JNIEnv
*env
, jclass clazz
, jmethodID methodID
, va_list args
);
242 jobject (*NewObjectA
)(JNIEnv
*env
, jclass clazz
, jmethodID methodID
, jvalue
*args
);
244 jclass (*GetObjectClass
)(JNIEnv
*env
, jobject obj
);
245 jboolean (*IsInstanceOf
)(JNIEnv
*env
, jobject obj
, jclass clazz
);
247 jmethodID (*GetMethodID
)(JNIEnv
*env
, jclass clazz
, const char *name
, const char *sig
);
249 CALL_METHOD(VIRTUAL
);
250 CALL_METHOD(NONVIRTUAL
);
252 jfieldID (*GetFieldID
)(JNIEnv
*env
, jclass clazz
, const char *name
, const char *sig
);
257 jmethodID (*GetStaticMethodID
)(JNIEnv
*env
, jclass clazz
, const char *name
, const char *sig
);
261 jfieldID (*GetStaticFieldID
)(JNIEnv
*env
, jclass clazz
, const char *name
, const char *sig
);
263 FIELD_OP(GET_STATIC
);
264 FIELD_OP(SET_STATIC
);
266 jstring (*NewString
)(JNIEnv
*env
, const jchar
*unicode
, jsize len
);
267 jsize (*GetStringLength
)(JNIEnv
*env
, jstring str
);
268 const jchar
*(*GetStringChars
)(JNIEnv
*env
, jstring str
, jboolean
*isCopy
);
269 void (*ReleaseStringChars
)(JNIEnv
*env
, jstring str
, const jchar
*chars
);
271 jstring (*NewStringUTF
)(JNIEnv
*env
, const char *utf
);
272 jsize (*GetStringUTFLength
)(JNIEnv
*env
, jstring str
);
273 const char* (*GetStringUTFChars
)(JNIEnv
*env
, jstring str
, jboolean
*isCopy
);
274 void (*ReleaseStringUTFChars
)(JNIEnv
*env
, jstring str
, const char* chars
);
276 jsize (*GetArrayLength
)(JNIEnv
*env
, jarray array
);
278 jobjectArray (*NewObjectArray
)(JNIEnv
*env
, jsize len
, jclass clazz
, jobject init
);
279 jobject (*GetObjectArrayElement
)(JNIEnv
*env
, jobjectArray array
, jsize index
);
280 void (*SetObjectArrayElement
)(JNIEnv
*env
, jobjectArray array
, jsize index
, jobject val
);
283 PRIM_ARRAY_OP(GET_ELEMENTS
);
284 PRIM_ARRAY_OP(RELEASE_ELEMENTS
);
285 PRIM_ARRAY_OP(GET_REGION
);
286 PRIM_ARRAY_OP(SET_REGION
);
288 jint (*RegisterNatives
)(JNIEnv
*env
, jclass clazz
, const JNINativeMethod
*methods
, jint nMethods
);
289 jint (*UnregisterNatives
)(JNIEnv
*env
, jclass clazz
);
291 jint (*MonitorEnter
)(JNIEnv
*env
, jobject obj
);
292 jint (*MonitorExit
)(JNIEnv
*env
, jobject obj
);
294 jint (*GetJavaVM
)(JNIEnv
*env
, JavaVM
**vm
);
296 void (*GetStringRegion
)(JNIEnv
*env
, jstring str
, jsize start
, jsize len
, jchar
*buf
);
297 void (*GetStringUTFRegion
)(JNIEnv
*env
, jstring str
, jsize start
, jsize len
, char *buf
);
299 void *(*GetPrimitiveArrayCritical
)(JNIEnv
*env
, jarray array
, jboolean
*isCopy
);
300 void (*ReleasePrimitiveArrayCritical
)(JNIEnv
*env
, jarray array
, void *carray
, jint mode
);
302 const jchar
*(*GetStringCritical
)(JNIEnv
*env
, jstring string
, jboolean
*isCopy
);
303 void (*ReleaseStringCritical
)(JNIEnv
*env
, jstring string
, const jchar
*cstring
);
305 jweak (*NewWeakGlobalRef
)(JNIEnv
*env
, jobject obj
);
306 void (*DeleteWeakGlobalRef
)(JNIEnv
*env
, jweak obj
);
308 jboolean (*ExceptionCheck
)(JNIEnv
*env
);
309 jobject (*NewDirectByteBuffer
)(JNIEnv
*env
, void *addr
, jlong capacity
);
310 void* (*GetDirectBufferAddress
)(JNIEnv
*env
, jobject buffer
);
311 jlong (*GetDirectBufferCapacity
)(JNIEnv
*env
, jobject buffer
);
314 struct _JNIInvokeInterface
{
319 jint (*DestroyJavaVM
)(JavaVM
*vm
);
320 jint (*AttachCurrentThread
)(JavaVM
*vm
, void **penv
, void *args
);
321 jint (*DetachCurrentThread
)(JavaVM
*vm
);
322 jint (*GetEnv
)(JavaVM
*vm
, void **penv
, jint version
);
323 jint (*AttachCurrentThreadAsDaemon
)(JavaVM
*vm
, void **penv
, void *args
);
326 typedef struct JavaVMOption
{
331 typedef struct JavaVMInitArgs
{
334 JavaVMOption
*options
;
335 jboolean ignoreUnrecognized
;
338 typedef struct JavaVMAttachArgs
{
344 #undef VIRTUAL_METHOD
345 #undef NONVIRTUAL_METHOD
347 #undef VOID_VIRTUAL_METHOD
348 #undef VOID_NONVIRTUAL_METHOD
349 #undef VOID_STATIC_METHOD
351 #undef NEW_PRIM_ARRAY
352 #undef GET_ELEMENTS_PRIM_ARRAY
353 #undef RELEASE_ELEMENTS_PRIM_ARRAY
354 #undef GET_REGION_PRIM_ARRAY
355 #undef SET_REGION_PRIM_ARRAY
359 #undef GET_STATIC_FIELD
360 #undef SET_STATIC_FIELD