* src/vm/vm.c, src/vm/vm.h: Moved to .cpp.
[cacao.git] / src / native / jni.c
index d4a4f31e84ab931d4211b248b0f7b8acd2abc427..592a16350d690640a5ce3ffacf2b6db34c2b22d5 100644 (file)
@@ -31,7 +31,7 @@
 
 #include "vm/types.h"
 
-#include "mm/gc-common.h"
+#include "mm/gc.hpp"
 #include "mm/memory.h"
 
 #include "native/jni.h"
@@ -40,7 +40,7 @@
 #include "native/native.h"
 
 #if defined(ENABLE_JAVASE)
-# if defined(WITH_CLASSPATH_GNU)
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
 #  include "native/include/gnu_classpath_Pointer.h"
 
 #  if SIZEOF_VOID_P == 8
@@ -56,7 +56,8 @@
 #include "native/include/java_lang_Throwable.h"
 
 #if defined(ENABLE_JAVASE)
-# if defined(WITH_CLASSPATH_SUN)
+
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
 #  include "native/include/java_nio_ByteBuffer.h"       /* required by j.l.CL */
 # endif
 
@@ -75,21 +76,21 @@ struct java_lang_ClassLoader;
 
 # include "native/include/java_nio_Buffer.h"
 
-# if defined(WITH_CLASSPATH_GNU)
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
 #  include "native/include/java_lang_reflect_VMConstructor.h"
 #  include "native/include/java_lang_reflect_VMField.h"
 #  include "native/include/java_lang_reflect_VMMethod.h"
 
 #  include "native/include/java_nio_DirectByteBufferImpl.h"
 # endif
+#elif defined(ENABLE_JAVAME_CLDC1_1)
+# include "native/include/java_lang_Class.h"
 #endif
 
 #if defined(ENABLE_JVMTI)
 # include "native/jvmti/cacaodbg.h"
 #endif
 
-#include "native/vm/java_lang_Class.h"
-
 #if defined(ENABLE_JAVASE)
 # include "native/vm/reflect.h"
 #endif
@@ -104,10 +105,10 @@ struct java_lang_ClassLoader;
 #include "vm/exceptions.h"
 #include "vm/global.h"
 #include "vm/initialize.h"
-#include "vm/primitive.h"
+#include "vm/primitive.hpp"
 #include "vm/resolve.h"
 #include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
 
 #include "vm/jit/argument.h"
 #include "vm/jit/asmpart.h"
@@ -122,14 +123,36 @@ struct java_lang_ClassLoader;
 /* debug **********************************************************************/
 
 #if !defined(NDEBUG)
-# define TRACEJNICALLS(text)                                   \
+
+# define TRACEJNICALLS(x)                                              \
     do {                                                                               \
         if (opt_TraceJNICalls) {                               \
-            log_println text;                                  \
+            log_println x;                                             \
         }                                                                              \
     } while (0)
+
+# define TRACEJNICALLSENTER(x)                                                                 \
+    do {                                                                                                               \
+        if (opt_TraceJNICalls) {                                                               \
+                       log_start();                                                                            \
+            log_print x;                                                                               \
+        }                                                                                                              \
+    } while (0)
+
+# define TRACEJNICALLSEXIT(x)                                                                  \
+    do {                                                                                                               \
+        if (opt_TraceJNICalls) {                                                               \
+                       log_print x;                                                                            \
+                       log_finish();                                                                           \
+        }                                                                                                              \
+    } while (0)
+
 #else
-# define TRACEJNICALLS(text)
+
+# define TRACEJNICALLS(x)
+# define TRACEJNICALLSENTER(x)
+# define TRACEJNICALLSEXIT(x)
+
 #endif
 
 
@@ -149,7 +172,7 @@ static hashtable *hashtable_global_ref; /* hashtable for globalrefs           */
 #if defined(ENABLE_JAVASE)
 static classinfo *class_java_nio_Buffer;
 
-# if defined(WITH_CLASSPATH_GNU)
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
 
 static classinfo *class_java_nio_DirectByteBufferImpl;
 static classinfo *class_java_nio_DirectByteBufferImpl_ReadWrite;
@@ -162,7 +185,7 @@ static classinfo *class_gnu_classpath_Pointer32;
 
 static methodinfo *dbbirw_init;
 
-# elif defined(WITH_CLASSPATH_SUN)
+# elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
 
 static classinfo *class_sun_nio_ch_DirectBuffer;
 static classinfo *class_java_nio_DirectByteBuffer;
@@ -175,7 +198,7 @@ static methodinfo *dbb_init;
 
 /* some forward declarations **************************************************/
 
-jobject _Jv_JNI_NewLocalRef(JNIEnv *env, jobject ref);
+jobject jni_NewLocalRef(JNIEnv *env, jobject ref);
 
 
 /* jni_init ********************************************************************
@@ -203,7 +226,7 @@ bool jni_init(void)
                !link_class(class_java_nio_Buffer))
                return false;
 
-# if defined(WITH_CLASSPATH_GNU)
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
 
        if (!(class_java_nio_DirectByteBufferImpl =
                  load_class_bootstrap(utf_new_char("java/nio/DirectByteBufferImpl"))) ||
@@ -233,7 +256,7 @@ bool jni_init(void)
                return false;
 #  endif
 
-# elif defined(WITH_CLASSPATH_SUN)
+# elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
 
        if (!(class_sun_nio_ch_DirectBuffer =
                  load_class_bootstrap(utf_new_char("sun/nio/ch/DirectBuffer"))))
@@ -850,7 +873,7 @@ jclass _Jv_JNI_DefineClass(JNIEnv *env, const char *name, jobject loader,
 
        co = LLNI_classinfo_wrap(c);
 
-       return (jclass) _Jv_JNI_NewLocalRef(env, (jobject) co);
+       return (jclass) jni_NewLocalRef(env, (jobject) co);
 #else
        vm_abort("_Jv_JNI_DefineClass: not implemented in this configuration");
 
@@ -920,7 +943,7 @@ jclass jni_FindClass(JNIEnv *env, const char *name)
 
        co = LLNI_classinfo_wrap(c);
 
-       return (jclass) _Jv_JNI_NewLocalRef(env, (jobject) co);
+       return (jclass) jni_NewLocalRef(env, (jobject) co);
 
 #elif defined(ENABLE_JAVAME_CLDC1_1)
 
@@ -940,7 +963,7 @@ jclass jni_FindClass(JNIEnv *env, const char *name)
        if (!link_class(c))
                return NULL;
 
-       return (jclass) _Jv_JNI_NewLocalRef(env, (jobject) c);
+       return (jclass) jni_NewLocalRef(env, (jobject) c);
        
 #else
        vm_abort("jni_FindClass: not implemented in this configuration");
@@ -977,7 +1000,7 @@ jclass _Jv_JNI_GetSuperclass(JNIEnv *env, jclass sub)
 
        co = LLNI_classinfo_wrap(super);
 
-       return (jclass) _Jv_JNI_NewLocalRef(env, (jobject) co);
+       return (jclass) jni_NewLocalRef(env, (jobject) co);
 }
   
  
@@ -989,15 +1012,15 @@ jclass _Jv_JNI_GetSuperclass(JNIEnv *env, jclass sub)
 
 jboolean _Jv_JNI_IsAssignableFrom(JNIEnv *env, jclass sub, jclass sup)
 {
-       java_lang_Class *csup;
-       java_lang_Class *csub;
+       classinfo *to;
+       classinfo *from;
 
-       csup = (java_lang_Class *) sup;
-       csub = (java_lang_Class *) sub;
+       TRACEJNICALLS(("_Jv_JNI_IsAssignableFrom(env=%p, sub=%p, sup=%p)", env, sub, sup));
 
-       STATISTICS(jniinvokation());
+       to   = (classinfo *) sup;
+       from = (classinfo *) sub;
 
-       return _Jv_java_lang_Class_isAssignableFrom(csup, csub);
+       return class_is_assignable_from(to, from);
 }
 
 
@@ -1071,7 +1094,7 @@ jthrowable _Jv_JNI_ExceptionOccurred(JNIEnv *env)
 
        o = exceptions_get_exception();
 
-       return _Jv_JNI_NewLocalRef(env, (jthrowable) o);
+       return jni_NewLocalRef(env, (jthrowable) o);
 }
 
 
@@ -1130,9 +1153,9 @@ void _Jv_JNI_FatalError(JNIEnv *env, const char *msg)
 
 *******************************************************************************/
 
-jint _Jv_JNI_PushLocalFrame(JNIEnv* env, jint capacity)
+jint jni_PushLocalFrame(JNIEnv* env, jint capacity)
 {
-       STATISTICS(jniinvokation());
+       TRACEJNICALLS(("jni_PushLocalFrame(env=%p, capacity=%d)", env, capacity));
 
        if (capacity <= 0)
                return -1;
@@ -1154,9 +1177,9 @@ jint _Jv_JNI_PushLocalFrame(JNIEnv* env, jint capacity)
 
 *******************************************************************************/
 
-jobject _Jv_JNI_PopLocalFrame(JNIEnv* env, jobject result)
+jobject jni_PopLocalFrame(JNIEnv* env, jobject result)
 {
-       STATISTICS(jniinvokation());
+       TRACEJNICALLS(("jni_PopLocalFrame(env=%p, result=%p)", env, result));
 
        /* release all current local frames */
 
@@ -1164,7 +1187,7 @@ jobject _Jv_JNI_PopLocalFrame(JNIEnv* env, jobject result)
 
        /* add local reference and return the value */
 
-       return _Jv_JNI_NewLocalRef(env, result);
+       return jni_NewLocalRef(env, result);
 }
 
 
@@ -1174,11 +1197,11 @@ jobject _Jv_JNI_PopLocalFrame(JNIEnv* env, jobject result)
 
 *******************************************************************************/
 
-void _Jv_JNI_DeleteLocalRef(JNIEnv *env, jobject localRef)
+void jni_DeleteLocalRef(JNIEnv *env, jobject localRef)
 {
        java_handle_t *o;
 
-       STATISTICS(jniinvokation());
+       TRACEJNICALLS(("jni_DeleteLocalRef(env=%p, ref=%p)", env, localRef));
 
        o = (java_handle_t *) localRef;
 
@@ -1227,12 +1250,12 @@ jboolean _Jv_JNI_IsSameObject(JNIEnv *env, jobject ref1, jobject ref2)
 
 *******************************************************************************/
 
-jobject _Jv_JNI_NewLocalRef(JNIEnv *env, jobject ref)
+jobject jni_NewLocalRef(JNIEnv *env, jobject ref)
 {
        java_handle_t *o;
        java_handle_t *localref;
 
-       STATISTICS(jniinvokation());
+       TRACEJNICALLS(("jni_NewLocalRef(env=%p, ref=%p)", env, ref));
 
        o = (java_handle_t *) ref;
 
@@ -1254,11 +1277,11 @@ jobject _Jv_JNI_NewLocalRef(JNIEnv *env, jobject ref)
 
 *******************************************************************************/
 
-jint _Jv_JNI_EnsureLocalCapacity(JNIEnv* env, jint capacity)
+jint jni_EnsureLocalCapacity(JNIEnv* env, jint capacity)
 {
        localref_table *lrt;
 
-       STATISTICS(jniinvokation());
+       TRACEJNICALLS(("jni_EnsureLocalCapacity(env=%p, capacity=%d)", env, capacity));
 
        /* get local reference table (thread specific) */
 
@@ -1267,7 +1290,7 @@ jint _Jv_JNI_EnsureLocalCapacity(JNIEnv* env, jint capacity)
        /* check if capacity elements are available in the local references table */
 
        if ((lrt->used + capacity) > lrt->capacity)
-               return _Jv_JNI_PushLocalFrame(env, capacity);
+               return jni_PushLocalFrame(env, capacity);
 
        return 0;
 }
@@ -1296,7 +1319,7 @@ jobject _Jv_JNI_AllocObject(JNIEnv *env, jclass clazz)
                
        o = builtin_new(c);
 
-       return _Jv_JNI_NewLocalRef(env, (jobject) o);
+       return jni_NewLocalRef(env, (jobject) o);
 }
 
 
@@ -1309,14 +1332,14 @@ jobject _Jv_JNI_AllocObject(JNIEnv *env, jclass clazz)
 
 *******************************************************************************/
 
-jobject _Jv_JNI_NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
+jobject jni_NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
 {
        java_handle_t *o;
        classinfo     *c;
        methodinfo    *m;
        va_list        ap;
 
-       STATISTICS(jniinvokation());
+       TRACEJNICALLSENTER(("jni_NewObject(env=%p, clazz=%p, methodID=%p, ...)", env, clazz, methodID));
 
        c = LLNI_classinfo_unwrap(clazz);
        m = (methodinfo *) methodID;
@@ -1334,7 +1357,9 @@ jobject _Jv_JNI_NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
        _Jv_jni_CallVoidMethod(o, LLNI_vftbl_direct(o), m, ap);
        va_end(ap);
 
-       return _Jv_JNI_NewLocalRef(env, (jobject) o);
+       TRACEJNICALLSEXIT(("->%p", o));
+
+       return jni_NewLocalRef(env, (jobject) o);
 }
 
 
@@ -1371,7 +1396,7 @@ jobject _Jv_JNI_NewObjectV(JNIEnv* env, jclass clazz, jmethodID methodID,
 
        _Jv_jni_CallVoidMethod(o, LLNI_vftbl_direct(o), m, args);
 
-       return _Jv_JNI_NewLocalRef(env, (jobject) o);
+       return jni_NewLocalRef(env, (jobject) o);
 }
 
 
@@ -1408,7 +1433,7 @@ jobject _Jv_JNI_NewObjectA(JNIEnv* env, jclass clazz, jmethodID methodID,
 
        _Jv_jni_CallVoidMethodA(o, LLNI_vftbl_direct(o), m, args);
 
-       return _Jv_JNI_NewLocalRef(env, (jobject) o);
+       return jni_NewLocalRef(env, (jobject) o);
 }
 
 
@@ -1435,7 +1460,7 @@ jclass _Jv_JNI_GetObjectClass(JNIEnv *env, jobject obj)
 
        co = LLNI_classinfo_wrap(c);
 
-       return (jclass) _Jv_JNI_NewLocalRef(env, (jobject) co);
+       return (jclass) jni_NewLocalRef(env, (jobject) co);
 }
 
 
@@ -1447,15 +1472,16 @@ jclass _Jv_JNI_GetObjectClass(JNIEnv *env, jobject obj)
 
 jboolean _Jv_JNI_IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz)
 {
-       java_lang_Class  *c;
-       java_lang_Object *o;
+       classinfo     *c;
+       java_handle_t *h;
 
-       STATISTICS(jniinvokation());
+       TRACEJNICALLS(("_Jv_JNI_IsInstanceOf(env=%p, obj=%p, clazz=%p)", env, obj, clazz));
 
-       c = (java_lang_Class *) clazz;
-       o = (java_lang_Object *) obj;
+       /* XXX Is this correct? */
+       c = LLNI_classinfo_unwrap(clazz);
+       h = (java_handle_t *) obj;
 
-       return _Jv_java_lang_Class_isInstance(c, o);
+       return class_is_instance(c, h);
 }
 
 
@@ -1478,7 +1504,7 @@ jmethodID jni_FromReflectedMethod(JNIEnv *env, jobject method)
        methodinfo                      *m;
        int32_t                          slot;
 
-#if defined(WITH_CLASSPATH_GNU)
+#if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
        java_lang_reflect_VMMethod      *rvmm;
        java_lang_reflect_VMConstructor *rvmc;
 #endif
@@ -1493,13 +1519,13 @@ jmethodID jni_FromReflectedMethod(JNIEnv *env, jobject method)
        if (o->vftbl->clazz == class_java_lang_reflect_Constructor) {
                rc = (java_lang_reflect_Constructor *) method;
 
-#if defined(WITH_CLASSPATH_GNU)
+#if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
 
                LLNI_field_get_ref(rc,   cons , rvmc);
                LLNI_field_get_cls(rvmc, clazz, c);
                LLNI_field_get_val(rvmc, slot , slot);
 
-#elif defined(WITH_CLASSPATH_SUN)
+#elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
 
                LLNI_field_get_cls(rc, clazz, c);
                LLNI_field_get_val(rc, slot , slot);
@@ -1513,13 +1539,13 @@ jmethodID jni_FromReflectedMethod(JNIEnv *env, jobject method)
 
                rm = (java_lang_reflect_Method *) method;
 
-#if defined(WITH_CLASSPATH_GNU)
+#if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
 
                LLNI_field_get_ref(rm,   m ,    rvmm);
                LLNI_field_get_cls(rvmm, clazz, c);
                LLNI_field_get_val(rvmm, slot , slot);
 
-#elif defined(WITH_CLASSPATH_SUN)
+#elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
 
                LLNI_field_get_cls(rm, clazz, c);
                LLNI_field_get_val(rm, slot , slot);
@@ -1556,7 +1582,7 @@ jfieldID jni_FromReflectedField(JNIEnv* env, jobject field)
        fieldinfo                 *f;
        int32_t                    slot;
 
-#if defined(WITH_CLASSPATH_GNU)
+#if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
        java_lang_reflect_VMField *rvmf;
 #endif
 
@@ -1567,13 +1593,13 @@ jfieldID jni_FromReflectedField(JNIEnv* env, jobject field)
        if (rf == NULL)
                return NULL;
 
-#if defined(WITH_CLASSPATH_GNU)
+#if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
 
        LLNI_field_get_ref(rf,   f,     rvmf);
        LLNI_field_get_cls(rvmf, clazz, c);
        LLNI_field_get_val(rvmf, slot , slot);
 
-#elif defined(WITH_CLASSPATH_SUN)
+#elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
 
        LLNI_field_get_cls(rf, clazz, c);
        LLNI_field_get_val(rf, slot , slot);
@@ -1805,7 +1831,7 @@ jobject _Jv_JNI_CallObjectMethod(JNIEnv *env, jobject obj, jmethodID methodID,
        ret = _Jv_jni_CallObjectMethod(o, LLNI_vftbl_direct(o), m, ap);
        va_end(ap);
 
-       return _Jv_JNI_NewLocalRef(env, (jobject) ret);
+       return jni_NewLocalRef(env, (jobject) ret);
 }
 
 
@@ -1821,7 +1847,7 @@ jobject _Jv_JNI_CallObjectMethodV(JNIEnv *env, jobject obj, jmethodID methodID,
 
        ret = _Jv_jni_CallObjectMethod(o, LLNI_vftbl_direct(o), m, args);
 
-       return _Jv_JNI_NewLocalRef(env, (jobject) ret);
+       return jni_NewLocalRef(env, (jobject) ret);
 }
 
 
@@ -1837,7 +1863,7 @@ jobject _Jv_JNI_CallObjectMethodA(JNIEnv *env, jobject obj, jmethodID methodID,
 
        ret = _Jv_jni_CallObjectMethodA(o, LLNI_vftbl_direct(o), m, args);
 
-       return _Jv_JNI_NewLocalRef(env, (jobject) ret);
+       return jni_NewLocalRef(env, (jobject) ret);
 }
 
 
@@ -1982,7 +2008,7 @@ jobject _Jv_JNI_CallNonvirtualObjectMethod(JNIEnv *env, jobject obj,
        r = _Jv_jni_CallObjectMethod(o, c->vftbl, m, ap);
        va_end(ap);
 
-       return _Jv_JNI_NewLocalRef(env, (jobject) r);
+       return jni_NewLocalRef(env, (jobject) r);
 }
 
 
@@ -2001,7 +2027,7 @@ jobject _Jv_JNI_CallNonvirtualObjectMethodV(JNIEnv *env, jobject obj,
 
        r = _Jv_jni_CallObjectMethod(o, c->vftbl, m, args);
 
-       return _Jv_JNI_NewLocalRef(env, (jobject) r);
+       return jni_NewLocalRef(env, (jobject) r);
 }
 
 
@@ -2011,7 +2037,7 @@ jobject _Jv_JNI_CallNonvirtualObjectMethodA(JNIEnv *env, jobject obj,
 {
        log_text("JNI-Call: CallNonvirtualObjectMethodA: IMPLEMENT ME!");
 
-       return _Jv_JNI_NewLocalRef(env, NULL);
+       return jni_NewLocalRef(env, NULL);
 }
 
 
@@ -2149,7 +2175,7 @@ jobject _Jv_JNI_GetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID)
 
        LLNI_CRITICAL_END;
 
-       return _Jv_JNI_NewLocalRef(env, (jobject) o);
+       return jni_NewLocalRef(env, (jobject) o);
 }
 
 
@@ -2338,7 +2364,7 @@ jobject _Jv_JNI_CallStaticObjectMethod(JNIEnv *env, jclass clazz,
        o = _Jv_jni_CallObjectMethod(NULL, NULL, m, ap);
        va_end(ap);
 
-       return _Jv_JNI_NewLocalRef(env, (jobject) o);
+       return jni_NewLocalRef(env, (jobject) o);
 }
 
 
@@ -2354,7 +2380,7 @@ jobject _Jv_JNI_CallStaticObjectMethodV(JNIEnv *env, jclass clazz,
 
        o = _Jv_jni_CallObjectMethod(NULL, NULL, m, args);
 
-       return _Jv_JNI_NewLocalRef(env, (jobject) o);
+       return jni_NewLocalRef(env, (jobject) o);
 }
 
 
@@ -2370,7 +2396,7 @@ jobject _Jv_JNI_CallStaticObjectMethodA(JNIEnv *env, jclass clazz,
 
        o = _Jv_jni_CallObjectMethodA(NULL, NULL, m, args);
 
-       return _Jv_JNI_NewLocalRef(env, (jobject) o);
+       return jni_NewLocalRef(env, (jobject) o);
 }
 
 
@@ -2505,7 +2531,7 @@ jobject _Jv_JNI_GetStaticObjectField(JNIEnv *env, jclass clazz,
 
        h = LLNI_WRAP(f->value->a);
 
-       return _Jv_JNI_NewLocalRef(env, (jobject) h);
+       return jni_NewLocalRef(env, (jobject) h);
 }
 
 
@@ -2597,7 +2623,7 @@ jstring _Jv_JNI_NewString(JNIEnv *env, const jchar *buf, jsize len)
        LLNI_field_set_val(s, offset, 0);
        LLNI_field_set_val(s, count , len);
 
-       return (jstring) _Jv_JNI_NewLocalRef(env, (jobject) s);
+       return (jstring) jni_NewLocalRef(env, (jobject) s);
 }
 
 
@@ -2735,7 +2761,7 @@ jstring _Jv_JNI_NewStringUTF(JNIEnv *env, const char *bytes)
 
        s = (java_lang_String *) javastring_safe_new_from_utf8(bytes);
 
-    return (jstring) _Jv_JNI_NewLocalRef(env, (jobject) s);
+    return (jstring) jni_NewLocalRef(env, (jobject) s);
 }
 
 
@@ -2862,7 +2888,7 @@ jobjectArray _Jv_JNI_NewObjectArray(JNIEnv *env, jsize length,
        for (i = 0; i < length; i++)
                array_objectarray_element_set(oa, i, o);
 
-       return (jobjectArray) _Jv_JNI_NewLocalRef(env, (jobject) oa);
+       return (jobjectArray) jni_NewLocalRef(env, (jobject) oa);
 }
 
 
@@ -2883,7 +2909,7 @@ jobject _Jv_JNI_GetObjectArrayElement(JNIEnv *env, jobjectArray array,
 
        o = array_objectarray_element_get(oa, index);
 
-       return _Jv_JNI_NewLocalRef(env, (jobject) o);
+       return jni_NewLocalRef(env, (jobject) o);
 }
 
 
@@ -2927,7 +2953,7 @@ type _Jv_JNI_New##name##Array(JNIEnv *env, jsize len)    \
                                                          \
        a = builtin_newarray_##intern(len);                  \
                                                          \
-       return (type) _Jv_JNI_NewLocalRef(env, (jobject) a); \
+       return (type) jni_NewLocalRef(env, (jobject) a); \
 }
 
 JNI_NEW_ARRAY(Boolean, jbooleanArray, boolean)
@@ -3203,7 +3229,7 @@ jint _Jv_JNI_GetJavaVM(JNIEnv *env, JavaVM **vm)
 {
        STATISTICS(jniinvokation());
 
-    *vm = (JavaVM *) _Jv_jvm;
+    *vm = VM_get_javavm();
 
        return 0;
 }
@@ -3281,21 +3307,37 @@ void _Jv_JNI_GetStringUTFRegion(JNIEnv* env, jstring str, jsize start,
 
    Obtain a direct pointer to array elements.
 
+   ATTENTION: Critical section keeps open when this function returns!
+   See ReleasePrimitiveArrayCritical.
+
 *******************************************************************************/
 
-void *_Jv_JNI_GetPrimitiveArrayCritical(JNIEnv *env, jarray array,
-                                                                               jboolean *isCopy)
+void* jni_GetPrimitiveArrayCritical(JNIEnv *env, jarray array, jboolean *isCopy)
 {
-       java_handle_bytearray_t *ba;
-       jbyte                   *bp;
+       java_handle_t*   h;
+       java_array_t*    a;
+       arraydescriptor* ad;
+       void*            data;
+
+       TRACEJNICALLS(("jni_GetPrimitiveArrayCritical(env=%p, array=%p, isCopy=%d)", env, array, isCopy));
 
-       ba = (java_handle_bytearray_t *) array;
+       if (isCopy != NULL) {
+               *isCopy = JNI_FALSE;
+       }
 
-       /* do the same as Kaffe does */
+       LLNI_CRITICAL_START;
 
-       bp = _Jv_JNI_GetByteArrayElements(env, (jbyteArray) ba, isCopy);
+       h  = (java_handle_t*) array;
+       a  = (java_array_t*) LLNI_UNWRAP(h);
+       ad = a->objheader.vftbl->arraydesc;
 
-       return (void *) bp;
+       /* Sanity check. */
+
+       assert(ad != NULL);
+
+       data = (void*) (((intptr_t) a) + ad->dataoffset);
+
+       return data;
 }
 
 
@@ -3303,17 +3345,16 @@ void *_Jv_JNI_GetPrimitiveArrayCritical(JNIEnv *env, jarray array,
 
    No specific documentation.
 
+   ATTENTION: This function closes the critical section opened in
+   GetPrimitiveArrayCritical!
+
 *******************************************************************************/
 
-void _Jv_JNI_ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array,
-                                                                                  void *carray, jint mode)
+void jni_ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray, jint mode)
 {
-       STATISTICS(jniinvokation());
+       TRACEJNICALLS(("jni_ReleasePrimitiveArrayCritical(env=%p, array=%p, carray=%p, mode=%d)", env, array, carray, mode));
 
-       /* do the same as Kaffe does */
-
-       _Jv_JNI_ReleaseByteArrayElements(env, (jbyteArray) array, (jbyte *) carray,
-                                                                        mode);
+       LLNI_CRITICAL_END;
 }
 
 
@@ -3363,14 +3404,14 @@ void _Jv_JNI_DeleteWeakGlobalRef(JNIEnv* env, jweak ref)
 
 *******************************************************************************/
     
-jobject _Jv_JNI_NewGlobalRef(JNIEnv* env, jobject obj)
+jobject jni_NewGlobalRef(JNIEnv* env, jobject obj)
 {
        hashtable_global_ref_entry *gre;
        u4   key;                           /* hashkey                            */
        u4   slot;                          /* slot in hashtable                  */
        java_handle_t *o;
 
-       STATISTICS(jniinvokation());
+       TRACEJNICALLS(("jni_NewGlobalRef(env=%p, obj=%p)", env, obj));
 
        o = (java_handle_t *) obj;
 
@@ -3403,7 +3444,7 @@ jobject _Jv_JNI_NewGlobalRef(JNIEnv* env, jobject obj)
        /* global ref not found, create a new one */
 
        if (gre == NULL) {
-               gre = NEW(hashtable_global_ref_entry);
+               gre = GCNEW_UNCOLLECTABLE(hashtable_global_ref_entry, 1);
 
 #if defined(ENABLE_GC_CACAO)
                /* register global ref with the GC */
@@ -3445,7 +3486,7 @@ jobject _Jv_JNI_NewGlobalRef(JNIEnv* env, jobject obj)
 
 *******************************************************************************/
 
-void _Jv_JNI_DeleteGlobalRef(JNIEnv* env, jobject globalRef)
+void jni_DeleteGlobalRef(JNIEnv* env, jobject globalRef)
 {
        hashtable_global_ref_entry *gre;
        hashtable_global_ref_entry *prevgre;
@@ -3453,7 +3494,7 @@ void _Jv_JNI_DeleteGlobalRef(JNIEnv* env, jobject globalRef)
        u4   slot;                          /* slot in hashtable                  */
        java_handle_t              *o;
 
-       STATISTICS(jniinvokation());
+       TRACEJNICALLS(("jni_DeleteGlobalRef(env=%p, globalRef=%p)", env, globalRef));
 
        o = (java_handle_t *) globalRef;
 
@@ -3495,7 +3536,7 @@ void _Jv_JNI_DeleteGlobalRef(JNIEnv* env, jobject globalRef)
                                gc_reference_unregister(&(gre->o));
 #endif
 
-                               FREE(gre, hashtable_global_ref_entry);
+                               GCFREE(gre);
                        }
 
                        LLNI_CRITICAL_END;
@@ -3509,7 +3550,7 @@ void _Jv_JNI_DeleteGlobalRef(JNIEnv* env, jobject globalRef)
                gre     = gre->hashlink;            /* next element in external chain */
        }
 
-       log_println("JNI-DeleteGlobalRef: global reference not found");
+       log_println("jni_DeleteGlobalRef: Global reference not found.");
 
        LLNI_CRITICAL_END;
 
@@ -3546,10 +3587,10 @@ jboolean _Jv_JNI_ExceptionCheck(JNIEnv *env)
 
 *******************************************************************************/
 
-jobject _Jv_JNI_NewDirectByteBuffer(JNIEnv *env, void *address, jlong capacity)
+jobject jni_NewDirectByteBuffer(JNIEnv *env, void *address, jlong capacity)
 {
 #if defined(ENABLE_JAVASE)
-# if defined(WITH_CLASSPATH_GNU)
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
        java_handle_t           *nbuf;
 
 # if SIZEOF_VOID_P == 8
@@ -3558,7 +3599,7 @@ jobject _Jv_JNI_NewDirectByteBuffer(JNIEnv *env, void *address, jlong capacity)
        gnu_classpath_Pointer32 *paddress;
 # endif
 
-       TRACEJNICALLS(("_Jv_JNI_NewDirectByteBuffer(env=%p, address=%p, capacity=%ld", env, address, capacity));
+       TRACEJNICALLSENTER(("jni_NewDirectByteBuffer(env=%p, address=%p, capacity=%ld)", env, address, capacity));
 
        /* alocate a gnu.classpath.Pointer{32,64} object */
 
@@ -3583,15 +3624,17 @@ jobject _Jv_JNI_NewDirectByteBuffer(JNIEnv *env, void *address, jlong capacity)
 
        /* add local reference and return the value */
 
-       return _Jv_JNI_NewLocalRef(env, nbuf);
+       TRACEJNICALLSEXIT(("->%p", nbuf));
+
+       return jni_NewLocalRef(env, nbuf);
 
-# elif defined(WITH_CLASSPATH_SUN)
+# elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
 
        jobject o;
        int64_t addr;
        int32_t cap;
 
-       TRACEJNICALLS(("_Jv_JNI_NewDirectByteBuffer(env=%p, address=%p, capacity=%ld", env, address, capacity));
+       TRACEJNICALLSENTER(("jni_NewDirectByteBuffer(env=%p, address=%p, capacity=%ld)", env, address, capacity));
 
        /* Be paranoid about address sign-extension. */
 
@@ -3603,14 +3646,16 @@ jobject _Jv_JNI_NewDirectByteBuffer(JNIEnv *env, void *address, jlong capacity)
 
        /* Add local reference and return the value. */
 
-       return _Jv_JNI_NewLocalRef(env, o);
+       TRACEJNICALLSEXIT(("->%p", o));
+
+       return jni_NewLocalRef(env, o);
 
 # else
 #  error unknown classpath configuration
 # endif
 
 #else
-       vm_abort("_Jv_JNI_NewDirectByteBuffer: not implemented in this configuration");
+       vm_abort("jni_NewDirectByteBuffer: Not implemented in this configuration.");
 
        /* keep compiler happy */
 
@@ -3631,7 +3676,7 @@ void *_Jv_JNI_GetDirectBufferAddress(JNIEnv *env, jobject buf)
 #if defined(ENABLE_JAVASE)
        java_handle_t                 *h;
 
-# if defined(WITH_CLASSPATH_GNU)
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
 
        java_nio_DirectByteBufferImpl *nbuf;
        gnu_classpath_Pointer         *po;
@@ -3672,7 +3717,7 @@ void *_Jv_JNI_GetDirectBufferAddress(JNIEnv *env, jobject buf)
 
        return p;
 
-# elif defined(WITH_CLASSPATH_SUN)
+# elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
 
        java_nio_Buffer *o;
        int64_t          address;
@@ -3720,7 +3765,7 @@ void *_Jv_JNI_GetDirectBufferAddress(JNIEnv *env, jobject buf)
 
 jlong _Jv_JNI_GetDirectBufferCapacity(JNIEnv* env, jobject buf)
 {
-#if defined(ENABLE_JAVASE) && defined(WITH_CLASSPATH_GNU)
+#if defined(ENABLE_JAVASE) && defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
        java_handle_t   *o;
        java_nio_Buffer *nbuf;
        jlong            capacity;
@@ -3777,7 +3822,7 @@ jint _Jv_JNI_DestroyJavaVM(JavaVM *vm)
 
        TRACEJNICALLS(("_Jv_JNI_DestroyJavaVM(vm=%p)", vm));
 
-       if (vm_created == false)
+       if (VM_is_created() == false)
                return JNI_ERR;
 
     status = vm_destroy(vm);
@@ -3812,7 +3857,7 @@ static int jni_attach_current_thread(void **p_env, void *thr_args, bool isdaemon
        result = thread_current_is_attached();
 
        if (result == true) {
-               *p_env = _Jv_env;
+               *p_env = VM_get_jnienv();
 
                return JNI_OK;
        }
@@ -3825,26 +3870,26 @@ static int jni_attach_current_thread(void **p_env, void *thr_args, bool isdaemon
                        return JNI_EVERSION;
        }
 
-       if (!threads_attach_current_thread(vm_aargs, false))
+       if (!thread_attach_current_external_thread(vm_aargs, false))
                return JNI_ERR;
 
        if (!localref_table_init())
                return JNI_ERR;
 #endif
 
-       *p_env = _Jv_env;
+       *p_env = VM_get_jnienv();
 
        return JNI_OK;
 }
 
 
-jint _Jv_JNI_AttachCurrentThread(JavaVM *vm, void **p_env, void *thr_args)
+jint jni_AttachCurrentThread(JavaVM *vm, void **p_env, void *thr_args)
 {
        int result;
 
-       TRACEJNICALLS(("_Jv_JNI_AttachCurrentThread(vm=%p, p_env=%p, thr_args=%p)", vm, p_env, thr_args));
+       TRACEJNICALLS(("jni_AttachCurrentThread(vm=%p, p_env=%p, thr_args=%p)", vm, p_env, thr_args));
 
-       if (vm_created == false)
+       if (VM_is_created() == false)
                return JNI_ERR;
 
        result = jni_attach_current_thread(p_env, thr_args, false);
@@ -3870,24 +3915,17 @@ jint _Jv_JNI_AttachCurrentThread(JavaVM *vm, void **p_env, void *thr_args)
 
 *******************************************************************************/
 
-jint _Jv_JNI_DetachCurrentThread(JavaVM *vm)
+jint jni_DetachCurrentThread(JavaVM *vm)
 {
 #if defined(ENABLE_THREADS)
-       threadobject *t;
-       bool          result;
+       bool result;
 
-       TRACEJNICALLS(("_Jv_JNI_DetachCurrentThread(vm=%p)", vm));
+       TRACEJNICALLS(("jni_DetachCurrentThread(vm=%p)", vm));
 
-       t = thread_get_current();
-
-       /* Sanity check. */
-
-       assert(t != NULL);
-
-    /* If the given thread has already been detached, this operation
+    /* If the current thread has already been detached, this operation
           is a no-op. */
 
-       result = thread_is_attached(t);
+       result = thread_current_is_attached();
 
        if (result == false)
                return true;
@@ -3899,7 +3937,7 @@ jint _Jv_JNI_DetachCurrentThread(JavaVM *vm)
        if (!localref_table_destroy())
                return JNI_ERR;
 
-       if (!threads_detach_thread(t))
+       if (!thread_detach_current_external_thread())
                return JNI_ERR;
 #endif
 
@@ -3916,11 +3954,11 @@ jint _Jv_JNI_DetachCurrentThread(JavaVM *vm)
 
 *******************************************************************************/
 
-jint _Jv_JNI_GetEnv(JavaVM *vm, void **env, jint version)
+jint jni_GetEnv(JavaVM *vm, void **env, jint version)
 {
-       TRACEJNICALLS(("_Jv_JNI_GetEnv(vm=%p, env=%p, %d=version)", vm, env, version));
+       TRACEJNICALLS(("jni_GetEnv(vm=%p, env=%p, version=%d)", vm, env, version));
 
-       if (vm_created == false) {
+       if (VM_is_created() == false) {
                *env = NULL;
                return JNI_EDETACHED;
        }
@@ -3936,7 +3974,7 @@ jint _Jv_JNI_GetEnv(JavaVM *vm, void **env, jint version)
        /* Check the JNI version. */
 
        if (jni_version_check(version) == true) {
-               *env = _Jv_env;
+               *env = VM_get_jnienv();
                return JNI_OK;
        }
 
@@ -3970,13 +4008,13 @@ jint _Jv_JNI_GetEnv(JavaVM *vm, void **env, jint version)
 
 *******************************************************************************/
 
-jint _Jv_JNI_AttachCurrentThreadAsDaemon(JavaVM *vm, void **penv, void *args)
+jint jni_AttachCurrentThreadAsDaemon(JavaVM *vm, void **penv, void *args)
 {
        int result;
 
-       TRACEJNICALLS(("_Jv_JNI_AttachCurrentThreadAsDaemon(vm=%p, penv=%p, args=%p)", vm, penv, args));
+       TRACEJNICALLS(("jni_AttachCurrentThreadAsDaemon(vm=%p, penv=%p, args=%p)", vm, penv, args));
 
-       if (vm_created == false)
+       if (VM_is_created() == false)
                return JNI_ERR;
 
        result = jni_attach_current_thread(penv, args, true);
@@ -3993,10 +4031,10 @@ const struct JNIInvokeInterface_ _Jv_JNIInvokeInterface = {
        NULL,
 
        _Jv_JNI_DestroyJavaVM,
-       _Jv_JNI_AttachCurrentThread,
-       _Jv_JNI_DetachCurrentThread,
-       _Jv_JNI_GetEnv,
-       _Jv_JNI_AttachCurrentThreadAsDaemon
+       jni_AttachCurrentThread,
+       jni_DetachCurrentThread,
+       jni_GetEnv,
+       jni_AttachCurrentThreadAsDaemon
 };
 
 
@@ -4024,18 +4062,18 @@ struct JNINativeInterface_ _Jv_JNINativeInterface = {
        jni_ExceptionDescribe,
        jni_ExceptionClear,
        _Jv_JNI_FatalError,
-       _Jv_JNI_PushLocalFrame,
-       _Jv_JNI_PopLocalFrame,
+       jni_PushLocalFrame,
+       jni_PopLocalFrame,
 
-       _Jv_JNI_NewGlobalRef,
-       _Jv_JNI_DeleteGlobalRef,
-       _Jv_JNI_DeleteLocalRef,
+       jni_NewGlobalRef,
+       jni_DeleteGlobalRef,
+       jni_DeleteLocalRef,
        _Jv_JNI_IsSameObject,
-       _Jv_JNI_NewLocalRef,
-       _Jv_JNI_EnsureLocalCapacity,
+       jni_NewLocalRef,
+       jni_EnsureLocalCapacity,
 
        _Jv_JNI_AllocObject,
-       _Jv_JNI_NewObject,
+       jni_NewObject,
        _Jv_JNI_NewObjectV,
        _Jv_JNI_NewObjectA,
 
@@ -4254,8 +4292,8 @@ struct JNINativeInterface_ _Jv_JNINativeInterface = {
        _Jv_JNI_GetStringRegion,
        _Jv_JNI_GetStringUTFRegion,
 
-       _Jv_JNI_GetPrimitiveArrayCritical,
-       _Jv_JNI_ReleasePrimitiveArrayCritical,
+       jni_GetPrimitiveArrayCritical,
+       jni_ReleasePrimitiveArrayCritical,
 
        _Jv_JNI_GetStringCritical,
        _Jv_JNI_ReleaseStringCritical,
@@ -4267,7 +4305,7 @@ struct JNINativeInterface_ _Jv_JNINativeInterface = {
 
        /* New JNI 1.4 functions. */
 
-       _Jv_JNI_NewDirectByteBuffer,
+       jni_NewDirectByteBuffer,
        _Jv_JNI_GetDirectBufferAddress,
        _Jv_JNI_GetDirectBufferCapacity,
 
@@ -4331,7 +4369,7 @@ jint JNI_GetCreatedJavaVMs(JavaVM **vmBuf, jsize bufLen, jsize *nVMs)
 
        /* We currently only support 1 VM running. */
 
-       vmBuf[0] = (JavaVM *) _Jv_jvm;
+       vmBuf[0] = VM_get_javavm();
        *nVMs    = 1;
 
     return JNI_OK;
@@ -4351,7 +4389,7 @@ jint JNI_CreateJavaVM(JavaVM **p_vm, void **p_env, void *vm_args)
 
        /* actually create the JVM */
 
-       if (!vm_createjvm(p_vm, p_env, vm_args))
+       if (!VM_create(p_vm, p_env, vm_args))
                return JNI_ERR;
 
        return JNI_OK;