* exceptions_throw_illegalargumentexception,
[cacao.git] / src / native / jni.c
index 45c6c1ac59071592ded3858fd02fb438dfadc94c..c1711f00ada23c40ad4bb476e2b3fb52a9745c6c 100644 (file)
             Martin Platter
             Christian Thalinger
 
-   $Id: jni.c 3409 2005-10-12 11:28:23Z twisti $
+   $Id: jni.c 4123 2006-01-10 20:46:50Z twisti $
 
 */
 
 
+#include "config.h"
+
 #include <assert.h>
 #include <string.h>
 
-#include "config.h"
+#include "vm/types.h"
 
 #include "mm/boehm.h"
 #include "mm/memory.h"
@@ -96,7 +98,6 @@
 #include "vm/resolve.h"
 #include "vm/statistics.h"
 #include "vm/stringlocal.h"
-#include "vm/tables.h"
 #include "vm/jit/asmpart.h"
 #include "vm/jit/jit.h"
 #include "vm/statistics.h"
@@ -130,40 +131,37 @@ static methodinfo *removemid = NULL;
 
 /* direct buffer stuff ********************************************************/
 
-static utf *utf_java_nio_DirectByteBufferImpl;
+static utf *utf_java_nio_DirectByteBufferImpl_ReadWrite;
 #if SIZEOF_VOID_P == 8
 static utf *utf_gnu_classpath_Pointer64;
 #else
 static utf *utf_gnu_classpath_Pointer32;
 #endif
 
-static classinfo *class_java_nio_DirectByteBufferImpl;
+static classinfo *class_java_nio_DirectByteBufferImpl_ReadWrite;
 #if SIZEOF_VOID_P == 8
 static classinfo *class_gnu_classpath_Pointer64;
 #else
 static classinfo *class_gnu_classpath_Pointer32;
 #endif
 
+static methodinfo *dbbirw_init;
 
-/* local reference table ******************************************************/
 
-#if defined(USE_THREADS)
-#define LOCALREFTABLE    (THREADINFO->_localref_table)
-#else
-#define LOCALREFTABLE    (_no_threads_localref_table)
-#endif
+/* local reference table ******************************************************/
 
 #if !defined(USE_THREADS)
-static localref_table *_no_threads_localref_table;
+localref_table *_no_threads_localref_table;
 #endif
 
 
-/********************* accessing instance-fields **********************************/
+/* accessing instance fields macros *******************************************/
 
-#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);
+#define SET_FIELD(obj,type,var,value) \
+    *((type *) ((ptrint) (obj) + (ptrint) (var)->offset)) = (type) (value)
+
+#define GET_FIELD(obj,type,var) \
+    *((type *) ((ptrint) (obj) + (ptrint) (var)->offset))
 
 
 /* some forward declarations **************************************************/
@@ -206,14 +204,20 @@ bool jni_init(void)
 
        /* direct buffer stuff */
 
-       utf_java_nio_DirectByteBufferImpl =
-               utf_new_char("java/nio/DirectByteBufferImpl");
+       utf_java_nio_DirectByteBufferImpl_ReadWrite =
+               utf_new_char("java/nio/DirectByteBufferImpl$ReadWrite");
+
+       if (!(class_java_nio_DirectByteBufferImpl_ReadWrite =
+                 load_class_bootstrap(utf_java_nio_DirectByteBufferImpl_ReadWrite)))
+               return false;
 
-       if (!(class_java_nio_DirectByteBufferImpl =
-                 load_class_bootstrap(utf_java_nio_DirectByteBufferImpl)))
+       if (!link_class(class_java_nio_DirectByteBufferImpl_ReadWrite))
                return false;
 
-       if (!link_class(class_java_nio_DirectByteBufferImpl))
+       if (!(dbbirw_init =
+               class_resolvemethod(class_java_nio_DirectByteBufferImpl_ReadWrite,
+                                                       utf_init,
+                                                       utf_new_char("(Ljava/lang/Object;Lgnu/classpath/Pointer;III)V"))))
                return false;
 
 #if SIZEOF_VOID_P == 8
@@ -444,7 +448,7 @@ static bool fill_callblock_from_objectarray(void *obj, methoddesc *descr,
 
                                if (params->data[j] != 0) {
                                        if (paramtypes->arraydim > 0) {
-                                               if (!builtin_arrayinstanceof(params->data[j], c->vftbl))
+                                               if (!builtin_arrayinstanceof(params->data[j], c))
                                                        goto illegal_arg;
 
                                        } else {
@@ -468,7 +472,7 @@ static bool fill_callblock_from_objectarray(void *obj, methoddesc *descr,
        return true;
 
 illegal_arg:
-       *exceptionptr = new_exception(string_java_lang_IllegalArgumentException);
+       exceptions_throw_illegalargumentexception();
        return false;
 }
 
@@ -521,7 +525,7 @@ static jobject callObjectMethod(jobject obj, jmethodID methodID, va_list args)
 
        fill_callblock_from_vargs(obj, methodID->parseddesc, blk, args, TYPE_ADR);
 
-       STATS(jnicallXmethodnvokation();)
+       STATISTICS(jnicallXmethodnvokation());
 
        ret = asm_calljavafunction2(methodID,
                                                                argcount,
@@ -544,7 +548,7 @@ static jint callIntegerMethod(jobject obj, jmethodID methodID, int retType, va_l
        jni_callblock *blk;
        jint ret;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
         /*
         log_text("JNI-Call: CallObjectMethodV");
@@ -576,7 +580,7 @@ static jint callIntegerMethod(jobject obj, jmethodID methodID, int retType, va_l
 
        fill_callblock_from_vargs(obj, methodID->parseddesc, blk, args, retType);
 
-       STATS(jnicallXmethodnvokation();)
+       STATISTICS(jnicallXmethodnvokation());
 
        ret = asm_calljavafunction2int(methodID,
                                                                   argcount,
@@ -601,7 +605,7 @@ static jlong callLongMethod(jobject obj, jmethodID methodID, va_list args)
        jni_callblock *blk;
        jlong          ret;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (methodID == 0) {
                *exceptionptr = new_exception(string_java_lang_NoSuchMethodError); 
@@ -625,7 +629,7 @@ static jlong callLongMethod(jobject obj, jmethodID methodID, va_list args)
 
        fill_callblock_from_vargs(obj, methodID->parseddesc, blk, args, TYPE_LNG);
 
-       STATS(jnicallXmethodnvokation();)
+       STATISTICS(jnicallXmethodnvokation());
 
        ret = asm_calljavafunction2long(methodID,
                                                                        argcount,
@@ -645,7 +649,7 @@ static jdouble callFloatMethod(jobject obj, jmethodID methodID, va_list args,int
        jni_callblock *blk;
        jdouble ret;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        assert(0);
 
@@ -660,7 +664,9 @@ static jdouble callFloatMethod(jobject obj, jmethodID methodID, va_list args,int
        fill_callblock_from_vargs(obj, methodID->parseddesc, blk, args, retType);
 
        /*      printf("parameter: obj: %p",blk[0].item); */
-       STATS(jnicallXmethodnvokation();)
+
+       STATISTICS(jnicallXmethodnvokation());
+
        ret = asm_calljavafunction2double(methodID,
                                                                          argcount + 1,
                                                                          (argcount + 1) * sizeof(jni_callblock),
@@ -696,6 +702,7 @@ static void cacao_jni_CallVoidMethod(jobject obj, jmethodID m, va_list ap)
 
        paramcount = m->parseddesc->paramcount;
 
+/* #error XXX does not work on intrp, but on JIT */
        if (!(m->flags & ACC_STATIC))
                paramcount++;
 
@@ -703,7 +710,7 @@ static void cacao_jni_CallVoidMethod(jobject obj, jmethodID m, va_list ap)
 
        fill_callblock_from_vargs(obj, m->parseddesc, blk, ap, TYPE_VOID);
 
-       STATS(jnicallXmethodnvokation();)
+       STATISTICS(jnicallXmethodnvokation());
 
        (void) asm_calljavafunction2(m,
                                                                 paramcount,
@@ -725,7 +732,7 @@ static void cacao_jni_CallVoidMethod(jobject obj, jmethodID m, va_list ap)
 
 jint GetVersion(JNIEnv *env)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        /* we support JNI 1.4 */
 
@@ -751,7 +758,7 @@ jclass DefineClass(JNIEnv *env, const char *name, jobject loader,
        java_bytearray        *ba;
        jclass                 c;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        cl = (java_lang_ClassLoader *) loader;
        s = javastring_new_char(name);
@@ -760,7 +767,7 @@ jclass DefineClass(JNIEnv *env, const char *name, jobject loader,
        c = (jclass) Java_java_lang_VMClassLoader_defineClass(env, NULL, cl, s, ba,
                                                                                                                  0, bufLen, NULL);
 
-       return c;
+       return (jclass) NewLocalRef(env, (jobject) c);
 }
 
 
@@ -778,7 +785,7 @@ jclass FindClass(JNIEnv *env, const char *name)
        classinfo         *c;
        java_objectheader *cl;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        u = utf_new_char_classname((char *) name);
 
@@ -806,9 +813,6 @@ jclass FindClass(JNIEnv *env, const char *name)
        if (!link_class(c))
                return NULL;
 
-       if (!use_class_as_object(c))
-               return NULL;
-
        return (jclass) NewLocalRef(env, (jobject) c);
 }
   
@@ -826,7 +830,7 @@ jmethodID FromReflectedMethod(JNIEnv *env, jobject method)
        classinfo  *c;
        s4          slot;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (method == NULL)
                return NULL;
@@ -872,16 +876,15 @@ jmethodID FromReflectedMethod(JNIEnv *env, jobject method)
 jclass GetSuperclass(JNIEnv *env, jclass sub)
 {
        classinfo *c;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
        c = ((classinfo *) sub)->super.cls;
 
        if (!c)
                return NULL;
 
-       use_class_as_object(c);
-
-       return c;
+       return (jclass) NewLocalRef(env, (jobject) c);
 }
   
  
@@ -893,7 +896,8 @@ jclass GetSuperclass(JNIEnv *env, jclass sub)
 
 jboolean IsAssignableFrom(JNIEnv *env, jclass sub, jclass sup)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        return Java_java_lang_VMClass_isAssignableFrom(env,
                                                                                                   NULL,
                                                                                                   (java_lang_Class *) sup,
@@ -901,16 +905,6 @@ jboolean IsAssignableFrom(JNIEnv *env, jclass sub, jclass sup)
 }
 
 
-/***** converts a field ID derived from cls to a java.lang.reflect.Field object ***/
-
-jobject ToReflectedField(JNIEnv* env, jclass cls, jfieldID fieldID, jboolean isStatic)
-{
-       log_text("JNI-Call: ToReflectedField: IMPLEMENT ME!!!");
-       STATS(jniinvokation();)
-       return NULL;
-}
-
-
 /* Throw ***********************************************************************
 
    Causes a java.lang.Throwable object to be thrown.
@@ -919,8 +913,9 @@ jobject ToReflectedField(JNIEnv* env, jclass cls, jfieldID fieldID, jboolean isS
 
 jint Throw(JNIEnv *env, jthrowable obj)
 {
+       STATISTICS(jniinvokation());
+
        *exceptionptr = (java_objectheader *) obj;
-       STATS(jniinvokation();)
 
        return JNI_OK;
 }
@@ -938,7 +933,8 @@ jint ThrowNew(JNIEnv* env, jclass clazz, const char *msg)
 {
        java_lang_Throwable *o;
        java_lang_String    *s;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
        s = (java_lang_String *) javastring_new_char(msg);
 
@@ -968,7 +964,7 @@ jthrowable ExceptionOccurred(JNIEnv *env)
 {
        java_objectheader *e;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        e = *exceptionptr;
 
@@ -988,7 +984,8 @@ void ExceptionDescribe(JNIEnv *env)
 {
        java_objectheader *e;
        methodinfo        *m;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
        e = *exceptionptr;
 
@@ -1025,7 +1022,7 @@ void ExceptionDescribe(JNIEnv *env)
 
 void ExceptionClear(JNIEnv *env)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        *exceptionptr = NULL;
 }
@@ -1040,7 +1037,7 @@ void ExceptionClear(JNIEnv *env)
 
 void FatalError(JNIEnv *env, const char *msg)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        throw_cacao_exception_exit(string_java_lang_InternalError, msg);
 }
@@ -1055,7 +1052,7 @@ void FatalError(JNIEnv *env, const char *msg)
 
 jint PushLocalFrame(JNIEnv* env, jint capacity)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: PushLocalFrame: IMPLEMENT ME!");
 
@@ -1074,7 +1071,7 @@ jint PushLocalFrame(JNIEnv* env, jint capacity)
 
 jobject PopLocalFrame(JNIEnv* env, jobject result)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: PopLocalFrame: IMPLEMENT ME!");
 
@@ -1098,7 +1095,7 @@ void DeleteLocalRef(JNIEnv *env, jobject localRef)
        localref_table    *lrt;
        s4                 i;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        o = (java_objectheader *) localRef;
 
@@ -1133,7 +1130,7 @@ void DeleteLocalRef(JNIEnv *env, jobject localRef)
 
 jboolean IsSameObject(JNIEnv *env, jobject ref1, jobject ref2)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (ref1 == ref2)
                return JNI_TRUE;
@@ -1153,7 +1150,7 @@ jobject NewLocalRef(JNIEnv *env, jobject ref)
        localref_table *lrt;
        s4              i;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (ref == NULL)
                return NULL;
@@ -1182,6 +1179,10 @@ jobject NewLocalRef(JNIEnv *env, jobject ref)
        /* should not happen, just to be sure */
 
        assert(0);
+
+       /* keep compiler happy */
+
+       return NULL;
 }
 
 
@@ -1196,7 +1197,7 @@ jint EnsureLocalCapacity(JNIEnv* env, jint capacity)
 {
        localref_table *lrt;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        /* get local reference table (thread specific) */
 
@@ -1224,7 +1225,7 @@ jobject AllocObject(JNIEnv *env, jclass clazz)
 {
        java_objectheader *o;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if ((clazz->flags & ACC_INTERFACE) || (clazz->flags & ACC_ABSTRACT)) {
                *exceptionptr =
@@ -1253,7 +1254,7 @@ jobject NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
        java_objectheader *o;
        va_list            ap;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        /* create object */
 
@@ -1281,7 +1282,7 @@ jobject NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
 
 jobject NewObjectV(JNIEnv* env, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: NewObjectV: IMPLEMENT ME!");
 
@@ -1299,7 +1300,7 @@ jobject NewObjectV(JNIEnv* env, jclass clazz, jmethodID methodID, va_list args)
 
 jobject NewObjectA(JNIEnv* env, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: NewObjectA: IMPLEMENT ME!");
 
@@ -1316,14 +1317,15 @@ jobject NewObjectA(JNIEnv* env, jclass clazz, jmethodID methodID, jvalue *args)
 jclass GetObjectClass(JNIEnv *env, jobject obj)
 {
        classinfo *c;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
        
        if (!obj || !obj->vftbl)
                return NULL;
 
        c = obj->vftbl->class;
-       use_class_as_object(c);
-       return c;
+
+       return (jclass) NewLocalRef(env, (jobject) c);
 }
 
 
@@ -1335,7 +1337,7 @@ jclass GetObjectClass(JNIEnv *env, jobject obj)
 
 jboolean IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        return Java_java_lang_VMClass_isInstance(env,
                                                                                         NULL,
@@ -1351,7 +1353,9 @@ jfieldID FromReflectedField(JNIEnv* env, jobject field)
        java_lang_reflect_Field *f;
        classinfo *c;
        jfieldID fid;   /* the JNI-fieldid of the wrapping object */
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
+
        /*log_text("JNI-Call: FromReflectedField");*/
 
        f=(java_lang_reflect_Field *)field;
@@ -1368,41 +1372,83 @@ jfieldID FromReflectedField(JNIEnv* env, jobject field)
 }
 
 
-/**********************************************************************************
+/* ToReflectedMethod ***********************************************************
 
-       converts a method ID to a java.lang.reflect.Method or 
-       java.lang.reflect.Constructor object
+   Converts a method ID derived from cls to an instance of the
+   java.lang.reflect.Method class or to an instance of the
+   java.lang.reflect.Constructor class.
 
-**********************************************************************************/
+*******************************************************************************/
 
 jobject ToReflectedMethod(JNIEnv* env, jclass cls, jmethodID methodID, jboolean isStatic)
 {
-       log_text("JNI-Call: ToReflectedMethod");
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: ToReflectedMethod: IMPLEMENT ME!");
+
+       return NULL;
+}
+
+
+/* ToReflectedField ************************************************************
+
+   Converts a field ID derived from cls to an instance of the
+   java.lang.reflect.Field class.
+
+*******************************************************************************/
+
+jobject ToReflectedField(JNIEnv* env, jclass cls, jfieldID fieldID,
+                                                jboolean isStatic)
+{
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: ToReflectedField: IMPLEMENT ME!");
 
        return NULL;
 }
 
 
+/* Calling Instance Methods ***************************************************/
+
 /* GetMethodID *****************************************************************
 
-   returns the method ID for an instance method
+   Returns the method ID for an instance (nonstatic) method of a class
+   or interface. The method may be defined in one of the clazz's
+   superclasses and inherited by clazz. The method is determined by
+   its name and signature.
+
+   GetMethodID() causes an uninitialized class to be initialized.
 
 *******************************************************************************/
 
-jmethodID GetMethodID(JNIEnv* env, jclass clazz, const char *name, const char *sig)
+jmethodID GetMethodID(JNIEnv* env, jclass clazz, const char *name,
+                                         const char *sig)
 {
+       classinfo  *c;
+       utf        *uname;
+       utf        *udesc;
        methodinfo *m;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
+       c = (classinfo *) clazz;
+
+       if (!c)
+               return NULL;
+
+       if (!(c->state & CLASS_INITIALIZED))
+               if (!initialize_class(c))
+                       return NULL;
+
+       /* try to get the method of the class or one of it's superclasses */
 
-       m = class_resolvemethod(clazz, 
-                                                       utf_new_char((char *) name), 
-                                                       utf_new_char((char *) sig));
+       uname = utf_new_char((char *) name);
+       udesc = utf_new_char((char *) sig);
+
+       m = class_resolvemethod(clazz, uname, udesc);
 
        if (!m || (m->flags & ACC_STATIC)) {
-               *exceptionptr =
-                       new_exception_message(string_java_lang_NoSuchMethodError, name);
+               *exceptionptr = exceptions_new_nosuchmethoderror(c, uname, udesc);
 
                return NULL;
        }
@@ -1418,7 +1464,7 @@ jobject CallObjectMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
        java_objectheader* ret;
        va_list            vaargs;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        va_start(vaargs, methodID);
        ret = callObjectMethod(obj, methodID, vaargs);
@@ -1432,7 +1478,7 @@ jobject CallObjectMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list
 {
        java_objectheader* ret;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        ret = callObjectMethod(obj, methodID, args);
 
@@ -1442,7 +1488,7 @@ jobject CallObjectMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list
 
 jobject CallObjectMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: CallObjectMethodA: IMPLEMENT ME!");
 
@@ -1456,7 +1502,8 @@ jboolean CallBooleanMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
 {
        jboolean ret;
        va_list vaargs;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
 /*     log_text("JNI-Call: CallBooleanMethod");*/
 
@@ -1469,7 +1516,7 @@ jboolean CallBooleanMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
 
 jboolean CallBooleanMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        return (jboolean)callIntegerMethod(obj,get_virtual(obj,methodID),PRIMITIVETYPE_BOOLEAN,args);
 
@@ -1477,7 +1524,8 @@ jboolean CallBooleanMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_li
 
 jboolean CallBooleanMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        log_text("JNI-Call: CallBooleanMethodA");
 
        return 0;
@@ -1487,7 +1535,8 @@ jbyte CallByteMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
 {
        jbyte ret;
        va_list vaargs;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
 /*     log_text("JNI-Call: CallVyteMethod");*/
 
@@ -1501,7 +1550,8 @@ jbyte CallByteMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
 jbyte CallByteMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
 {
 /*     log_text("JNI-Call: CallByteMethodV");*/
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
        return callIntegerMethod(obj,methodID,PRIMITIVETYPE_BYTE,args);
 }
@@ -1509,8 +1559,9 @@ jbyte CallByteMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list arg
 
 jbyte CallByteMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
 {
-       log_text("JNI-Call: CallByteMethodA");
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallByteMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -1520,7 +1571,8 @@ jchar CallCharMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 {
        jchar ret;
        va_list vaargs;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
 /*     log_text("JNI-Call: CallCharMethod");*/
 
@@ -1534,18 +1586,19 @@ jchar CallCharMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 
 jchar CallCharMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
 /*     log_text("JNI-Call: CallCharMethodV");*/
+
        return callIntegerMethod(obj,get_virtual(obj,methodID),PRIMITIVETYPE_CHAR,args);
 }
 
 
 jchar CallCharMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       log_text("JNI-Call: CallCharMethodA");
+       log_text("JNI-Call: CallCharMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -1555,7 +1608,8 @@ jshort CallShortMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 {
        jshort ret;
        va_list vaargs;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
 /*     log_text("JNI-Call: CallShortMethod");*/
 
@@ -1569,15 +1623,17 @@ jshort CallShortMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 
 jshort CallShortMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        return callIntegerMethod(obj, get_virtual(obj, methodID),PRIMITIVETYPE_SHORT, args);
 }
 
 
 jshort CallShortMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallShortMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallShortMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -1588,7 +1644,8 @@ jint CallIntMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 {
        jint ret;
        va_list vaargs;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
        va_start(vaargs,methodID);
        ret = callIntegerMethod(obj, get_virtual(obj, methodID),PRIMITIVETYPE_INT, vaargs);
@@ -1600,15 +1657,17 @@ jint CallIntMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 
 jint CallIntMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        return callIntegerMethod(obj, get_virtual(obj, methodID),PRIMITIVETYPE_INT, args);
 }
 
 
 jint CallIntMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallIntMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallIntMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -1619,8 +1678,9 @@ jlong CallLongMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 {
        jlong ret;
        va_list vaargs;
-       STATS(jniinvokation();)
-       
+
+       STATISTICS(jniinvokation());
+
        va_start(vaargs,methodID);
        ret = callLongMethod(obj,get_virtual(obj, methodID),vaargs);
        va_end(vaargs);
@@ -1631,15 +1691,17 @@ jlong CallLongMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 
 jlong CallLongMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        return  callLongMethod(obj,get_virtual(obj, methodID),args);
 }
 
 
 jlong CallLongMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallLongMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallLongMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -1651,7 +1713,8 @@ jfloat CallFloatMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
        jfloat ret;
        va_list vaargs;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
 /*     log_text("JNI-Call: CallFloatMethod");*/
 
        va_start(vaargs,methodID);
@@ -1664,16 +1727,19 @@ jfloat CallFloatMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 
 jfloat CallFloatMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallFloatMethodV");
+       STATISTICS(jniinvokation());
+
+/*     log_text("JNI-Call: CallFloatMethodV"); */
+
        return callFloatMethod(obj, get_virtual(obj, methodID), args, PRIMITIVETYPE_FLOAT);
 }
 
 
 jfloat CallFloatMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallFloatMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallFloatMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -1684,7 +1750,8 @@ jdouble CallDoubleMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 {
        jdouble ret;
        va_list vaargs;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
 /*     log_text("JNI-Call: CallDoubleMethod");*/
 
@@ -1698,16 +1765,20 @@ jdouble CallDoubleMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 
 jdouble CallDoubleMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallDoubleMethodV");
+       STATISTICS(jniinvokation());
+
+/*     log_text("JNI-Call: CallDoubleMethodV"); */
+
        return callFloatMethod(obj, get_virtual(obj, methodID), args, PRIMITIVETYPE_DOUBLE);
 }
 
 
 jdouble CallDoubleMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallDoubleMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallDoubleMethodA: IMPLEMENT ME!");
+
        return 0;
 }
 
@@ -1716,7 +1787,8 @@ jdouble CallDoubleMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *
 void CallVoidMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 {
        va_list vaargs;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
        va_start(vaargs,methodID);
        (void) callIntegerMethod(obj, get_virtual(obj, methodID),TYPE_VOID, vaargs);
@@ -1724,25 +1796,28 @@ void CallVoidMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
 }
 
 
-void CallVoidMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
+void CallVoidMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
 {
-       log_text("JNI-Call: CallVoidMethodV");
-       STATS(jniinvokation();)
-       (void)callIntegerMethod(obj,get_virtual(obj,methodID),TYPE_VOID,args);
+       STATISTICS(jniinvokation());
+
+/*     log_text("JNI-Call: CallVoidMethodV"); */
+
+       (void) callIntegerMethod(obj, get_virtual(obj, methodID), TYPE_VOID,args);
 }
 
 
-void CallVoidMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
+void CallVoidMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallVoidMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallVoidMethodA: IMPLEMENT ME!");
 }
 
 
 
 jobject CallNonvirtualObjectMethod(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: CallNonvirtualObjectMethod: IMPLEMENT ME!");
 
@@ -1752,7 +1827,7 @@ jobject CallNonvirtualObjectMethod(JNIEnv *env, jobject obj, jclass clazz, jmeth
 
 jobject CallNonvirtualObjectMethodV(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: CallNonvirtualObjectMethodV: IMPLEMENT ME!");
 
@@ -1760,9 +1835,9 @@ jobject CallNonvirtualObjectMethodV(JNIEnv *env, jobject obj, jclass clazz, jmet
 }
 
 
-jobject CallNonvirtualObjectMethodA(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
+jobject CallNonvirtualObjectMethodA(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: CallNonvirtualObjectMethodA: IMPLEMENT ME!");
 
@@ -1775,13 +1850,15 @@ jboolean CallNonvirtualBooleanMethod (JNIEnv *env, jobject obj, jclass clazz, jm
 {
        jboolean ret;
        va_list vaargs;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
 /*     log_text("JNI-Call: CallNonvirtualBooleanMethod");*/
 
        va_start(vaargs,methodID);
        ret = (jboolean)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_BOOLEAN,vaargs);
        va_end(vaargs);
+
        return ret;
 
 }
@@ -1789,83 +1866,94 @@ jboolean CallNonvirtualBooleanMethod (JNIEnv *env, jobject obj, jclass clazz, jm
 
 jboolean CallNonvirtualBooleanMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
 /*     log_text("JNI-Call: CallNonvirtualBooleanMethodV");*/
+
        return (jboolean)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_BOOLEAN,args);
 }
 
 
-jboolean CallNonvirtualBooleanMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
+jboolean CallNonvirtualBooleanMethodA(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualBooleanMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallNonvirtualBooleanMethodA: IMPLEMENT ME!");
 
        return 0;
 }
 
 
-
 jbyte CallNonvirtualByteMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
 {
        jbyte ret;
        va_list vaargs;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
 /*     log_text("JNI-Call: CallNonvirutalByteMethod");*/
 
        va_start(vaargs,methodID);
        ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_BYTE,vaargs);
        va_end(vaargs);
+
        return ret;
 }
 
 
 jbyte CallNonvirtualByteMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        /*log_text("JNI-Call: CallNonvirtualByteMethodV"); */
-       return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_BYTE,args);
 
+       return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_BYTE,args);
 }
 
 
-jbyte CallNonvirtualByteMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
+jbyte CallNonvirtualByteMethodA(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualByteMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallNonvirtualByteMethodA: IMPLEMENT ME!");
 
        return 0;
 }
 
 
 
-jchar CallNonvirtualCharMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
+jchar CallNonvirtualCharMethod(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
 {
        jchar ret;
        va_list vaargs;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
 /*     log_text("JNI-Call: CallNonVirtualCharMethod");*/
 
        va_start(vaargs,methodID);
        ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_CHAR,vaargs);
        va_end(vaargs);
+
        return ret;
 }
 
 
 jchar CallNonvirtualCharMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        /*log_text("JNI-Call: CallNonvirtualCharMethodV");*/
+
        return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_CHAR,args);
 }
 
 
 jchar CallNonvirtualCharMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualCharMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallNonvirtualCharMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -1876,29 +1964,34 @@ jshort CallNonvirtualShortMethod (JNIEnv *env, jobject obj, jclass clazz, jmetho
 {
        jshort ret;
        va_list vaargs;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
        /*log_text("JNI-Call: CallNonvirtualShortMethod");*/
 
        va_start(vaargs,methodID);
        ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_SHORT,vaargs);
        va_end(vaargs);
+
        return ret;
 }
 
 
 jshort CallNonvirtualShortMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        /*log_text("JNI-Call: CallNonvirtualShortMethodV");*/
+
        return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_SHORT,args);
 }
 
 
 jshort CallNonvirtualShortMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualShortMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallNonvirtualShortMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -1907,32 +2000,36 @@ jshort CallNonvirtualShortMethodA (JNIEnv *env, jobject obj, jclass clazz, jmeth
 
 jint CallNonvirtualIntMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
 {
+       jint ret;
+       va_list vaargs;
 
-        jint ret;
-        va_list vaargs;
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        /*log_text("JNI-Call: CallNonvirtualIntMethod");*/
 
-        va_start(vaargs,methodID);
-        ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_INT,vaargs);
-        va_end(vaargs);
-        return ret;
+       va_start(vaargs,methodID);
+       ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_INT,vaargs);
+       va_end(vaargs);
+
+       return ret;
 }
 
 
 jint CallNonvirtualIntMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        /*log_text("JNI-Call: CallNonvirtualIntMethodV");*/
-        return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_INT,args);
+
+       return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_INT,args);
 }
 
 
 jint CallNonvirtualIntMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualIntMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallNonvirtualIntMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -1941,8 +2038,9 @@ jint CallNonvirtualIntMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID
 
 jlong CallNonvirtualLongMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualLongMethod");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallNonvirtualLongMethod: IMPLEMENT ME!");
 
        return 0;
 }
@@ -1950,8 +2048,9 @@ jlong CallNonvirtualLongMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodI
 
 jlong CallNonvirtualLongMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualLongMethodV");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallNonvirtualLongMethodV: IMPLEMENT ME!");
 
        return 0;
 }
@@ -1959,8 +2058,9 @@ jlong CallNonvirtualLongMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethod
 
 jlong CallNonvirtualLongMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualLongMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallNonvirtualLongMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -1971,31 +2071,34 @@ jfloat CallNonvirtualFloatMethod (JNIEnv *env, jobject obj, jclass clazz, jmetho
 {
        jfloat ret;
        va_list vaargs;
-       STATS(jniinvokation();)
 
-       /*log_text("JNI-Call: CallNonvirtualFloatMethod");*/
+       STATISTICS(jniinvokation());
 
+       /*log_text("JNI-Call: CallNonvirtualFloatMethod");*/
 
        va_start(vaargs,methodID);
        ret = callFloatMethod(obj,get_nonvirtual(clazz,methodID),vaargs,PRIMITIVETYPE_FLOAT);
        va_end(vaargs);
-       return ret;
 
+       return ret;
 }
 
 
 jfloat CallNonvirtualFloatMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualFloatMethodV");
+       STATISTICS(jniinvokation());
+
+/*     log_text("JNI-Call: CallNonvirtualFloatMethodV"); */
+
        return callFloatMethod(obj,get_nonvirtual(clazz,methodID),args,PRIMITIVETYPE_FLOAT);
 }
 
 
 jfloat CallNonvirtualFloatMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualFloatMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallNonvirtualFloatMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -2006,29 +2109,34 @@ jdouble CallNonvirtualDoubleMethod (JNIEnv *env, jobject obj, jclass clazz, jmet
 {
        jdouble ret;
        va_list vaargs;
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualDoubleMethod");
+
+       STATISTICS(jniinvokation());
+
+/*     log_text("JNI-Call: CallNonvirtualDoubleMethod"); */
 
        va_start(vaargs,methodID);
        ret = callFloatMethod(obj,get_nonvirtual(clazz,methodID),vaargs,PRIMITIVETYPE_DOUBLE);
        va_end(vaargs);
-       return ret;
 
+       return ret;
 }
 
 
 jdouble CallNonvirtualDoubleMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
 /*     log_text("JNI-Call: CallNonvirtualDoubleMethodV");*/
+
        return callFloatMethod(obj,get_nonvirtual(clazz,methodID),args,PRIMITIVETYPE_DOUBLE);
 }
 
 
 jdouble CallNonvirtualDoubleMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualDoubleMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallNonvirtualDoubleMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -2037,43 +2145,60 @@ jdouble CallNonvirtualDoubleMethodA (JNIEnv *env, jobject obj, jclass clazz, jme
 
 void CallNonvirtualVoidMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
 {
-        va_list vaargs;
-       STATS(jniinvokation();)
+       va_list vaargs;
 
-/*      log_text("JNI-Call: CallNonvirtualVoidMethod");*/
+       STATISTICS(jniinvokation());
 
-        va_start(vaargs,methodID);
-        (void)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),TYPE_VOID,vaargs);
-        va_end(vaargs);
+/*      log_text("JNI-Call: CallNonvirtualVoidMethod");*/
 
+       va_start(vaargs,methodID);
+       (void)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),TYPE_VOID,vaargs);
+       va_end(vaargs);
 }
 
 
 void CallNonvirtualVoidMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
 {
-/*     log_text("JNI-Call: CallNonvirtualVoidMethodV");*/
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-        (void)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),TYPE_VOID,args);
+/*     log_text("JNI-Call: CallNonvirtualVoidMethodV");*/
 
+       (void)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),TYPE_VOID,args);
 }
 
 
 void CallNonvirtualVoidMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallNonvirtualVoidMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallNonvirtualVoidMethodA: IMPLEMENT ME!");
 }
 
-/************************* JNI-functions for accessing fields ************************/
 
-jfieldID GetFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig) 
+/* Accessing Fields of Objects ************************************************/
+
+/* GetFieldID ******************************************************************
+
+   Returns the field ID for an instance (nonstatic) field of a
+   class. The field is specified by its name and signature. The
+   Get<type>Field and Set<type>Field families of accessor functions
+   use field IDs to retrieve object fields.
+
+*******************************************************************************/
+
+jfieldID GetFieldID(JNIEnv *env, jclass clazz, const char *name,
+                                       const char *sig) 
 {
-       jfieldID f;
+       fieldinfo *f;
+       utf       *uname;
+       utf       *udesc;
+
+       STATISTICS(jniinvokation());
 
-       STATS(jniinvokation();)
+       uname = utf_new_char((char *) name);
+       udesc = utf_new_char((char *) sig);
 
-       f = class_findfield(clazz, utf_new_char((char *) name), utf_new_char((char *) sig)); 
+       f = class_findfield(clazz, uname, udesc); 
        
        if (!f)
                *exceptionptr = new_exception(string_java_lang_NoSuchFieldError);  
@@ -2081,170 +2206,243 @@ jfieldID GetFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig
        return f;
 }
 
-/*************************** retrieve fieldid, abort on error ************************/
 
-jfieldID getFieldID_critical(JNIEnv *env, jclass clazz, char *name, char *sig)
-{
-    jfieldID id = GetFieldID(env, clazz, name, sig);
-       STATS(jniinvokation();)
+/* Get<type>Field Routines *****************************************************
 
-    if (!id) {
-       log_text("class:");
-       utf_display(clazz->name);
-       log_text("\nfield:");
-       log_text(name);
-       log_text("sig:");
-       log_text(sig);
+   This family of accessor routines returns the value of an instance
+   (nonstatic) field of an object. The field to access is specified by
+   a field ID obtained by calling GetFieldID().
 
-       log_text("setfield_critical failed");
-          assert(0);
-    }
-    return id;
-}
+*******************************************************************************/
 
 jobject GetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID)
 {
        java_objectheader *o;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       o = getField(obj, java_objectheader*, fieldID);
+       o = GET_FIELD(obj, java_objectheader*, fieldID);
 
        return NewLocalRef(env, o);
 }
 
-jboolean GetBooleanField (JNIEnv *env, jobject obj, jfieldID fieldID)
+
+jboolean GetBooleanField(JNIEnv *env, jobject obj, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
-       return getField(obj,jboolean,fieldID);
+       s4 i;
+
+       STATISTICS(jniinvokation());
+
+       i = GET_FIELD(obj, s4, fieldID);
+
+       return (jboolean) i;
 }
 
 
-jbyte GetByteField (JNIEnv *env, jobject obj, jfieldID fieldID)
+jbyte GetByteField(JNIEnv *env, jobject obj, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
-       return getField(obj,jbyte,fieldID);
+       s4 i;
+
+       STATISTICS(jniinvokation());
+
+       i = GET_FIELD(obj, s4, fieldID);
+
+       return (jbyte) i;
 }
 
 
-jchar GetCharField (JNIEnv *env, jobject obj, jfieldID fieldID)
+jchar GetCharField(JNIEnv *env, jobject obj, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
-       return getField(obj,jchar,fieldID);
+       s4 i;
+
+       STATISTICS(jniinvokation());
+
+       i = GET_FIELD(obj, s4, fieldID);
+
+       return (jchar) i;
 }
 
 
-jshort GetShortField (JNIEnv *env, jobject obj, jfieldID fieldID)
+jshort GetShortField(JNIEnv *env, jobject obj, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
-       return getField(obj,jshort,fieldID);
+       s4 i;
+
+       STATISTICS(jniinvokation());
+
+       i = GET_FIELD(obj, s4, fieldID);
+
+       return (jshort) i;
 }
 
 
-jint GetIntField (JNIEnv *env, jobject obj, jfieldID fieldID)
+jint GetIntField(JNIEnv *env, jobject obj, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
-       return getField(obj,jint,fieldID);
+       s4 i;
+
+       STATISTICS(jniinvokation());
+
+       i = GET_FIELD(obj, s4, fieldID);
+
+       return i;
 }
 
 
-jlong GetLongField (JNIEnv *env, jobject obj, jfieldID fieldID)
+jlong GetLongField(JNIEnv *env, jobject obj, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
-       return getField(obj,jlong,fieldID);
+       s8 l;
+
+       STATISTICS(jniinvokation());
+
+       l = GET_FIELD(obj, s8, fieldID);
+
+       return l;
 }
 
 
-jfloat GetFloatField (JNIEnv *env, jobject obj, jfieldID fieldID)
+jfloat GetFloatField(JNIEnv *env, jobject obj, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
-       return getField(obj,jfloat,fieldID);
+       float f;
+
+       STATISTICS(jniinvokation());
+
+       f = GET_FIELD(obj, float, fieldID);
+
+       return f;
 }
 
 
-jdouble GetDoubleField (JNIEnv *env, jobject obj, jfieldID fieldID)
+jdouble GetDoubleField(JNIEnv *env, jobject obj, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
-       return getField(obj,jdouble,fieldID);
+       double d;
+
+       STATISTICS(jniinvokation());
+
+       d = GET_FIELD(obj, double, fieldID);
+
+       return d;
 }
 
-void SetObjectField (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val)
+
+/* Set<type>Field Routines *****************************************************
+
+   This family of accessor routines sets the value of an instance
+   (nonstatic) field of an object. The field to access is specified by
+   a field ID obtained by calling GetFieldID().
+
+*******************************************************************************/
+
+void SetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID, jobject value)
 {
-       STATS(jniinvokation();)
-        setField(obj,jobject,fieldID,val);
+       STATISTICS(jniinvokation());
+
+       SET_FIELD(obj, java_objectheader*, fieldID, value);
 }
 
 
-void SetBooleanField (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val)
+void SetBooleanField(JNIEnv *env, jobject obj, jfieldID fieldID, jboolean value)
 {
-       STATS(jniinvokation();)
-        setField(obj,jboolean,fieldID,val);
+       STATISTICS(jniinvokation());
+
+       SET_FIELD(obj, s4, fieldID, value);
 }
 
 
-void SetByteField (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val)
+void SetByteField(JNIEnv *env, jobject obj, jfieldID fieldID, jbyte value)
 {
-       STATS(jniinvokation();)
-        setField(obj,jbyte,fieldID,val);
+       STATISTICS(jniinvokation());
+
+       SET_FIELD(obj, s4, fieldID, value);
 }
 
 
-void SetCharField (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val)
+void SetCharField(JNIEnv *env, jobject obj, jfieldID fieldID, jchar value)
 {
-       STATS(jniinvokation();)
-        setField(obj,jchar,fieldID,val);
+       STATISTICS(jniinvokation());
+
+       SET_FIELD(obj, s4, fieldID, value);
 }
 
 
-void SetShortField (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val)
+void SetShortField(JNIEnv *env, jobject obj, jfieldID fieldID, jshort value)
 {
-       STATS(jniinvokation();)
-        setField(obj,jshort,fieldID,val);
+       STATISTICS(jniinvokation());
+
+       SET_FIELD(obj, s4, fieldID, value);
 }
 
 
-void SetIntField (JNIEnv *env, jobject obj, jfieldID fieldID, jint val)
+void SetIntField(JNIEnv *env, jobject obj, jfieldID fieldID, jint value)
 {
-       STATS(jniinvokation();)
-        setField(obj,jint,fieldID,val);
+       STATISTICS(jniinvokation());
+
+       SET_FIELD(obj, s4, fieldID, value);
 }
 
 
-void SetLongField (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val)
+void SetLongField(JNIEnv *env, jobject obj, jfieldID fieldID, jlong value)
 {
-       STATS(jniinvokation();)
-        setField(obj,jlong,fieldID,val);
+       STATISTICS(jniinvokation());
+
+       SET_FIELD(obj, s8, fieldID, value);
 }
 
 
-void SetFloatField (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val)
+void SetFloatField(JNIEnv *env, jobject obj, jfieldID fieldID, jfloat value)
 {
-       STATS(jniinvokation();)
-        setField(obj,jfloat,fieldID,val);
+       STATISTICS(jniinvokation());
+
+       SET_FIELD(obj, float, fieldID, value);
 }
 
 
-void SetDoubleField (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val)
+void SetDoubleField(JNIEnv *env, jobject obj, jfieldID fieldID, jdouble value)
 {
-       STATS(jniinvokation();)
-        setField(obj,jdouble,fieldID,val);
+       STATISTICS(jniinvokation());
+
+       SET_FIELD(obj, double, fieldID, value);
 }
 
 
-/**************** JNI-functions for calling static methods **********************/ 
+/* Calling Static Methods *****************************************************/
+
+/* GetStaticMethodID ***********************************************************
+
+   Returns the method ID for a static method of a class. The method is
+   specified by its name and signature.
+
+   GetStaticMethodID() causes an uninitialized class to be
+   initialized.
 
-jmethodID GetStaticMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig)
+*******************************************************************************/
+
+jmethodID GetStaticMethodID(JNIEnv *env, jclass clazz, const char *name,
+                                                       const char *sig)
 {
-       jmethodID m;
-       STATS(jniinvokation();)
+       classinfo  *c;
+       utf        *uname;
+       utf        *udesc;
+       methodinfo *m;
+
+       STATISTICS(jniinvokation());
 
-       m = class_resolvemethod(clazz,
-                                                       utf_new_char((char *) name),
-                                                       utf_new_char((char *) sig));
+       c = (classinfo *) clazz;
+
+       if (!c)
+               return NULL;
+
+       if (!(c->state & CLASS_INITIALIZED))
+               if (!initialize_class(c))
+                       return NULL;
+
+       /* try to get the static method of the class */
+
+       uname = utf_new_char((char *) name);
+       udesc = utf_new_char((char *) sig);
+
+       m = class_resolvemethod(c, uname, udesc);
 
        if (!m || !(m->flags & ACC_STATIC)) {
-               *exceptionptr =
-                       new_exception_message(string_java_lang_NoSuchMethodError, name);
+               *exceptionptr = exceptions_new_nosuchmethoderror(c, uname, udesc);
 
                return NULL;
        }
@@ -2258,7 +2456,7 @@ jobject CallStaticObjectMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ..
        java_objectheader *ret;
        va_list            vaargs;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        va_start(vaargs, methodID);
        ret = callObjectMethod(0, methodID, vaargs);
@@ -2272,7 +2470,7 @@ jobject CallStaticObjectMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, v
 {
        java_objectheader *ret;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
        
        ret = callObjectMethod(0, methodID, args);
 
@@ -2282,7 +2480,7 @@ jobject CallStaticObjectMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, v
 
 jobject CallStaticObjectMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-Call: CallStaticObjectMethodA: IMPLEMENT ME!");
 
@@ -2292,9 +2490,10 @@ jobject CallStaticObjectMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, j
 
 jboolean CallStaticBooleanMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
 {
+       va_list  vaargs;
        jboolean ret;
-       va_list vaargs;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
        va_start(vaargs, methodID);
        ret = (jboolean) callIntegerMethod(0, methodID, PRIMITIVETYPE_BOOLEAN, vaargs);
@@ -2306,15 +2505,17 @@ jboolean CallStaticBooleanMethod(JNIEnv *env, jclass clazz, jmethodID methodID,
 
 jboolean CallStaticBooleanMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        return (jboolean) callIntegerMethod(0, methodID, PRIMITIVETYPE_BOOLEAN, args);
 }
 
 
 jboolean CallStaticBooleanMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallStaticBooleanMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallStaticBooleanMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -2322,11 +2523,10 @@ jboolean CallStaticBooleanMethodA(JNIEnv *env, jclass clazz, jmethodID methodID,
 
 jbyte CallStaticByteMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
 {
-       jbyte ret;
        va_list vaargs;
-       STATS(jniinvokation();)
+       jbyte   ret;
 
-       /*      log_text("JNI-Call: CallStaticByteMethod");*/
+       STATISTICS(jniinvokation());
 
        va_start(vaargs, methodID);
        ret = (jbyte) callIntegerMethod(0, methodID, PRIMITIVETYPE_BYTE, vaargs);
@@ -2338,15 +2538,17 @@ jbyte CallStaticByteMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
 
 jbyte CallStaticByteMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        return (jbyte) callIntegerMethod(0, methodID, PRIMITIVETYPE_BYTE, args);
 }
 
 
 jbyte CallStaticByteMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallStaticByteMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallStaticByteMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -2354,11 +2556,10 @@ jbyte CallStaticByteMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalu
 
 jchar CallStaticCharMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
 {
-       jchar ret;
        va_list vaargs;
-       STATS(jniinvokation();)
+       jchar   ret;
 
-       /*      log_text("JNI-Call: CallStaticByteMethod");*/
+       STATISTICS(jniinvokation());
 
        va_start(vaargs, methodID);
        ret = (jchar) callIntegerMethod(0, methodID, PRIMITIVETYPE_CHAR, vaargs);
@@ -2370,28 +2571,28 @@ jchar CallStaticCharMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
 
 jchar CallStaticCharMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        return (jchar) callIntegerMethod(0, methodID, PRIMITIVETYPE_CHAR, args);
 }
 
 
 jchar CallStaticCharMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallStaticCharMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallStaticCharMethodA: IMPLEMENT ME!");
 
        return 0;
 }
 
 
-
 jshort CallStaticShortMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
 {
-       jshort ret;
        va_list vaargs;
-       STATS(jniinvokation();)
+       jshort  ret;
 
-       /*      log_text("JNI-Call: CallStaticByteMethod");*/
+       STATISTICS(jniinvokation());
 
        va_start(vaargs, methodID);
        ret = (jshort) callIntegerMethod(0, methodID, PRIMITIVETYPE_SHORT, vaargs);
@@ -2403,29 +2604,28 @@ jshort CallStaticShortMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
 
 jshort CallStaticShortMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
-       /*log_text("JNI-Call: CallStaticShortMethodV");*/
+       STATISTICS(jniinvokation());
+
        return (jshort) callIntegerMethod(0, methodID, PRIMITIVETYPE_SHORT, args);
 }
 
 
 jshort CallStaticShortMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallStaticShortMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallStaticShortMethodA: IMPLEMENT ME!");
 
        return 0;
 }
 
 
-
 jint CallStaticIntMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
 {
-       jint ret;
        va_list vaargs;
-       STATS(jniinvokation();)
+       jint    ret;
 
-       /*      log_text("JNI-Call: CallStaticIntMethod");*/
+       STATISTICS(jniinvokation());
 
        va_start(vaargs, methodID);
        ret = callIntegerMethod(0, methodID, PRIMITIVETYPE_INT, vaargs);
@@ -2437,8 +2637,7 @@ jint CallStaticIntMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
 
 jint CallStaticIntMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallStaticIntMethodV");
+       STATISTICS(jniinvokation());
 
        return callIntegerMethod(0, methodID, PRIMITIVETYPE_INT, args);
 }
@@ -2446,21 +2645,20 @@ jint CallStaticIntMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list
 
 jint CallStaticIntMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallStaticIntMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallStaticIntMethodA: IMPLEMENT ME!");
 
        return 0;
 }
 
 
-
 jlong CallStaticLongMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
 {
-       jlong ret;
        va_list vaargs;
-       STATS(jniinvokation();)
+       jlong   ret;
 
-       /*      log_text("JNI-Call: CallStaticLongMethod");*/
+       STATISTICS(jniinvokation());
 
        va_start(vaargs, methodID);
        ret = callLongMethod(0, methodID, vaargs);
@@ -2473,7 +2671,7 @@ jlong CallStaticLongMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
 jlong CallStaticLongMethodV(JNIEnv *env, jclass clazz, jmethodID methodID,
                                                        va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
        
        return callLongMethod(0, methodID, args);
 }
@@ -2481,9 +2679,9 @@ jlong CallStaticLongMethodV(JNIEnv *env, jclass clazz, jmethodID methodID,
 
 jlong CallStaticLongMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       log_text("JNI-Call: CallStaticLongMethodA: IMPLEMENT ME!!!");
+       log_text("JNI-Call: CallStaticLongMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -2492,11 +2690,10 @@ jlong CallStaticLongMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalu
 
 jfloat CallStaticFloatMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
 {
-       jfloat ret;
        va_list vaargs;
-       STATS(jniinvokation();)
+       jfloat  ret;
 
-       /*      log_text("JNI-Call: CallStaticLongMethod");*/
+       STATISTICS(jniinvokation());
 
        va_start(vaargs, methodID);
        ret = callFloatMethod(0, methodID, vaargs, PRIMITIVETYPE_FLOAT);
@@ -2508,7 +2705,7 @@ jfloat CallStaticFloatMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
 
 jfloat CallStaticFloatMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        return callFloatMethod(0, methodID, args, PRIMITIVETYPE_FLOAT);
 
@@ -2517,21 +2714,20 @@ jfloat CallStaticFloatMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_
 
 jfloat CallStaticFloatMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallStaticFloatMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallStaticFloatMethodA: IMPLEMENT ME!");
 
        return 0;
 }
 
 
-
 jdouble CallStaticDoubleMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
 {
-       jdouble ret;
        va_list vaargs;
-       STATS(jniinvokation();)
+       jdouble ret;
 
-       /*      log_text("JNI-Call: CallStaticDoubleMethod");*/
+       STATISTICS(jniinvokation());
 
        va_start(vaargs,methodID);
        ret = callFloatMethod(0, methodID, vaargs, PRIMITIVETYPE_DOUBLE);
@@ -2543,8 +2739,7 @@ jdouble CallStaticDoubleMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ..
 
 jdouble CallStaticDoubleMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallStaticDoubleMethodV");
+       STATISTICS(jniinvokation());
 
        return callFloatMethod(0, methodID, args, PRIMITIVETYPE_DOUBLE);
 }
@@ -2552,8 +2747,9 @@ jdouble CallStaticDoubleMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, v
 
 jdouble CallStaticDoubleMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallStaticDoubleMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallStaticDoubleMethodA: IMPLEMENT ME!");
 
        return 0;
 }
@@ -2562,7 +2758,8 @@ jdouble CallStaticDoubleMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, j
 void CallStaticVoidMethod(JNIEnv *env, jclass cls, jmethodID methodID, ...)
 {
        va_list vaargs;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
        va_start(vaargs, methodID);
        (void) callIntegerMethod(0, methodID, TYPE_VOID, vaargs);
@@ -2572,16 +2769,17 @@ void CallStaticVoidMethod(JNIEnv *env, jclass cls, jmethodID methodID, ...)
 
 void CallStaticVoidMethodV(JNIEnv *env, jclass cls, jmethodID methodID, va_list args)
 {
-       log_text("JNI-Call: CallStaticVoidMethodV");
-       STATS(jniinvokation();)
-       (void)callIntegerMethod(0, methodID, TYPE_VOID, args);
+       STATISTICS(jniinvokation());
+
+       (void) callIntegerMethod(0, methodID, TYPE_VOID, args);
 }
 
 
 void CallStaticVoidMethodA(JNIEnv *env, jclass cls, jmethodID methodID, jvalue * args)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: CallStaticVoidMethodA");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: CallStaticVoidMethodA: IMPLEMENT ME!");
 }
 
 
@@ -2599,7 +2797,8 @@ void CallStaticVoidMethodA(JNIEnv *env, jclass cls, jmethodID methodID, jvalue *
 jfieldID GetStaticFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig)
 {
        jfieldID f;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
        f = class_findfield(clazz,
                                                utf_new_char((char *) name),
@@ -2621,9 +2820,9 @@ jfieldID GetStaticFieldID(JNIEnv *env, jclass clazz, const char *name, const cha
 
 jobject GetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return NULL;
 
@@ -2633,9 +2832,9 @@ jobject GetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 
 jboolean GetStaticBooleanField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return false;
 
@@ -2645,9 +2844,9 @@ jboolean GetStaticBooleanField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 
 jbyte GetStaticByteField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return 0;
 
@@ -2657,9 +2856,9 @@ jbyte GetStaticByteField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 
 jchar GetStaticCharField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return 0;
 
@@ -2669,9 +2868,9 @@ jchar GetStaticCharField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 
 jshort GetStaticShortField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return 0;
 
@@ -2681,9 +2880,9 @@ jshort GetStaticShortField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 
 jint GetStaticIntField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return 0;
 
@@ -2693,9 +2892,9 @@ jint GetStaticIntField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 
 jlong GetStaticLongField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return 0;
 
@@ -2705,9 +2904,9 @@ jlong GetStaticLongField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 
 jfloat GetStaticFloatField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return 0.0;
 
@@ -2717,9 +2916,9 @@ jfloat GetStaticFloatField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 
 jdouble GetStaticDoubleField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return 0.0;
 
@@ -2736,9 +2935,9 @@ jdouble GetStaticDoubleField(JNIEnv *env, jclass clazz, jfieldID fieldID)
 
 void SetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return;
 
@@ -2748,9 +2947,9 @@ void SetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID, jobject v
 
 void SetStaticBooleanField(JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return;
 
@@ -2760,9 +2959,9 @@ void SetStaticBooleanField(JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean
 
 void SetStaticByteField(JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return;
 
@@ -2772,9 +2971,9 @@ void SetStaticByteField(JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value
 
 void SetStaticCharField(JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return;
 
@@ -2784,9 +2983,9 @@ void SetStaticCharField(JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value
 
 void SetStaticShortField(JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return;
 
@@ -2796,9 +2995,9 @@ void SetStaticShortField(JNIEnv *env, jclass clazz, jfieldID fieldID, jshort val
 
 void SetStaticIntField(JNIEnv *env, jclass clazz, jfieldID fieldID, jint value)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return;
 
@@ -2808,9 +3007,9 @@ void SetStaticIntField(JNIEnv *env, jclass clazz, jfieldID fieldID, jint value)
 
 void SetStaticLongField(JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return;
 
@@ -2820,9 +3019,9 @@ void SetStaticLongField(JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value
 
 void SetStaticFloatField(JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return;
 
@@ -2832,9 +3031,9 @@ void SetStaticFloatField(JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat val
 
 void SetStaticDoubleField(JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       if (!clazz->initialized)
+       if (!(clazz->state & CLASS_INITIALIZED))
                if (!initialize_class(clazz))
                        return;
 
@@ -2857,7 +3056,7 @@ jstring NewString(JNIEnv *env, const jchar *buf, jsize len)
        java_chararray   *a;
        u4                i;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
        
        s = (java_lang_String *) builtin_new(class_java_lang_String);
        a = builtin_newarray_char(len);
@@ -2902,7 +3101,7 @@ u2 *javastring_tou2(jstring so)
        u2               *stringbuffer;
        u4                i;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
        
        s = (java_lang_String *) so;
 
@@ -2942,7 +3141,7 @@ const jchar *GetStringChars(JNIEnv *env, jstring str, jboolean *isCopy)
 {      
        jchar *jc;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        jc = javastring_tou2(str);
 
@@ -2970,7 +3169,7 @@ const jchar *GetStringChars(JNIEnv *env, jstring str, jboolean *isCopy)
 
 void ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (chars == emptyStringJ)
                return;
@@ -2989,7 +3188,7 @@ jstring NewStringUTF(JNIEnv *env, const char *bytes)
 {
        java_lang_String *s;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        s = javastring_new(utf_new_char(bytes));
 
@@ -3002,7 +3201,8 @@ jstring NewStringUTF(JNIEnv *env, const char *bytes)
 jsize GetStringUTFLength (JNIEnv *env, jstring string)
 {   
     java_lang_String *s = (java_lang_String*) string;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
     return (jsize) u2_utflength(s->value->data, s->count); 
 }
@@ -3019,7 +3219,8 @@ jsize GetStringUTFLength (JNIEnv *env, jstring string)
 const char *GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy)
 {
        utf *u;
-       STATS(jniinvokation();)
+
+       STATISTICS(jniinvokation());
 
        if (!string)
                return "";
@@ -3046,7 +3247,7 @@ const char *GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy)
 
 void ReleaseStringUTFChars(JNIEnv *env, jstring string, const char *utf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     /* XXX we don't release utf chars right now, perhaps that should be done 
           later. Since there is always one reference the garbage collector will
@@ -3064,7 +3265,7 @@ void ReleaseStringUTFChars(JNIEnv *env, jstring string, const char *utf)
 
 jsize GetArrayLength(JNIEnv *env, jarray array)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        return array->size;
 }
@@ -3082,10 +3283,10 @@ jobjectArray NewObjectArray(JNIEnv *env, jsize length, jclass elementClass, jobj
        java_objectarray *oa;
        s4                i;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (length < 0) {
-               *exceptionptr = new_negativearraysizeexception();
+               exceptions_throw_negativearraysizeexception();
                return NULL;
        }
 
@@ -3107,11 +3308,10 @@ jobject GetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index)
 {
     jobject o;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (index >= array->header.size) {
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
+               exceptions_throw_arrayindexoutofboundsexception();
                return NULL;
        }
 
@@ -3123,18 +3323,29 @@ jobject GetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index)
 
 void SetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index, jobject val)
 {
-       STATS(jniinvokation();)
-    if (index >= array->header.size)
-               *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
+       java_objectarray  *oa;
+       java_objectheader *o;
+
+       STATISTICS(jniinvokation());
+
+       oa = (java_objectarray *) array;
+       o  = (java_objectheader *) val;
 
-    else {
-               /* check if the class of value is a subclass of the element class of the array */
-               if (!builtin_canstore((java_objectarray *) array, (java_objectheader *) val))
-                       *exceptionptr = new_exception(string_java_lang_ArrayStoreException);
+    if (index >= array->header.size) {
+               exceptions_throw_arrayindexoutofboundsexception();
+               return;
+       }
+
+       /* check if the class of value is a subclass of the element class
+          of the array */
 
-               else
-                       array->data[index] = val;
-    }
+       if (!builtin_canstore(oa, o)) {
+               *exceptionptr = new_exception(string_java_lang_ArrayStoreException);
+
+               return;
+       }
+
+       array->data[index] = val;
 }
 
 
@@ -3142,10 +3353,10 @@ jbooleanArray NewBooleanArray(JNIEnv *env, jsize len)
 {
        java_booleanarray *ba;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (len < 0) {
-               *exceptionptr = new_negativearraysizeexception();
+               exceptions_throw_negativearraysizeexception();
                return NULL;
        }
 
@@ -3159,10 +3370,10 @@ jbyteArray NewByteArray(JNIEnv *env, jsize len)
 {
        java_bytearray *ba;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (len < 0) {
-               *exceptionptr = new_negativearraysizeexception();
+               exceptions_throw_negativearraysizeexception();
                return NULL;
        }
 
@@ -3176,10 +3387,10 @@ jcharArray NewCharArray(JNIEnv *env, jsize len)
 {
        java_chararray *ca;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (len < 0) {
-               *exceptionptr = new_negativearraysizeexception();
+               exceptions_throw_negativearraysizeexception();
                return NULL;
        }
 
@@ -3193,10 +3404,10 @@ jshortArray NewShortArray(JNIEnv *env, jsize len)
 {
        java_shortarray *sa;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (len < 0) {
-               *exceptionptr = new_negativearraysizeexception();
+               exceptions_throw_negativearraysizeexception();
                return NULL;
        }
 
@@ -3210,10 +3421,10 @@ jintArray NewIntArray(JNIEnv *env, jsize len)
 {
        java_intarray *ia;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (len < 0) {
-               *exceptionptr = new_negativearraysizeexception();
+               exceptions_throw_negativearraysizeexception();
                return NULL;
        }
 
@@ -3227,10 +3438,10 @@ jlongArray NewLongArray(JNIEnv *env, jsize len)
 {
        java_longarray *la;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (len < 0) {
-               *exceptionptr = new_negativearraysizeexception();
+               exceptions_throw_negativearraysizeexception();
                return NULL;
        }
 
@@ -3244,10 +3455,10 @@ jfloatArray NewFloatArray(JNIEnv *env, jsize len)
 {
        java_floatarray *fa;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (len < 0) {
-               *exceptionptr = new_negativearraysizeexception();
+               exceptions_throw_negativearraysizeexception();
                return NULL;
        }
 
@@ -3261,10 +3472,10 @@ jdoubleArray NewDoubleArray(JNIEnv *env, jsize len)
 {
        java_doublearray *da;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (len < 0) {
-               *exceptionptr = new_negativearraysizeexception();
+               exceptions_throw_negativearraysizeexception();
                return NULL;
        }
 
@@ -3283,7 +3494,7 @@ jdoubleArray NewDoubleArray(JNIEnv *env, jsize len)
 jboolean *GetBooleanArrayElements(JNIEnv *env, jbooleanArray array,
                                                                  jboolean *isCopy)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (isCopy)
                *isCopy = JNI_FALSE;
@@ -3294,7 +3505,7 @@ jboolean *GetBooleanArrayElements(JNIEnv *env, jbooleanArray array,
 
 jbyte *GetByteArrayElements(JNIEnv *env, jbyteArray array, jboolean *isCopy)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (isCopy)
                *isCopy = JNI_FALSE;
@@ -3305,7 +3516,7 @@ jbyte *GetByteArrayElements(JNIEnv *env, jbyteArray array, jboolean *isCopy)
 
 jchar *GetCharArrayElements(JNIEnv *env, jcharArray array, jboolean *isCopy)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (isCopy)
                *isCopy = JNI_FALSE;
@@ -3316,7 +3527,7 @@ jchar *GetCharArrayElements(JNIEnv *env, jcharArray array, jboolean *isCopy)
 
 jshort *GetShortArrayElements(JNIEnv *env, jshortArray array, jboolean *isCopy)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (isCopy)
                *isCopy = JNI_FALSE;
@@ -3327,7 +3538,7 @@ jshort *GetShortArrayElements(JNIEnv *env, jshortArray array, jboolean *isCopy)
 
 jint *GetIntArrayElements(JNIEnv *env, jintArray array, jboolean *isCopy)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (isCopy)
                *isCopy = JNI_FALSE;
@@ -3338,7 +3549,7 @@ jint *GetIntArrayElements(JNIEnv *env, jintArray array, jboolean *isCopy)
 
 jlong *GetLongArrayElements(JNIEnv *env, jlongArray array, jboolean *isCopy)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (isCopy)
                *isCopy = JNI_FALSE;
@@ -3349,7 +3560,7 @@ jlong *GetLongArrayElements(JNIEnv *env, jlongArray array, jboolean *isCopy)
 
 jfloat *GetFloatArrayElements(JNIEnv *env, jfloatArray array, jboolean *isCopy)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (isCopy)
                *isCopy = JNI_FALSE;
@@ -3361,7 +3572,7 @@ jfloat *GetFloatArrayElements(JNIEnv *env, jfloatArray array, jboolean *isCopy)
 jdouble *GetDoubleArrayElements(JNIEnv *env, jdoubleArray array,
                                                                jboolean *isCopy)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (isCopy)
                *isCopy = JNI_FALSE;
@@ -3384,7 +3595,7 @@ jdouble *GetDoubleArrayElements(JNIEnv *env, jdoubleArray array,
 void ReleaseBooleanArrayElements(JNIEnv *env, jbooleanArray array,
                                                                 jboolean *elems, jint mode)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (elems != array->data) {
                switch (mode) {
@@ -3406,7 +3617,7 @@ void ReleaseBooleanArrayElements(JNIEnv *env, jbooleanArray array,
 void ReleaseByteArrayElements(JNIEnv *env, jbyteArray array, jbyte *elems,
                                                          jint mode)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (elems != array->data) {
                switch (mode) {
@@ -3428,7 +3639,7 @@ void ReleaseByteArrayElements(JNIEnv *env, jbyteArray array, jbyte *elems,
 void ReleaseCharArrayElements(JNIEnv *env, jcharArray array, jchar *elems,
                                                          jint mode)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (elems != array->data) {
                switch (mode) {
@@ -3450,7 +3661,7 @@ void ReleaseCharArrayElements(JNIEnv *env, jcharArray array, jchar *elems,
 void ReleaseShortArrayElements(JNIEnv *env, jshortArray array, jshort *elems,
                                                           jint mode)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (elems != array->data) {
                switch (mode) {
@@ -3472,7 +3683,7 @@ void ReleaseShortArrayElements(JNIEnv *env, jshortArray array, jshort *elems,
 void ReleaseIntArrayElements(JNIEnv *env, jintArray array, jint *elems,
                                                         jint mode)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (elems != array->data) {
                switch (mode) {
@@ -3494,7 +3705,7 @@ void ReleaseIntArrayElements(JNIEnv *env, jintArray array, jint *elems,
 void ReleaseLongArrayElements(JNIEnv *env, jlongArray array, jlong *elems,
                                                          jint mode)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (elems != array->data) {
                switch (mode) {
@@ -3516,7 +3727,7 @@ void ReleaseLongArrayElements(JNIEnv *env, jlongArray array, jlong *elems,
 void ReleaseFloatArrayElements(JNIEnv *env, jfloatArray array, jfloat *elems,
                                                           jint mode)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (elems != array->data) {
                switch (mode) {
@@ -3538,7 +3749,7 @@ void ReleaseFloatArrayElements(JNIEnv *env, jfloatArray array, jfloat *elems,
 void ReleaseDoubleArrayElements(JNIEnv *env, jdoubleArray array,
                                                                jdouble *elems, jint mode)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (elems != array->data) {
                switch (mode) {
@@ -3567,12 +3778,10 @@ void ReleaseDoubleArrayElements(JNIEnv *env, jdoubleArray array,
 void GetBooleanArrayRegion(JNIEnv *env, jbooleanArray array, jsize start,
                                                   jsize len, jboolean *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(buf, &array->data[start], jboolean, len);
 }
@@ -3581,12 +3790,10 @@ void GetBooleanArrayRegion(JNIEnv *env, jbooleanArray array, jsize start,
 void GetByteArrayRegion(JNIEnv *env, jbyteArray array, jsize start, jsize len,
                                                jbyte *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size) 
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(buf, &array->data[start], jbyte, len);
 }
@@ -3595,12 +3802,10 @@ void GetByteArrayRegion(JNIEnv *env, jbyteArray array, jsize start, jsize len,
 void GetCharArrayRegion(JNIEnv *env, jcharArray array, jsize start, jsize len,
                                                jchar *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(buf, &array->data[start], jchar, len);
 }
@@ -3609,12 +3814,10 @@ void GetCharArrayRegion(JNIEnv *env, jcharArray array, jsize start, jsize len,
 void GetShortArrayRegion(JNIEnv *env, jshortArray array, jsize start,
                                                 jsize len, jshort *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else       
                MCOPY(buf, &array->data[start], jshort, len);
 }
@@ -3623,12 +3826,10 @@ void GetShortArrayRegion(JNIEnv *env, jshortArray array, jsize start,
 void GetIntArrayRegion(JNIEnv *env, jintArray array, jsize start, jsize len,
                                           jint *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(buf, &array->data[start], jint, len);
 }
@@ -3637,12 +3838,10 @@ void GetIntArrayRegion(JNIEnv *env, jintArray array, jsize start, jsize len,
 void GetLongArrayRegion(JNIEnv *env, jlongArray array, jsize start, jsize len,
                                                jlong *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(buf, &array->data[start], jlong, len);
 }
@@ -3651,12 +3850,10 @@ void GetLongArrayRegion(JNIEnv *env, jlongArray array, jsize start, jsize len,
 void GetFloatArrayRegion(JNIEnv *env, jfloatArray array, jsize start,
                                                 jsize len, jfloat *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(buf, &array->data[start], jfloat, len);
 }
@@ -3665,12 +3862,10 @@ void GetFloatArrayRegion(JNIEnv *env, jfloatArray array, jsize start,
 void GetDoubleArrayRegion(JNIEnv *env, jdoubleArray array, jsize start,
                                                  jsize len, jdouble *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start+len>array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(buf, &array->data[start], jdouble, len);
 }
@@ -3686,12 +3881,10 @@ void GetDoubleArrayRegion(JNIEnv *env, jdoubleArray array, jsize start,
 void SetBooleanArrayRegion(JNIEnv *env, jbooleanArray array, jsize start,
                                                   jsize len, jboolean *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(&array->data[start], buf, jboolean, len);
 }
@@ -3700,12 +3893,10 @@ void SetBooleanArrayRegion(JNIEnv *env, jbooleanArray array, jsize start,
 void SetByteArrayRegion(JNIEnv *env, jbyteArray array, jsize start, jsize len,
                                                jbyte *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(&array->data[start], buf, jbyte, len);
 }
@@ -3714,27 +3905,22 @@ void SetByteArrayRegion(JNIEnv *env, jbyteArray array, jsize start, jsize len,
 void SetCharArrayRegion(JNIEnv *env, jcharArray array, jsize start, jsize len,
                                                jchar *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(&array->data[start], buf, jchar, len);
-
 }
 
 
 void SetShortArrayRegion(JNIEnv *env, jshortArray array, jsize start,
                                                 jsize len, jshort *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(&array->data[start], buf, jshort, len);
 }
@@ -3743,57 +3929,46 @@ void SetShortArrayRegion(JNIEnv *env, jshortArray array, jsize start,
 void SetIntArrayRegion(JNIEnv *env, jintArray array, jsize start, jsize len,
                                           jint *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(&array->data[start], buf, jint, len);
-
 }
 
 
 void SetLongArrayRegion(JNIEnv* env, jlongArray array, jsize start, jsize len,
                                                jlong *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(&array->data[start], buf, jlong, len);
-
 }
 
 
 void SetFloatArrayRegion(JNIEnv *env, jfloatArray array, jsize start,
                                                 jsize len, jfloat *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(&array->data[start], buf, jfloat, len);
-
 }
 
 
 void SetDoubleArrayRegion(JNIEnv *env, jdoubleArray array, jsize start,
                                                  jsize len, jdouble *buf)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     if (start < 0 || len < 0 || start + len > array->header.size)
-               *exceptionptr =
-                       new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
-
+               exceptions_throw_arrayindexoutofboundsexception();
     else
                MCOPY(&array->data[start], buf, jdouble, len);
 }
@@ -3814,7 +3989,7 @@ void SetDoubleArrayRegion(JNIEnv *env, jdoubleArray array, jsize start,
 jint RegisterNatives(JNIEnv *env, jclass clazz, const JNINativeMethod *methods,
                                         jint nMethods)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
     log_text("JNI-Call: RegisterNatives: IMPLEMENT ME!!!");
 
@@ -3836,7 +4011,7 @@ jint RegisterNatives(JNIEnv *env, jclass clazz, const JNINativeMethod *methods,
 
 jint UnregisterNatives(JNIEnv *env, jclass clazz)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        /* XXX TWISTI hmm, maybe we should not support that (like kaffe) */
 
@@ -3857,10 +4032,10 @@ jint UnregisterNatives(JNIEnv *env, jclass clazz)
 
 jint MonitorEnter(JNIEnv *env, jobject obj)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (!obj) {
-               *exceptionptr = new_nullpointerexception();
+               exceptions_throw_nullpointerexception();
                return JNI_ERR;
        }
 
@@ -3884,9 +4059,10 @@ jint MonitorEnter(JNIEnv *env, jobject obj)
 
 jint MonitorExit(JNIEnv *env, jobject obj)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        if (!obj) {
-               *exceptionptr = new_nullpointerexception();
+               exceptions_throw_nullpointerexception();
                return JNI_ERR;
        }
 
@@ -3910,24 +4086,27 @@ jint MonitorExit(JNIEnv *env, jobject obj)
 
 jint GetJavaVM(JNIEnv *env, JavaVM **vm)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
     *vm = &ptr_jvm;
 
        return 0;
 }
 
 
-void GetStringRegion (JNIEnv* env, jstring str, jsize start, jsize len, jchar *buf)
+void GetStringRegion(JNIEnv* env, jstring str, jsize start, jsize len, jchar *buf)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: GetStringRegion");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: GetStringRegion: IMPLEMENT ME!");
 }
 
 
 void GetStringUTFRegion (JNIEnv* env, jstring str, jsize start, jsize len, char *buf)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: GetStringUTFRegion");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: GetStringUTFRegion: IMPLEMENT ME!");
 }
 
 
@@ -3939,9 +4118,16 @@ void GetStringUTFRegion (JNIEnv* env, jstring str, jsize start, jsize len, char
 
 void *GetPrimitiveArrayCritical(JNIEnv *env, jarray array, jboolean *isCopy)
 {
+       java_bytearray *ba;
+       jbyte          *bp;
+
+       ba = (java_bytearray *) array;
+
        /* do the same as Kaffe does */
 
-       return GetByteArrayElements(env, (jbyteArray) array, isCopy);
+       bp = GetByteArrayElements(env, ba, isCopy);
+
+       return (void *) bp;
 }
 
 
@@ -3954,7 +4140,7 @@ void *GetPrimitiveArrayCritical(JNIEnv *env, jarray array, jboolean *isCopy)
 void ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray,
                                                                   jint mode)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        /* do the same as Kaffe does */
 
@@ -3971,7 +4157,7 @@ void ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray,
 
 const jchar *GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        return GetStringChars(env, string, isCopy);
 }
@@ -3979,27 +4165,27 @@ const jchar *GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy)
 
 void ReleaseStringCritical(JNIEnv *env, jstring string, const jchar *cstring)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        ReleaseStringChars(env, string, cstring);
 }
 
 
-jweak NewWeakGlobalRef (JNIEnv* env, jobject obj)
+jweak NewWeakGlobalRef(JNIEnv* env, jobject obj)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: NewWeakGlobalRef");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: NewWeakGlobalRef: IMPLEMENT ME!");
 
        return obj;
 }
 
 
-void DeleteWeakGlobalRef (JNIEnv* env, jweak ref)
+void DeleteWeakGlobalRef(JNIEnv* env, jweak ref)
 {
-       STATS(jniinvokation();)
-       log_text("JNI-Call: DeleteWeakGlobalRef");
+       STATISTICS(jniinvokation());
 
-       /* empty */
+       log_text("JNI-Call: DeleteWeakGlobalRef: IMPLEMENT ME");
 }
 
 
@@ -4015,7 +4201,7 @@ jobject NewGlobalRef(JNIEnv* env, jobject lobj)
        java_lang_Integer *refcount;
        java_objectheader *newval;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
 #if defined(USE_THREADS)
        builtin_monitorenter(*global_ref_table);
@@ -4062,7 +4248,7 @@ void DeleteGlobalRef(JNIEnv* env, jobject globalRef)
        java_lang_Integer *refcount;
        s4                 val;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
 #if defined(USE_THREADS)
        builtin_monitorenter(*global_ref_table);
@@ -4107,7 +4293,8 @@ void DeleteGlobalRef(JNIEnv* env, jobject globalRef)
 
 jboolean ExceptionCheck(JNIEnv *env)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
+
        return *exceptionptr ? JNI_TRUE : JNI_FALSE;
 }
 
@@ -4124,28 +4311,33 @@ jboolean ExceptionCheck(JNIEnv *env)
 
 jobject NewDirectByteBuffer(JNIEnv *env, void *address, jlong capacity)
 {
-       java_nio_DirectByteBufferImpl *nbuf;
+       java_objectheader *nbuf;
 #if SIZEOF_VOID_P == 8
        gnu_classpath_Pointer64 *paddress;
 #else
        gnu_classpath_Pointer32 *paddress;
 #endif
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        log_text("JNI-NewDirectByteBuffer: called");
 
-       /* allocate a java.nio.DirectByteBufferImpl object */
+#if 0
+       /* allocate a java.nio.DirectByteBufferImpl$ReadWrite object */
 
-       if (!(nbuf = (java_nio_DirectByteBufferImpl *) builtin_new(class_java_nio_DirectByteBufferImpl)))
+       if (!(nbuf = (java_nio_DirectByteBufferImpl$ReadWrite *)
+                 builtin_new(class_java_nio_DirectByteBufferImpl_ReadWrite)))
                return NULL;
+#endif
 
        /* alocate a gnu.classpath.Pointer{32,64} object */
 
 #if SIZEOF_VOID_P == 8
-       if (!(paddress = (gnu_classpath_Pointer64 *) builtin_new(class_gnu_classpath_Pointer64)))
+       if (!(paddress = (gnu_classpath_Pointer64 *)
+                 builtin_new(class_gnu_classpath_Pointer64)))
 #else
-       if (!(paddress = (gnu_classpath_Pointer32 *) builtin_new(class_gnu_classpath_Pointer32)))
+       if (!(paddress = (gnu_classpath_Pointer32 *)
+                 builtin_new(class_gnu_classpath_Pointer32)))
 #endif
                return NULL;
 
@@ -4153,16 +4345,22 @@ jobject NewDirectByteBuffer(JNIEnv *env, void *address, jlong capacity)
 
        paddress->data = (ptrint) address;
 
+#if 0
        /* fill java.nio.Buffer object */
 
        nbuf->cap     = (s4) capacity;
        nbuf->limit   = (s4) capacity;
        nbuf->pos     = 0;
        nbuf->address = (gnu_classpath_Pointer *) paddress;
+#endif
+
+       nbuf = (*env)->NewObject(env, class_java_nio_DirectByteBufferImpl_ReadWrite,
+                                                        dbbirw_init, NULL, paddress,
+                                                        (jint) capacity, (jint) capacity, (jint) 0);
 
        /* add local reference and return the value */
 
-       return NewLocalRef(env, (jobject) nbuf);
+       return NewLocalRef(env, nbuf);
 }
 
 
@@ -4182,7 +4380,7 @@ void *GetDirectBufferAddress(JNIEnv *env, jobject buf)
        gnu_classpath_Pointer32       *address;
 #endif
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
 #if 0
        if (!builtin_instanceof(buf, class_java_nio_DirectByteBufferImpl))
@@ -4212,7 +4410,7 @@ jlong GetDirectBufferCapacity(JNIEnv* env, jobject buf)
 {
        java_nio_Buffer *nbuf;
 
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
        if (buf == NULL)
                return -1;
@@ -4225,8 +4423,9 @@ jlong GetDirectBufferCapacity(JNIEnv* env, jobject buf)
 
 jint DestroyJavaVM(JavaVM *vm)
 {
-       STATS(jniinvokation();)
-       log_text("DestroyJavaVM called");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: DestroyJavaVM: IMPLEMENT ME!");
 
        return 0;
 }
@@ -4248,9 +4447,9 @@ jint DestroyJavaVM(JavaVM *vm)
 
 jint AttachCurrentThread(JavaVM *vm, void **env, void *thr_args)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
-       log_text("AttachCurrentThread called");
+       log_text("JNI-Call: AttachCurrentThread: IMPLEMENT ME!");
 
 #if !defined(HAVE___THREAD)
 /*     cacao_thread_attach();*/
@@ -4266,8 +4465,9 @@ jint AttachCurrentThread(JavaVM *vm, void **env, void *thr_args)
 
 jint DetachCurrentThread(JavaVM *vm)
 {
-       STATS(jniinvokation();)
-       log_text("DetachCurrentThread called");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: DetachCurrentThread: IMPLEMENT ME!");
 
        return 0;
 }
@@ -4284,7 +4484,7 @@ jint DetachCurrentThread(JavaVM *vm)
 
 jint GetEnv(JavaVM *vm, void **env, jint version)
 {
-       STATS(jniinvokation();)
+       STATISTICS(jniinvokation());
 
 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
        if (thread_getself() == NULL) {
@@ -4319,8 +4519,9 @@ jint GetEnv(JavaVM *vm, void **env, jint version)
 
 jint AttachCurrentThreadAsDaemon(JavaVM *vm, void **par1, void *par2)
 {
-       STATS(jniinvokation();)
-       log_text("AttachCurrentThreadAsDaemon called");
+       STATISTICS(jniinvokation());
+
+       log_text("JNI-Call: AttachCurrentThreadAsDaemon: IMPLEMENT ME!");
 
        return 0;
 }
@@ -4820,7 +5021,7 @@ jobject *jni_method_invokeNativeHelper(JNIEnv *env, methodinfo *methodID,
        }
        break;
 
-       case 'J': {
+       case PRIMITIVETYPE_LONG: {
                jlong longVal;
                longVal = asm_calljavafunction2long(methodID,
                                                                                        argcount,