* src/native/jni.cpp: [OPENJDK] Fix FindClass called from JNI_OnLoad.
authorStefan Ring <stefan@complang.tuwien.ac.at>
Sun, 23 Oct 2011 21:16:39 +0000 (23:16 +0200)
committerStefan Ring <stefan@complang.tuwien.ac.at>
Sun, 23 Oct 2011 21:16:39 +0000 (23:16 +0200)
Triggered by lwjgl.

src/native/jni.cpp
src/vm/utf8.c
src/vm/utf8.h

index 661780662a239c07a46fd157f4ccce0377900621..9a06ab245edff229ea2488bc75953414b521401d 100644 (file)
@@ -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);
index 7afcb2ce14d540538f992ffd5cea05ba62934c18..fe2099d0298474e6e595b6fef67a2c0e840e82ca 100644 (file)
@@ -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");
 
index b60111dc4ed9885b1bb27f4e080d006bd30f0e68..761d65d3bdc0366edff4fac3ea03a575e29396e8 100644 (file)
@@ -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;