// jni.cc - JNI implementation, including the jump table.
-/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation
This file is part of libgcj.
#include <java/nio/DirectByteBufferImpl$ReadWrite.h>
#include <java/util/IdentityHashMap.h>
#include <gnu/gcj/RawData.h>
+#include <java/lang/ClassNotFoundException.h>
#include <gcj/method.h>
#include <gcj/field.h>
return reinterpret_cast<T *> (wr->get ());
}
+jobject
+_Jv_UnwrapJNIweakReference (jobject obj)
+{
+ return unwrap (obj);
+}
+
\f
static jobject JNICALL
static jboolean JNICALL
_Jv_JNI_IsAssignableFrom (JNIEnv *, jclass clazz1, jclass clazz2)
{
- return unwrap (clazz1)->isAssignableFrom (unwrap (clazz2));
+ return unwrap (clazz2)->isAssignableFrom (unwrap (clazz1));
}
static jint JNICALL
jmethodID id, va_list args)
{
JvAssert (klass && ! klass->isArray ());
- JvAssert (! strcmp (id->name->data, "<init>")
- && id->signature->length > 2
- && id->signature->data[0] == '('
- && ! strcmp (&id->signature->data[id->signature->length - 2],
+ JvAssert (! strcmp (id->name->chars(), "<init>")
+ && id->signature->len() > 2
+ && id->signature->chars()[0] == '('
+ && ! strcmp (&id->signature->chars()[id->signature->len() - 2],
")V"));
return _Jv_JNI_CallAnyMethodV<jobject, constructor> (env, NULL, klass,
_Jv_JNI_NewObject (JNIEnv *env, jclass klass, jmethodID id, ...)
{
JvAssert (klass && ! klass->isArray ());
- JvAssert (! strcmp (id->name->data, "<init>")
- && id->signature->length > 2
- && id->signature->data[0] == '('
- && ! strcmp (&id->signature->data[id->signature->length - 2],
+ JvAssert (! strcmp (id->name->chars(), "<init>")
+ && id->signature->len() > 2
+ && id->signature->chars()[0] == '('
+ && ! strcmp (&id->signature->chars()[id->signature->len() - 2],
")V"));
va_list args;
jvalue *args)
{
JvAssert (klass && ! klass->isArray ());
- JvAssert (! strcmp (id->name->data, "<init>")
- && id->signature->length > 2
- && id->signature->data[0] == '('
- && ! strcmp (&id->signature->data[id->signature->length - 2],
+ JvAssert (! strcmp (id->name->chars(), "<init>")
+ && id->signature->len() > 2
+ && id->signature->chars()[0] == '('
+ && ! strcmp (&id->signature->chars()[id->signature->len() - 2],
")V"));
return _Jv_JNI_CallAnyMethodA<jobject, constructor> (env, NULL, klass,
char s[len + 1];
for (int i = 0; i <= len; ++i)
s[i] = (sig[i] == '/') ? '.' : sig[i];
- jclass field_class = _Jv_FindClassFromSignature ((char *) s, NULL);
-
- // FIXME: what if field_class == NULL?
-
java::lang::ClassLoader *loader = clazz->getClassLoaderInternal ();
+ jclass field_class = _Jv_FindClassFromSignature ((char *) s, loader);
+ if (! field_class)
+ throw new java::lang::ClassNotFoundException(JvNewStringUTF(s));
+
while (clazz != NULL)
{
// We acquire the class lock so that fields aren't resolved
nathash =
(JNINativeMethod *) _Jv_AllocBytes (nathash_size
* sizeof (JNINativeMethod));
- memset (nathash, 0, nathash_size * sizeof (JNINativeMethod));
}
else
{
nathash =
(JNINativeMethod *) _Jv_AllocBytes (nathash_size
* sizeof (JNINativeMethod));
- memset (nathash, 0, nathash_size * sizeof (JNINativeMethod));
for (int i = 0; i < savesize; ++i)
{
ret, real_args);
#endif
+ // We might need to unwrap a JNI weak reference here.
+ if (_this->jni_cif.rtype == &ffi_type_pointer)
+ {
+ _Jv_value *val = (_Jv_value *) ret;
+ val->object_value = unwrap (val->object_value);
+ }
+
if (sync != NULL)
_Jv_MonitorExit (sync);
}
// Attaching an already-attached thread is a no-op.
- if (_Jv_GetCurrentJNIEnv () != NULL)
- return 0;
+ JNIEnv *env = _Jv_GetCurrentJNIEnv ();
+ if (env != NULL)
+ {
+ *penv = reinterpret_cast<void *> (env);
+ return 0;
+ }
- JNIEnv *env = (JNIEnv *) _Jv_MallocUnchecked (sizeof (JNIEnv));
+ env = (JNIEnv *) _Jv_MallocUnchecked (sizeof (JNIEnv));
if (env == NULL)
return JNI_ERR;
env->p = &_Jv_JNIFunctions;
{
JvAssert (the_vm && vm == the_vm);
- JNIEnv *env;
+ union
+ {
+ JNIEnv *env;
+ void *env_p;
+ };
+
if (_Jv_ThreadCurrent () != NULL)
{
jstring main_name;
return JNI_ERR;
}
- jint r = _Jv_JNI_AttachCurrentThread (vm, main_name,
- reinterpret_cast<void **> (&env),
+ jint r = _Jv_JNI_AttachCurrentThread (vm, main_name, &env_p,
NULL, false);
if (r < 0)
return r;