From: Stefan Ring Date: Sun, 23 Oct 2011 21:16:39 +0000 (+0200) Subject: * src/native/jni.cpp: [OPENJDK] Fix FindClass called from JNI_OnLoad. X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=cacao.git;a=commitdiff_plain;h=083e777c06a7c98e62fe3170125975b17459260a * src/native/jni.cpp: [OPENJDK] Fix FindClass called from JNI_OnLoad. Triggered by lwjgl. --- diff --git a/src/native/jni.cpp b/src/native/jni.cpp index 661780662..9a06ab245 100644 --- a/src/native/jni.cpp +++ b/src/native/jni.cpp @@ -881,8 +881,31 @@ jclass jni_FindClass(JNIEnv *env, const char *name) if (cc == NULL) c = load_class_from_sysloader(u); - else - c = load_class_from_classloader(u, cc->classloader); + else { + classloader_t *cl = cc->classloader; +#if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK) + /* See jni_FindClass in Hotspot's src/share/vm/prims/jni.cpp */ + if (!cl && cc->name == utf_java_lang_ClassLoader_NativeLibrary) + { + methodinfo *m = class_resolveclassmethod( + cc, + utf_new_char("getFromClass"), + utf_new_char("()Ljava/lang/Class;"), + NULL, + true); + + java_handle_t *h; + if (m) + h = vm_call_method(m, NULL); + + if (m && exceptions_get_exception() == NULL) + cl = ((classinfo *) LLNI_UNWRAP(h))->classloader; + else + return NULL; + } +#endif + c = load_class_from_classloader(u, cl); + } if (c == NULL) { resolve_handle_pending_exception(true); diff --git a/src/vm/utf8.c b/src/vm/utf8.c index 7afcb2ce1..fe2099d02 100644 --- a/src/vm/utf8.c +++ b/src/vm/utf8.c @@ -61,6 +61,7 @@ utf *utf_java_lang_Object; utf *utf_java_lang_Class; utf *utf_java_lang_ClassLoader; +utf *utf_java_lang_ClassLoader_NativeLibrary; utf *utf_java_lang_Cloneable; utf *utf_java_lang_SecurityManager; utf *utf_java_lang_String; @@ -263,6 +264,9 @@ void utf8_init(void) utf_java_lang_String = utf_new_char("java/lang/String"); utf_java_lang_ThreadGroup = utf_new_char("java/lang/ThreadGroup"); + utf_java_lang_ClassLoader_NativeLibrary = + utf_new_char("java/lang/ClassLoader$NativeLibrary"); + utf_java_lang_ref_SoftReference = utf_new_char("java/lang/ref/SoftReference"); diff --git a/src/vm/utf8.h b/src/vm/utf8.h index b60111dc4..761d65d3b 100644 --- a/src/vm/utf8.h +++ b/src/vm/utf8.h @@ -58,6 +58,7 @@ extern utf *utf_java_lang_Object; extern utf *utf_java_lang_Class; extern utf *utf_java_lang_ClassLoader; +extern utf *utf_java_lang_ClassLoader_NativeLibrary; extern utf *utf_java_lang_Cloneable; extern utf *utf_java_lang_SecurityManager; extern utf *utf_java_lang_String;