-/* jni.h - JNI types and data structures
+/* native/jni.h - JNI types and data structures
- Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
- R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser,
- M. Probst, S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck,
- P. Tomsich, J. Wenninger
+ Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
+ R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
+ C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
+ Institut f. Computersprachen - TU Wien
This file is part of CACAO.
Contact: cacao@complang.tuwien.ac.at
- Authors: ?
+ Authors: Reinhard Grafl
+ Roman Obermaisser
- $Id: jni.h 664 2003-11-21 18:24:01Z jowenn $
+ Changes: Christian Thalinger
+
+ $Id: jni.h 2129 2005-03-29 22:27:08Z twisti $
*/
#ifndef _JNI_H
#define _JNI_H
+#include <stdio.h>
#include <stdarg.h>
+#include "types.h"
+#include "vm/field.h"
+#include "vm/global.h"
+#include "vm/method.h"
+
+
+/* JNI versions */
+
+#define JNI_VERSION_1_1 0x00010001
+#define JNI_VERSION_1_2 0x00010002
+#define JNI_VERSION_1_4 0x00010004
+
#define JNIEXPORT
#define JNICALL
+
+/* JNI-Boolean */
+
+#define JNI_FALSE 0
+#define JNI_TRUE 1
+
+
+/* Error codes */
+
+#define JNI_OK 0
+#define JNI_ERR (-1)
+#define JNI_EDETACHED (-2) /* thread detached from the VM */
+#define JNI_EVERSION (-3) /* JNI version error */
+
+
/* JNI datatypes */
-#define jobject java_objectheader*
-#define jclass struct classinfo*
-#define jthrowable jobject
-#define jweak jobject
-#define jarray java_arrayheader*
-#define jlongArray java_longarray*
-#define jbooleanArray java_booleanarray*
-#define jintArray java_intarray*
-#define jcharArray java_chararray*
-#define jbyteArray java_bytearray*
-#define jshortArray java_shortarray*
-#define jdoubleArray java_doublearray*
-#define jfloatArray java_floatarray*
-#define jobjectArray java_objectarray*
-#define jstring jobject
-#define jint s4
-#define jchar s2
-#define jboolean u1
-#define jbyte s1
-#define jshort s2
-#define jlong s8
-#define jfloat float
-#define jdouble double
-#define jsize jint
-#define jfieldID fieldinfo*
-#define jmethodID methodinfo*
-
-typedef struct _JavaVM* JavaVM;
-
-struct _JavaVM{
- void *(*reserved0) ();
- void *(*reserved1) ();
- void *(*reserved2) ();
- jint (*DestroyJavaVM) (JavaVM *);
- jint (*AttachCurrentThread) (JavaVM *, void **, void *);
- jint (*DetachCurrentThread) (JavaVM *);
- jint (*GetEnv) (JavaVM *, void **, jint);
- jint (*AttachCurrentThreadAsDaemon) (JavaVM *, void **, void *);
+#define jboolean u1
+#define jbyte s1
+#define jchar u2
+#define jshort s2
+#define jint s4
+#define jlong s8
+#define jfloat float
+#define jdouble double
-};
+#define jobject java_objectheader*
+#define jclass struct classinfo*
+#define jthrowable jobject
+#define jweak jobject
+#define jarray java_arrayheader*
+#define jlongArray java_longarray*
+#define jbooleanArray java_booleanarray*
+#define jintArray java_intarray*
+#define jcharArray java_chararray*
+#define jbyteArray java_bytearray*
+#define jshortArray java_shortarray*
+#define jdoubleArray java_doublearray*
+#define jfloatArray java_floatarray*
+#define jobjectArray java_objectarray*
+#define jstring jobject
+
+#define jsize jint
+#define jfieldID fieldinfo*
+#define jmethodID methodinfo*
typedef union jvalue {
jobject l;
} jvalue;
-/* JNI-Boolean */
-#define JNI_FALSE 0
-#define JNI_TRUE 1
+typedef struct JDK1_1InitArgs JDK1_1InitArgs;
+
+struct JDK1_1InitArgs {
+ /* The first two fields were reserved in JDK 1.1, and
+ formally introduced in JDK 1.1.2. */
+ /* Java VM version */
+ jint version;
+
+ /* System properties. */
+ char **properties;
+
+ /* whether to check the Java source files are newer than
+ * compiled class files. */
+ jint checkSource;
+
+ /* maximum native stack size of Java-created threads. */
+ jint nativeStackSize;
+
+ /* maximum Java stack size. */
+ jint javaStackSize;
+
+ /* initial heap size. */
+ jint minHeapSize;
+
+ /* maximum heap size. */
+ jint maxHeapSize;
+
+ /* controls whether Java byte code should be verified:
+ * 0 -- none, 1 -- remotely loaded code, 2 -- all code. */
+ jint verifyMode;
+
+ /* the local directory path for class loading. */
+ const char *classpath;
+
+ /* a hook for a function that redirects all VM messages. */
+ jint (*vfprintf)(FILE *fp, const char *format,
+ va_list args);
+
+ /* a VM exit hook. */
+ void (*exit)(jint code);
+
+ /* a VM abort hook. */
+ void (*abort)();
+
+ /* whether to enable class GC. */
+ jint enableClassGC;
+
+ /* whether GC messages will appear. */
+ jint enableVerboseGC;
+
+ /* whether asynchronous GC is allowed. */
+ jint disableAsyncGC;
+
+ /* Three reserved fields. */
+ jint reserved0;
+ jint reserved1;
+ jint reserved2;
+};
+
+
+typedef struct JDK1_1AttachArgs {
+ /*
+ * JDK 1.1 does not need any arguments to attach a
+ * native thread. The padding is here to satisfy the C
+ * compiler which does not permit empty structures.
+ */
+ void *__padding;
+} JDK1_1AttachArgs;
+
+
+typedef struct JNIInvokeInterface *JavaVM;
+/* typedef struct _JavaVM *JavaVM; */
+
+/* struct _JavaVM { */
+struct JNIInvokeInterface {
+ void *(*reserved0) ();
+ void *(*reserved1) ();
+ void *(*reserved2) ();
+ jint (*DestroyJavaVM) (JavaVM *);
+ jint (*AttachCurrentThread) (JavaVM *, void **, void *);
+ jint (*DetachCurrentThread) (JavaVM *);
+ jint (*GetEnv) (JavaVM *, void **, jint);
+ jint (*AttachCurrentThreadAsDaemon) (JavaVM *, void **, void *);
+};
+
/* native method name, signature and function pointer for use in RegisterNatives */
Java VM Interface
*/
-typedef struct JNI_Table *JNIEnv;
+typedef struct JNINativeInterface *JNIEnv;
+/* typedef struct JNI_Table *JNIEnv; */
-struct JNI_Table {
-
+/* struct JNI_Table { */
+struct JNINativeInterface {
/* reserverd for future JNI-functions */
void *unused0;
void *unused1;
jobject (*ToReflectedMethod) (JNIEnv*, jclass cls, jmethodID methodID, jboolean isStatic);
jclass (*GetSuperclass) (JNIEnv*, jclass sub);
- jboolean (*IsAssignableForm) (JNIEnv*, jclass sub, jclass sup);
+ jboolean (*IsAssignableFrom) (JNIEnv*, jclass sub, jclass sup);
jobject (*ToReflectedField) (JNIEnv*, jclass cls, jfieldID fieldID, jboolean isStatic);
const jchar *(*GetStringChars) (JNIEnv*, jstring str, jboolean *isCopy);
void (*ReleaseStringChars) (JNIEnv*, jstring str, const jchar *chars);
- jstring (*NewStringUTF) (JNIEnv*, const char *utf);
+ jstring (*NewStringUTF) (JNIEnv*, const char *bytes);
jsize (*GetStringUTFLength) (JNIEnv*, jstring str);
const char* (*GetStringUTFChars) (JNIEnv*, jstring str, jboolean *isCopy);
void (*ReleaseStringUTFChars) (JNIEnv*, jstring str, const char* chars);
jint (*MonitorExit) (JNIEnv*, jobject obj);
/* JavaVM interface */
+
jint (*GetJavaVM) (JNIEnv*, JavaVM **vm);
+ /* new JNI 1.2 functions */
+
void (*GetStringRegion) (JNIEnv*, jstring str, jsize start, jsize len, jchar *buf);
void (*GetStringUTFRegion) (JNIEnv*, jstring str, jsize start, jsize len, char *buf);
void (*DeleteWeakGlobalRef) (JNIEnv*, jweak ref);
jboolean (*ExceptionCheck) (JNIEnv*);
+
+ /* new JNI 1.4 functions */
+
+ jobject (*NewDirectByteBuffer) (JNIEnv *env, void* address, jlong capacity);
+ void* (*GetDirectBufferAddress) (JNIEnv *env, jobject buf);
+ jlong (*GetDirectBufferCapacity) (JNIEnv *env, jobject buf);
};
-/* the active JNI function table */
+/* function prototypes ********************************************************/
+
+jint JNI_GetDefaultJavaVMInitArgs(void *vm_args);
+jint JNI_GetCreatedJavaVMs(JavaVM **vmBuf, jsize bufLen, jsize *nVMs);
+jint JNI_CreateJavaVM(JavaVM **p_vm, JNIEnv **p_env, void *vm_args);
+
+jfieldID getFieldID_critical(JNIEnv *env, jclass clazz, char *name, char *sig);
+
+jobject GetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID);
+jboolean GetBooleanField(JNIEnv *env, jobject obj, jfieldID fieldID);
+jbyte GetByteField(JNIEnv *env, jobject obj, jfieldID fieldID);
+jchar GetCharField(JNIEnv *env, jobject obj, jfieldID fieldID);
+jshort GetShortField(JNIEnv *env, jobject obj, jfieldID fieldID);
+jint GetIntField(JNIEnv *env, jobject obj, jfieldID fieldID);
+jlong GetLongField(JNIEnv *env, jobject obj, jfieldID fieldID);
+jfloat GetFloatField(JNIEnv *env, jobject obj, jfieldID fieldID);
+jdouble GetDoubleField(JNIEnv *env, jobject obj, jfieldID fieldID);
+
+void SetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID, jobject val);
+void SetBooleanField(JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val);
+void SetByteField(JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val);
+void SetCharField(JNIEnv *env, jobject obj, jfieldID fieldID, jchar val);
+void SetShortField(JNIEnv *env, jobject obj, jfieldID fieldID, jshort val);
+void SetIntField(JNIEnv *env, jobject obj, jfieldID fieldID, jint val);
+void SetLongField(JNIEnv *env, jobject obj, jfieldID fieldID, jlong val);
+void SetFloatField(JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val);
+void SetDoubleField(JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val);
+
+
+#define setField(obj,typ,var,val) *((typ*) ((long int) obj + (long int) var->offset))=val;
+#define getField(obj,typ,var) *((typ*) ((long int) obj + (long int) var->offset))
+#define setfield_critical(clazz,obj,name,sig,jdatatype,val) setField(obj,jdatatype,getFieldID_critical(env,clazz,name,sig),val);
+
+jobject *jni_method_invokeNativeHelper(JNIEnv *env,struct methodinfo *mi,jobject obj, java_objectarray *params);
-extern JNIEnv env;
+void jni_init ();
-extern JavaVM javaVM;
+#endif /* _JNI_H */
-#endif
/*
* These are local overrides for various environment variables in Emacs.