* Removed all Id tags.
[cacao.git] / src / native / jni.h
index ef49f19375e8ddc46aaaf3d48dc557e4e6c7478f..a7cc2751eae999f2e3998a243e93ce450a08cdcb 100644 (file)
@@ -1,9 +1,9 @@
-/* jni.h - JNI types and data structures
+/* src/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, 2006, 2007 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.
 
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA.
-
-   Contact: cacao@complang.tuwien.ac.at
-
-   Authors: ?
-
-   $Id: jni.h 664 2003-11-21 18:24:01Z jowenn $
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
 
 */
 
 
-#ifndef _JNI_H
-#define _JNI_H
-
-#include <stdarg.h>
-
-#define JNIEXPORT
-#define JNICALL
-
-/* 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 *);
+/* GNU Classpath jni.h *********************************************************
 
-};
+   ATTENTION: We include this file before we actually define our own
+   jni.h.  We do this because, otherwise we can get into unresolvable
+   circular header dependencies.
 
+   This is OK as GNU Classpath defines:
 
-typedef union jvalue {
-    jboolean z;
-    jbyte    b;
-    jchar    c;
-    jshort   s;
-    jint     i;
-    jlong    j;
-    jfloat   f;
-    jdouble  d;
-    jobject  l;
-} jvalue;
-
-/* JNI-Boolean */
-
-#define JNI_FALSE 0
-#define JNI_TRUE  1
-
-/* native method name, signature and function pointer for use in RegisterNatives */
-
-typedef struct {
-    char *name;
-    char *signature;
-    void *fnPtr;
-} JNINativeMethod;
-
-
-/* 
-       JNI function table, contains functions for the following usages:        
-       
-       Version Information 
-       Class Operations 
-       Exceptions 
-       Global and Local References 
-       Object Operations 
-       Accessing Fields of Objects 
-       Calling Instance Methods 
-       Accessing Static Fields 
-       Calling Static Methods 
-       String Operations 
-       Array Operations 
-       Registering Native Methods 
-       Monitor Operations 
-       Java VM Interface 
-*/
+   #define _CLASSPATH_JNI_H
 
-typedef struct JNI_Table *JNIEnv;
+   CLASSPATH_JNI_H is in config.h defined.
 
-struct JNI_Table {
-    
-    /* reserverd for future JNI-functions */
-    void *unused0;
-    void *unused1;
-    void *unused2;
-    void *unused3;
-    
-    /* version information */
-    
-    jint (*GetVersion) (JNIEnv*);
+*******************************************************************************/
 
-    /* class operations */
+#include "config.h"
 
-    jclass (*DefineClass) (JNIEnv*, const char *name, jobject loader, const jbyte *buf, jsize len);
-    jclass (*FindClass) (JNIEnv*, const char *name);
+/* XXX quick hack to not include GCJ's jni_md.h */
+#define __GCJ_JNI_MD_H__
 
-    jmethodID (*FromReflectedMethod) (JNIEnv*, jobject method);
-    jfieldID (*FromReflectedField) (JNIEnv*, jobject field);
+#include CLASSPATH_JNI_MD_H
+#include CLASSPATH_JNI_H
 
-    jobject (*ToReflectedMethod) (JNIEnv*, jclass cls, jmethodID methodID, jboolean isStatic);
-
-    jclass (*GetSuperclass) (JNIEnv*, jclass sub);
-    jboolean (*IsAssignableForm) (JNIEnv*, jclass sub, jclass sup);
-
-    jobject (*ToReflectedField) (JNIEnv*, jclass cls, jfieldID fieldID, jboolean isStatic);
+#ifndef _JNI_H
+#define _JNI_H
 
-    /* exceptions */ 
 
-    jint (*Throw) (JNIEnv*, jthrowable obj);
-    jint (*ThrowNew) (JNIEnv*, jclass clazz, const char *msg);
-    jthrowable (*ExceptionOccurred) (JNIEnv*);
-    void (*ExceptionDescribe) (JNIEnv*);
-    void (*ExceptionClear) (JNIEnv*);
-    void (*FatalError) (JNIEnv*, const char *msg);
+#include "vm/types.h"
 
-    /* global and local references */
+#include "vm/global.h"
 
-    jint (*PushLocalFrame) (JNIEnv*, jint capacity);
-    jobject (*PopLocalFrame) (JNIEnv*, jobject result);
-    
-    jobject (*NewGlobalRef) (JNIEnv*, jobject lobj);
-    void (*DeleteGlobalRef) (JNIEnv*, jobject gref);
-    void (*DeleteLocalRef) (JNIEnv*, jobject obj);
-    jboolean (*IsSameObject) (JNIEnv*, jobject obj1, jobject obj2);
-    jobject (*NewLocalRef) (JNIEnv*, jobject ref);
-    jint (*EnsureLocalCapacity) (JNIEnv*, jint capacity);
+#include "vmcore/method.h"
 
-    /* object operations */ 
 
-    jobject (*AllocObject) (JNIEnv*, jclass clazz);
-    jobject (*NewObject) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
-    jobject (*NewObjectV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
-    jobject (*NewObjectA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
+/* _Jv_JNIEnv *****************************************************************/
 
-    jclass (*GetObjectClass) (JNIEnv*, jobject obj);
-    jboolean (*IsInstanceOf) (JNIEnv*, jobject obj, jclass clazz);
+typedef struct _Jv_JNIEnv _Jv_JNIEnv;
 
-    jmethodID (*GetMethodID) (JNIEnv*, jclass clazz, const char *name, const char *sig);
+struct _Jv_JNIEnv {
+       const struct JNINativeInterface_ *env;    /* This MUST be the first entry */
+};
 
-    /* calling instance methods */ 
 
-    jobject (*CallObjectMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
-    jobject (*CallObjectMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
-    jobject (*CallObjectMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue * args);
+/* _Jv_JavaVM *****************************************************************/
 
-    jboolean (*CallBooleanMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
-    jboolean (*CallBooleanMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
-    jboolean (*CallBooleanMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue * args);
+typedef struct _Jv_JavaVM _Jv_JavaVM;
 
-    jbyte (*CallByteMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
-    jbyte (*CallByteMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
-    jbyte (*CallByteMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
+struct _Jv_JavaVM {
+       const struct JNIInvokeInterface_ *functions;/*This MUST be the first entry*/
 
-    jchar (*CallCharMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
-    jchar (*CallCharMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
-    jchar (*CallCharMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
+       /* JVM instance-specific variables */
 
-    jshort (*CallShortMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
-    jshort (*CallShortMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
-    jshort (*CallShortMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
+       s8 starttime;                       /* VM startup time                    */
 
-    jint (*CallIntMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
-    jint (*CallIntMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
-    jint (*CallIntMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
+       s4 Java_gnu_java_lang_management_VMClassLoadingMXBeanImpl_verbose;
+       s4 Java_gnu_java_lang_management_VMMemoryMXBeanImpl_verbose;
+       s4 java_lang_management_ThreadMXBean_PeakThreadCount;
+       s4 java_lang_management_ThreadMXBean_ThreadCount;
+       s8 java_lang_management_ThreadMXBean_TotalStartedThreadCount;
+       s4 Java_java_lang_VMClassLoader_defaultAssertionStatus;
+};
 
-    jlong (*CallLongMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
-    jlong (*CallLongMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
-    jlong (*CallLongMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
 
-    jfloat (*CallFloatMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
-    jfloat (*CallFloatMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
-    jfloat (*CallFloatMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
+/* CACAO related stuff ********************************************************/
 
-    jdouble (*CallDoubleMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
-    jdouble (*CallDoubleMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
-    jdouble (*CallDoubleMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
+extern const struct JNIInvokeInterface_ _Jv_JNIInvokeInterface;
+extern struct JNINativeInterface_ _Jv_JNINativeInterface;
 
-    void (*CallVoidMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
-    void (*CallVoidMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
-    void (*CallVoidMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue * args);
-
-    jobject (*CallNonvirtualObjectMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
-    jobject (*CallNonvirtualObjectMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
-    jobject (*CallNonvirtualObjectMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue * args);
 
-    jboolean (*CallNonvirtualBooleanMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
-    jboolean (*CallNonvirtualBooleanMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
-    jboolean (*CallNonvirtualBooleanMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue * args);
+/* hashtable_global_ref_entry *************************************************/
 
-    jbyte (*CallNonvirtualByteMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
-    jbyte (*CallNonvirtualByteMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
-    jbyte (*CallNonvirtualByteMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
+typedef struct hashtable_global_ref_entry hashtable_global_ref_entry;
 
-    jchar (*CallNonvirtualCharMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
-    jchar (*CallNonvirtualCharMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
-    jchar (*CallNonvirtualCharMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
-
-    jshort (*CallNonvirtualShortMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
-    jshort (*CallNonvirtualShortMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
-    jshort (*CallNonvirtualShortMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
-
-    jint (*CallNonvirtualIntMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
-    jint (*CallNonvirtualIntMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
-    jint (*CallNonvirtualIntMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
-
-    jlong (*CallNonvirtualLongMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
-    jlong (*CallNonvirtualLongMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
-    jlong (*CallNonvirtualLongMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
-
-    jfloat (*CallNonvirtualFloatMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
-    jfloat (*CallNonvirtualFloatMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
-    jfloat (*CallNonvirtualFloatMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
-
-    jdouble (*CallNonvirtualDoubleMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
-    jdouble (*CallNonvirtualDoubleMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
-    jdouble (*CallNonvirtualDoubleMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
-
-    void (*CallNonvirtualVoidMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
-    void (*CallNonvirtualVoidMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
-    void (*CallNonvirtualVoidMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue * args);
-
-    /* accessing fields */
-
-    jfieldID (*GetFieldID) (JNIEnv*, jclass clazz, const char *name, const char *sig);
-
-    jobject (*GetObjectField) (JNIEnv*, jobject obj, jfieldID fieldID);
-    jboolean (*GetBooleanField) (JNIEnv*, jobject obj, jfieldID fieldID);
-    jbyte (*GetByteField) (JNIEnv*, jobject obj, jfieldID fieldID);
-    jchar (*GetCharField) (JNIEnv*, jobject obj, jfieldID fieldID);
-    jshort (*GetShortField) (JNIEnv*, jobject obj, jfieldID fieldID);
-    jint (*GetIntField) (JNIEnv*, jobject obj, jfieldID fieldID);
-    jlong (*GetLongField) (JNIEnv*, jobject obj, jfieldID fieldID);
-    jfloat (*GetFloatField) (JNIEnv*, jobject obj, jfieldID fieldID);
-    jdouble (*GetDoubleField) (JNIEnv*, jobject obj, jfieldID fieldID);
-
-    void (*SetObjectField) (JNIEnv*, jobject obj, jfieldID fieldID, jobject val);
-    void (*SetBooleanField) (JNIEnv*, jobject obj, jfieldID fieldID, jboolean val);
-    void (*SetByteField) (JNIEnv*, jobject obj, jfieldID fieldID, jbyte val);
-    void (*SetCharField) (JNIEnv*, jobject obj, jfieldID fieldID, jchar val);
-    void (*SetShortField) (JNIEnv*, jobject obj, jfieldID fieldID, jshort val);
-    void (*SetIntField) (JNIEnv*, jobject obj, jfieldID fieldID, jint val);
-    void (*SetLongField) (JNIEnv*, jobject obj, jfieldID fieldID, jlong val);
-    void (*SetFloatField) (JNIEnv*, jobject obj, jfieldID fieldID, jfloat val);
-    void (*SetDoubleField) (JNIEnv*, jobject obj, jfieldID fieldID, jdouble val);
-
-    /* calling static methods */ 
-    
-    jmethodID (*GetStaticMethodID) (JNIEnv*, jclass clazz, const char *name, const char *sig);
-
-    jobject (*CallStaticObjectMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
-    jobject (*CallStaticObjectMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
-    jobject (*CallStaticObjectMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
-
-    jboolean (*CallStaticBooleanMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
-    jboolean (*CallStaticBooleanMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
-    jboolean (*CallStaticBooleanMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
-
-    jbyte (*CallStaticByteMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
-    jbyte (*CallStaticByteMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
-    jbyte (*CallStaticByteMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
-
-    jchar (*CallStaticCharMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
-    jchar (*CallStaticCharMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
-    jchar (*CallStaticCharMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
-
-    jshort (*CallStaticShortMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
-    jshort (*CallStaticShortMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
-    jshort (*CallStaticShortMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
-
-    jint (*CallStaticIntMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
-    jint (*CallStaticIntMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
-    jint (*CallStaticIntMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
-
-    jlong (*CallStaticLongMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
-    jlong (*CallStaticLongMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
-    jlong (*CallStaticLongMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
-
-    jfloat (*CallStaticFloatMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
-    jfloat (*CallStaticFloatMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
-    jfloat (*CallStaticFloatMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
-
-    jdouble (*CallStaticDoubleMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
-    jdouble (*CallStaticDoubleMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
-    jdouble (*CallStaticDoubleMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
-
-    void (*CallStaticVoidMethod) (JNIEnv*, jclass cls, jmethodID methodID, ...);
-    void (*CallStaticVoidMethodV) (JNIEnv*, jclass cls, jmethodID methodID, va_list args);
-    void (*CallStaticVoidMethodA) (JNIEnv*, jclass cls, jmethodID methodID, jvalue * args);
-
-    /* accessing static fields */
-
-    jfieldID (*GetStaticFieldID) (JNIEnv*, jclass clazz, const char *name, const char *sig);
-    jobject (*GetStaticObjectField) (JNIEnv*, jclass clazz, jfieldID fieldID);
-    jboolean (*GetStaticBooleanField) (JNIEnv*, jclass clazz, jfieldID fieldID);
-    jbyte (*GetStaticByteField) (JNIEnv*, jclass clazz, jfieldID fieldID);
-    jchar (*GetStaticCharField) (JNIEnv*, jclass clazz, jfieldID fieldID);
-    jshort (*GetStaticShortField) (JNIEnv*, jclass clazz, jfieldID fieldID);
-    jint (*GetStaticIntField) (JNIEnv*, jclass clazz, jfieldID fieldID);
-    jlong (*GetStaticLongField) (JNIEnv*, jclass clazz, jfieldID fieldID);
-    jfloat (*GetStaticFloatField) (JNIEnv*, jclass clazz, jfieldID fieldID);
-    jdouble (*GetStaticDoubleField) (JNIEnv*, jclass clazz, jfieldID fieldID);
-
-    void (*SetStaticObjectField) (JNIEnv*, jclass clazz, jfieldID fieldID, jobject value);
-    void (*SetStaticBooleanField) (JNIEnv*, jclass clazz, jfieldID fieldID, jboolean value);
-    void (*SetStaticByteField) (JNIEnv*, jclass clazz, jfieldID fieldID, jbyte value);
-    void (*SetStaticCharField) (JNIEnv*, jclass clazz, jfieldID fieldID, jchar value);
-    void (*SetStaticShortField) (JNIEnv*, jclass clazz, jfieldID fieldID, jshort value);
-    void (*SetStaticIntField) (JNIEnv*, jclass clazz, jfieldID fieldID, jint value);
-    void (*SetStaticLongField) (JNIEnv*, jclass clazz, jfieldID fieldID, jlong value);
-    void (*SetStaticFloatField) (JNIEnv*, jclass clazz, jfieldID fieldID, jfloat value);
-    void (*SetStaticDoubleField) (JNIEnv*, jclass clazz, jfieldID fieldID, jdouble value);
-
-    /* string operations */ 
-
-    jstring (*NewString) (JNIEnv*, const jchar *unicode, jsize len);
-    jsize (*GetStringLength) (JNIEnv*, jstring str);
-    const jchar *(*GetStringChars) (JNIEnv*, jstring str, jboolean *isCopy);
-    void (*ReleaseStringChars) (JNIEnv*, jstring str, const jchar *chars);
-
-    jstring (*NewStringUTF) (JNIEnv*, const char *utf);
-    jsize (*GetStringUTFLength) (JNIEnv*, jstring str);
-    const char* (*GetStringUTFChars) (JNIEnv*, jstring str, jboolean *isCopy);
-    void (*ReleaseStringUTFChars) (JNIEnv*, jstring str, const char* chars);
-
-    /* array operations */
-
-    jsize (*GetArrayLength) (JNIEnv*, jarray array);
-
-    jobjectArray (*NewObjectArray) (JNIEnv*, jsize len, jclass clazz, jobject init);
-    jobject (*GetObjectArrayElement) (JNIEnv*, jobjectArray array, jsize index);
-    void (*SetObjectArrayElement) (JNIEnv*, jobjectArray array, jsize index, jobject val);
-
-    jbooleanArray (*NewBooleanArray) (JNIEnv*, jsize len);
-    jbyteArray (*NewByteArray) (JNIEnv*, jsize len);
-    jcharArray (*NewCharArray) (JNIEnv*, jsize len);
-    jshortArray (*NewShortArray) (JNIEnv*, jsize len);
-    jintArray (*NewIntArray) (JNIEnv*, jsize len);
-    jlongArray (*NewLongArray) (JNIEnv*, jsize len);
-    jfloatArray (*NewFloatArray) (JNIEnv*, jsize len);
-    jdoubleArray (*NewDoubleArray) (JNIEnv*, jsize len);
-
-    jboolean * (*GetBooleanArrayElements) (JNIEnv*, jbooleanArray array, jboolean *isCopy);
-    jbyte * (*GetByteArrayElements) (JNIEnv*, jbyteArray array, jboolean *isCopy);
-    jchar * (*GetCharArrayElements) (JNIEnv*, jcharArray array, jboolean *isCopy);
-    jshort * (*GetShortArrayElements) (JNIEnv*, jshortArray array, jboolean *isCopy);
-    jint * (*GetIntArrayElements) (JNIEnv*, jintArray array, jboolean *isCopy);
-    jlong * (*GetLongArrayElements) (JNIEnv*, jlongArray array, jboolean *isCopy);
-    jfloat * (*GetFloatArrayElements) (JNIEnv*, jfloatArray array, jboolean *isCopy);
-    jdouble * (*GetDoubleArrayElements) (JNIEnv*, jdoubleArray array, jboolean *isCopy);
-
-    void (*ReleaseBooleanArrayElements) (JNIEnv*, jbooleanArray array, jboolean *elems, jint mode);
-    void (*ReleaseByteArrayElements) (JNIEnv*, jbyteArray array, jbyte *elems, jint mode);
-    void (*ReleaseCharArrayElements) (JNIEnv*, jcharArray array, jchar *elems, jint mode);
-    void (*ReleaseShortArrayElements) (JNIEnv*, jshortArray array, jshort *elems, jint mode);
-    void (*ReleaseIntArrayElements) (JNIEnv*, jintArray array, jint *elems, jint mode);
-    void (*ReleaseLongArrayElements) (JNIEnv*, jlongArray array, jlong *elems, jint mode);
-    void (*ReleaseFloatArrayElements) (JNIEnv*, jfloatArray array, jfloat *elems, jint mode);
-    void (*ReleaseDoubleArrayElements) (JNIEnv*, jdoubleArray array, jdouble *elems, jint mode);
-
-    void (*GetBooleanArrayRegion) (JNIEnv*, jbooleanArray array, jsize start, jsize l, jboolean *buf);
-    void (*GetByteArrayRegion) (JNIEnv*, jbyteArray array, jsize start, jsize len, jbyte *buf);
-    void (*GetCharArrayRegion) (JNIEnv*, jcharArray array, jsize start, jsize len, jchar *buf);
-    void (*GetShortArrayRegion) (JNIEnv*, jshortArray array, jsize start, jsize len, jshort *buf);
-    void (*GetIntArrayRegion) (JNIEnv*, jintArray array, jsize start, jsize len, jint *buf);
-    void (*GetLongArrayRegion) (JNIEnv*, jlongArray array, jsize start, jsize len, jlong *buf);
-    void (*GetFloatArrayRegion) (JNIEnv*, jfloatArray array, jsize start, jsize len, jfloat *buf);
-    void (*GetDoubleArrayRegion) (JNIEnv*, jdoubleArray array, jsize start, jsize len, jdouble *buf);
-
-    void (*SetBooleanArrayRegion) (JNIEnv*, jbooleanArray array, jsize start, jsize l, jboolean *buf);
-    void (*SetByteArrayRegion) (JNIEnv*, jbyteArray array, jsize start, jsize len, jbyte *buf);
-    void (*SetCharArrayRegion) (JNIEnv*, jcharArray array, jsize start, jsize len, jchar *buf);
-    void (*SetShortArrayRegion) (JNIEnv*, jshortArray array, jsize start, jsize len, jshort *buf);
-    void (*SetIntArrayRegion) (JNIEnv*, jintArray array, jsize start, jsize len, jint *buf);
-    void (*SetLongArrayRegion) (JNIEnv*, jlongArray array, jsize start, jsize len, jlong *buf);
-    void (*SetFloatArrayRegion) (JNIEnv*, jfloatArray array, jsize start, jsize len, jfloat *buf);
-    void (*SetDoubleArrayRegion) (JNIEnv*, jdoubleArray array, jsize start, jsize len, jdouble *buf);
-
-    /* registering native methods */
-
-    jint (*RegisterNatives) (JNIEnv*, jclass clazz, const JNINativeMethod *methods, jint nMethods);
-    jint (*UnregisterNatives) (JNIEnv*, jclass clazz);
-
-    /* monitor operations */
-
-    jint (*MonitorEnter) (JNIEnv*, jobject obj);
-    jint (*MonitorExit) (JNIEnv*, jobject obj);
-
-    /* JavaVM interface */
-    jint (*GetJavaVM) (JNIEnv*, JavaVM **vm);
-
-    void (*GetStringRegion) (JNIEnv*, jstring str, jsize start, jsize len, jchar *buf);
-    void (*GetStringUTFRegion) (JNIEnv*, jstring str, jsize start, jsize len, char *buf);
-
-    void * (*GetPrimitiveArrayCritical) (JNIEnv*, jarray array, jboolean *isCopy);
-    void (*ReleasePrimitiveArrayCritical) (JNIEnv*, jarray array, void *carray, jint mode);
-
-    const jchar * (*GetStringCritical) (JNIEnv*, jstring string, jboolean *isCopy);
-    void (*ReleaseStringCritical) (JNIEnv*, jstring string, const jchar *cstring);
-
-    jweak (*NewWeakGlobalRef) (JNIEnv*, jobject obj);
-    void (*DeleteWeakGlobalRef) (JNIEnv*, jweak ref);
-
-    jboolean (*ExceptionCheck) (JNIEnv*);
+struct hashtable_global_ref_entry {
+       java_object_t              *o;      /* object pointer of global ref       */
+       s4                          refs;   /* references of the current pointer  */
+       hashtable_global_ref_entry *hashlink; /* link for external chaining       */
 };
 
 
-/* the active JNI function table */
+/* function prototypes ********************************************************/
+
+/* initialize JNI subsystem */
+bool jni_init(void);
 
-extern JNIEnv env;
+java_handle_t *_Jv_jni_invokeNative(methodinfo *m, java_handle_t *o,
+                                                                       java_handle_objectarray_t *params);
 
-extern JavaVM javaVM;
+#endif /* _JNI_H */
 
-#endif
 
 /*
  * These are local overrides for various environment variables in Emacs.