jclass FindBootStrapClass(JNIEnv *env, const char* classname) { if (findBootClass == NULL) { findBootClass = (FindClassFromBootLoader_t *)dlsym(RTLD_DEFAULT, "JVM_FindClassFromBootLoader"); if (findBootClass == NULL) { JLI_ReportErrorMessage(DLL_ERROR4, "JVM_FindClassFromBootLoader"); return NULL; } } return findBootClass(env, classname); }
Class* rvmFindClassInClasspathForLoader(Env* env, const char* className, ClassLoader* classLoader) { if (!classLoader || classLoader->parent == NULL) { // This is the bootstrap classloader return findBootClass(env, className); } if (classLoader->parent->parent == NULL && classLoader->object.clazz->classLoader == NULL) { // This is the system classloader Class* clazz = findClass(env, className, classLoader, env->vm->options->loadUserClass); if (rvmExceptionOccurred(env)) return NULL; return clazz; } rvmThrowClassNotFoundException(env, className); return NULL; }
jclass FindBootStrapClass(JNIEnv *env, const char* classname) { if (findBootClass == NULL) { printf("%s[%d] [tid: %lu]: 试图获取函数[JVM_FindClassFromBootLoader]的指针(地址)...\n", __FILE__, __LINE__, pthread_self()); findBootClass = (FindClassFromBootLoader_t *)dlsym(RTLD_DEFAULT, "JVM_FindClassFromBootLoader"); if (findBootClass == NULL) { JLI_ReportErrorMessage(DLL_ERROR4, "JVM_FindClassFromBootLoader"); return NULL; } } return findBootClass(env, classname); }
Class* rvmFindClassUsingLoader(Env* env, const char* className, ClassLoader* classLoader) { if (!classLoader || classLoader->parent == NULL) { // This is the bootstrap classloader. No need to call ClassLoader.loadClass() return findBootClass(env, className); } char* binaryClassName = rvmToBinaryClassName(env, className); if (!binaryClassName) return NULL; Object* binaryClassNameString = rvmNewInternedStringUTF(env, binaryClassName, -1); if (!binaryClassNameString) return NULL; Method* loadClassMethod = rvmGetInstanceMethod(env, java_lang_ClassLoader, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;"); if (!loadClassMethod) return NULL; Object* clazz = rvmCallObjectInstanceMethod(env, (Object*) classLoader, loadClassMethod, binaryClassNameString); if (rvmExceptionOccurred(env)) return NULL; return (Class*) clazz; }
jclass FindBootStrapClass(JNIEnv *env, const char *classname) { HMODULE hJvm; if (findBootClass == NULL) { hJvm = GetModuleHandle(JVM_DLL); if (hJvm == NULL) return NULL; /* need to use the demangled entry point */ findBootClass = (FindClassFromBootLoader_t *)GetProcAddress(hJvm, "JVM_FindClassFromBootLoader"); if (findBootClass == NULL) { JLI_ReportErrorMessage(DLL_ERROR4, "JVM_FindClassFromBootLoader"); return NULL; } } return findBootClass(env, classname); }
jboolean rvmInitClasses(Env* env) { if (rvmInitMutex(&classLock) != 0) { return FALSE; } // Cache important classes in java.lang. java_lang_Object = findBootClass(env, "java/lang/Object"); if (!java_lang_Object) return FALSE; java_lang_Class = findBootClass(env, "java/lang/Class"); if (!java_lang_Class) return FALSE; // Fix object.clazz pointers for the classes loaded so far rvmIterateLoadedClasses(env, fixClassPointer, NULL); java_lang_ClassLoader = findBootClass(env, "java/lang/ClassLoader"); if (!java_lang_ClassLoader) return FALSE; java_lang_String = findBootClass(env, "java/lang/String"); if (!java_lang_String) return FALSE; java_lang_Boolean = findBootClass(env, "java/lang/Boolean"); if (!java_lang_Boolean) return FALSE; java_lang_Byte = findBootClass(env, "java/lang/Byte"); if (!java_lang_Byte) return FALSE; java_lang_Character = findBootClass(env, "java/lang/Character"); if (!java_lang_Character) return FALSE; java_lang_Short = findBootClass(env, "java/lang/Short"); if (!java_lang_Short) return FALSE; java_lang_Integer = findBootClass(env, "java/lang/Integer"); if (!java_lang_Integer) return FALSE; java_lang_Long = findBootClass(env, "java/lang/Long"); if (!java_lang_Long) return FALSE; java_lang_Float = findBootClass(env, "java/lang/Float"); if (!java_lang_Float) return FALSE; java_lang_Double = findBootClass(env, "java/lang/Double"); if (!java_lang_Double) return FALSE; java_lang_Enum = findBootClass(env, "java/lang/Enum"); if (!java_lang_Enum) return FALSE; java_lang_Cloneable = findBootClass(env, "java/lang/Cloneable"); if (!java_lang_Cloneable) return FALSE; java_lang_Thread = findBootClass(env, "java/lang/Thread"); if (!java_lang_Thread) return FALSE; java_lang_ThreadGroup = findBootClass(env, "java/lang/ThreadGroup"); if (!java_lang_ThreadGroup) return FALSE; java_io_Serializable = findBootClass(env, "java/io/Serializable"); if (!java_io_Serializable) return FALSE; java_lang_Runtime = findBootClass(env, "java/lang/Runtime"); if (!java_lang_Runtime) return FALSE; java_lang_ClassNotFoundException = findBootClass(env, "java/lang/ClassNotFoundException"); if (!java_lang_ClassNotFoundException) return FALSE; java_lang_NoClassDefFoundError = findBootClass(env, "java/lang/NoClassDefFoundError"); if (!java_lang_NoClassDefFoundError) return FALSE; java_lang_Error = findBootClass(env, "java/lang/Error"); if (!java_lang_Error) return FALSE; java_lang_OutOfMemoryError = findBootClass(env, "java/lang/OutOfMemoryError"); if (!java_lang_OutOfMemoryError) return FALSE; java_lang_IllegalAccessError = findBootClass(env, "java/lang/IllegalAccessError"); if (!java_lang_IllegalAccessError) return FALSE; java_lang_NoSuchFieldError = findBootClass(env, "java/lang/NoSuchFieldError"); if (!java_lang_NoSuchFieldError) return FALSE; java_lang_NoSuchMethodError = findBootClass(env, "java/lang/NoSuchMethodError"); if (!java_lang_NoSuchMethodError) return FALSE; java_lang_IncompatibleClassChangeError = findBootClass(env, "java/lang/IncompatibleClassChangeError"); if (!java_lang_IncompatibleClassChangeError) return FALSE; java_lang_AbstractMethodError = findBootClass(env, "java/lang/AbstractMethodError"); if (!java_lang_AbstractMethodError) return FALSE; java_lang_UnsatisfiedLinkError = findBootClass(env, "java/lang/UnsatisfiedLinkError"); if (!java_lang_UnsatisfiedLinkError) return FALSE; java_lang_ExceptionInInitializerError = findBootClass(env, "java/lang/ExceptionInInitializerError"); if (!java_lang_ExceptionInInitializerError) return FALSE; java_lang_VerifyError = findBootClass(env, "java/lang/VerifyError"); if (!java_lang_VerifyError) return FALSE; java_lang_LinkageError = findBootClass(env, "java/lang/LinkageError"); if (!java_lang_LinkageError) return FALSE; java_lang_InstantiationError = findBootClass(env, "java/lang/InstantiationError"); if (!java_lang_InstantiationError) return FALSE; java_lang_StackOverflowError = findBootClass(env, "java/lang/StackOverflowError"); if (!java_lang_StackOverflowError) return FALSE; java_lang_InternalError = findBootClass(env, "java/lang/InternalError"); if (!java_lang_InternalError) return FALSE; java_lang_Throwable = findBootClass(env, "java/lang/Throwable"); if (!java_lang_Throwable) return FALSE; java_lang_RuntimeException = findBootClass(env, "java/lang/RuntimeException"); if (!java_lang_RuntimeException) return FALSE; java_lang_ClassCastException = findBootClass(env, "java/lang/ClassCastException"); if (!java_lang_ClassCastException) return FALSE; java_lang_NullPointerException = findBootClass(env, "java/lang/NullPointerException"); if (!java_lang_NullPointerException) return FALSE; java_lang_ArrayIndexOutOfBoundsException = findBootClass(env, "java/lang/ArrayIndexOutOfBoundsException"); if (!java_lang_ArrayIndexOutOfBoundsException) return FALSE; java_lang_ArrayStoreException = findBootClass(env, "java/lang/ArrayStoreException"); if (!java_lang_ArrayStoreException) return FALSE; java_lang_NegativeArraySizeException = findBootClass(env, "java/lang/NegativeArraySizeException"); if (!java_lang_NegativeArraySizeException) return FALSE; java_lang_IllegalArgumentException = findBootClass(env, "java/lang/IllegalArgumentException"); if (!java_lang_IllegalArgumentException) return FALSE; java_lang_ArithmeticException = findBootClass(env, "java/lang/ArithmeticException"); if (!java_lang_ArithmeticException) return FALSE; java_lang_UnsupportedOperationException = findBootClass(env, "java/lang/UnsupportedOperationException"); if (!java_lang_UnsupportedOperationException) return FALSE; java_lang_IllegalMonitorStateException = findBootClass(env, "java/lang/IllegalMonitorStateException"); if (!java_lang_IllegalMonitorStateException) return FALSE; java_lang_InstantiationException = findBootClass(env, "java/lang/InstantiationException"); if (!java_lang_InstantiationException) return FALSE; java_lang_InterruptedException = findBootClass(env, "java/lang/InterruptedException"); if (!java_lang_InterruptedException) return FALSE; java_lang_IllegalStateException = findBootClass(env, "java/lang/IllegalStateException"); if (!java_lang_IllegalStateException) return FALSE; prim_Z = createPrimitiveClass(env, "Z"); if (!prim_Z) return FALSE; prim_B = createPrimitiveClass(env, "B"); if (!prim_B) return FALSE; prim_C = createPrimitiveClass(env, "C"); if (!prim_C) return FALSE; prim_S = createPrimitiveClass(env, "S"); if (!prim_S) return FALSE; prim_I = createPrimitiveClass(env, "I"); if (!prim_I) return FALSE; prim_J = createPrimitiveClass(env, "J"); if (!prim_J) return FALSE; prim_F = createPrimitiveClass(env, "F"); if (!prim_F) return FALSE; prim_D = createPrimitiveClass(env, "D"); if (!prim_D) return FALSE; prim_V = createPrimitiveClass(env, "V"); if (!prim_V) return FALSE; array_Z = findBootClass(env, "[Z"); if (!array_Z) return FALSE; array_B = findBootClass(env, "[B"); if (!array_B) return FALSE; array_C = findBootClass(env, "[C"); if (!array_C) return FALSE; array_S = findBootClass(env, "[S"); if (!array_S) return FALSE; array_I = findBootClass(env, "[I"); if (!array_I) return FALSE; array_J = findBootClass(env, "[J"); if (!array_J) return FALSE; array_F = findBootClass(env, "[F"); if (!array_F) return FALSE; array_D = findBootClass(env, "[D"); if (!array_D) return FALSE; return TRUE; }