< prev index next >

src/java.base/share/native/libjava/ClassLoader.c

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2020, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Oracle designates this

@@ -30,11 +30,10 @@
 #include "jni_util.h"
 #include "jlong.h"
 #include "jvm.h"
 #include "check_classname.h"
 #include "java_lang_ClassLoader.h"
-#include "java_lang_ClassLoader_NativeLibrary.h"
 #include <string.h>
 
 static JNINativeMethod methods[] = {
     {"retrieveDirectives",  "()Ljava/lang/AssertionStatusDirectives;", (void *)&JVM_AssertionStatusDirectives}
 };

@@ -252,268 +251,5 @@
         return 0;
     } else {
         return JVM_FindLoadedClass(env, loader, name);
     }
 }
-
-static jfieldID handleID;
-static jfieldID jniVersionID;
-static void *procHandle;
-
-static jboolean initIDs(JNIEnv *env)
-{
-    if (handleID == 0) {
-        jclass this =
-            (*env)->FindClass(env, "java/lang/ClassLoader$NativeLibrary");
-        if (this == 0)
-            return JNI_FALSE;
-        handleID = (*env)->GetFieldID(env, this, "handle", "J");
-        if (handleID == 0)
-            return JNI_FALSE;
-        jniVersionID = (*env)->GetFieldID(env, this, "jniVersion", "I");
-        if (jniVersionID == 0)
-            return JNI_FALSE;
-        procHandle = getProcessHandle();
-    }
-    return JNI_TRUE;
-}
-
-typedef jint (JNICALL *JNI_OnLoad_t)(JavaVM *, void *);
-typedef void (JNICALL *JNI_OnUnload_t)(JavaVM *, void *);
-
-/*
- * Support for finding JNI_On(Un)Load_<lib_name> if it exists.
- * If cname == NULL then just find normal JNI_On(Un)Load entry point
- */
-static void *findJniFunction(JNIEnv *env, void *handle,
-                                    const char *cname, jboolean isLoad) {
-    const char *onLoadSymbols[] = JNI_ONLOAD_SYMBOLS;
-    const char *onUnloadSymbols[] = JNI_ONUNLOAD_SYMBOLS;
-    const char **syms;
-    int symsLen;
-    void *entryName = NULL;
-    char *jniFunctionName;
-    int i;
-    size_t len;
-
-    // Check for JNI_On(Un)Load<_libname> function
-    if (isLoad) {
-        syms = onLoadSymbols;
-        symsLen = sizeof(onLoadSymbols) / sizeof(char *);
-    } else {
-        syms = onUnloadSymbols;
-        symsLen = sizeof(onUnloadSymbols) / sizeof(char *);
-    }
-    for (i = 0; i < symsLen; i++) {
-        // cname + sym + '_' + '\0'
-        if ((len = (cname != NULL ? strlen(cname) : 0) + strlen(syms[i]) + 2) >
-            FILENAME_MAX) {
-            goto done;
-        }
-        jniFunctionName = malloc(len);
-        if (jniFunctionName == NULL) {
-            JNU_ThrowOutOfMemoryError(env, NULL);
-            goto done;
-        }
-        buildJniFunctionName(syms[i], cname, jniFunctionName);
-        entryName = JVM_FindLibraryEntry(handle, jniFunctionName);
-        free(jniFunctionName);
-        if(entryName) {
-            break;
-        }
-    }
-
- done:
-    return entryName;
-}
-
-/*
- * Class:     java_lang_ClassLoader_NativeLibrary
- * Method:    load0
- * Signature: (Ljava/lang/String;Z)Z
- */
-JNIEXPORT jboolean JNICALL
-Java_java_lang_ClassLoader_00024NativeLibrary_load0
-  (JNIEnv *env, jobject this, jstring name, jboolean isBuiltin)
-{
-    const char *cname;
-    jint jniVersion;
-    jthrowable cause;
-    void * handle;
-    jboolean loaded = JNI_FALSE;
-
-    if (!initIDs(env))
-        return JNI_FALSE;
-
-    cname = JNU_GetStringPlatformChars(env, name, 0);
-    if (cname == 0)
-        return JNI_FALSE;
-    handle = isBuiltin ? procHandle : JVM_LoadLibrary(cname);
-    if (handle) {
-        JNI_OnLoad_t JNI_OnLoad;
-        JNI_OnLoad = (JNI_OnLoad_t)findJniFunction(env, handle,
-                                                   isBuiltin ? cname : NULL,
-                                                   JNI_TRUE);
-        if (JNI_OnLoad) {
-            JavaVM *jvm;
-            (*env)->GetJavaVM(env, &jvm);
-            jniVersion = (*JNI_OnLoad)(jvm, NULL);
-        } else {
-            jniVersion = 0x00010001;
-        }
-
-        cause = (*env)->ExceptionOccurred(env);
-        if (cause) {
-            (*env)->ExceptionClear(env);
-            (*env)->Throw(env, cause);
-            if (!isBuiltin) {
-                JVM_UnloadLibrary(handle);
-            }
-            goto done;
-        }
-
-        if (!JVM_IsSupportedJNIVersion(jniVersion) ||
-            (isBuiltin && jniVersion < JNI_VERSION_1_8)) {
-            char msg[256];
-            jio_snprintf(msg, sizeof(msg),
-                         "unsupported JNI version 0x%08X required by %s",
-                         jniVersion, cname);
-            JNU_ThrowByName(env, "java/lang/UnsatisfiedLinkError", msg);
-            if (!isBuiltin) {
-                JVM_UnloadLibrary(handle);
-            }
-            goto done;
-        }
-        (*env)->SetIntField(env, this, jniVersionID, jniVersion);
-    } else {
-        cause = (*env)->ExceptionOccurred(env);
-        if (cause) {
-            (*env)->ExceptionClear(env);
-            (*env)->SetLongField(env, this, handleID, (jlong)0);
-            (*env)->Throw(env, cause);
-        }
-        goto done;
-    }
-    (*env)->SetLongField(env, this, handleID, ptr_to_jlong(handle));
-    loaded = JNI_TRUE;
-
- done:
-    JNU_ReleaseStringPlatformChars(env, name, cname);
-    return loaded;
-}
-
-/*
- * Class:     java_lang_ClassLoader_NativeLibrary
- * Method:    unload
- * Signature: (Ljava/lang/String;ZJ)V
- */
-JNIEXPORT void JNICALL
-Java_java_lang_ClassLoader_00024NativeLibrary_unload
-(JNIEnv *env, jclass cls, jstring name, jboolean isBuiltin, jlong address)
-{
-    const char *onUnloadSymbols[] = JNI_ONUNLOAD_SYMBOLS;
-    void *handle;
-    JNI_OnUnload_t JNI_OnUnload;
-     const char *cname;
-
-    if (!initIDs(env))
-        return;
-    cname = JNU_GetStringPlatformChars(env, name, 0);
-    if (cname == NULL) {
-        return;
-    }
-    handle = jlong_to_ptr(address);
-    JNI_OnUnload = (JNI_OnUnload_t )findJniFunction(env, handle,
-                                                    isBuiltin ? cname : NULL,
-                                                    JNI_FALSE);
-    if (JNI_OnUnload) {
-        JavaVM *jvm;
-        (*env)->GetJavaVM(env, &jvm);
-        (*JNI_OnUnload)(jvm, NULL);
-    }
-    if (!isBuiltin) {
-        JVM_UnloadLibrary(handle);
-    }
-    JNU_ReleaseStringPlatformChars(env, name, cname);
-}
-
-/*
- * Class:     java_lang_ClassLoader_NativeLibrary
- * Method:    findEntry
- * Signature: (Ljava/lang/String;)J
- */
-JNIEXPORT jlong JNICALL
-Java_java_lang_ClassLoader_00024NativeLibrary_findEntry
-  (JNIEnv *env, jobject this, jstring name)
-{
-    jlong handle;
-    const char *cname;
-    jlong res;
-
-    if (!initIDs(env))
-        return jlong_zero;
-
-    handle = (*env)->GetLongField(env, this, handleID);
-    cname = (*env)->GetStringUTFChars(env, name, 0);
-    if (cname == 0)
-        return jlong_zero;
-    res = ptr_to_jlong(JVM_FindLibraryEntry(jlong_to_ptr(handle), cname));
-    (*env)->ReleaseStringUTFChars(env, name, cname);
-    return res;
-}
-/*
- * Class:     java_lang_ClassLoader
- * Method:    findBuiltinLib
- * Signature: (Ljava/lang/String;)Ljava/lang/String;
- */
-JNIEXPORT jstring JNICALL
-Java_java_lang_ClassLoader_findBuiltinLib
-  (JNIEnv *env, jclass cls, jstring name)
-{
-    const char *cname;
-    char *libName;
-    size_t prefixLen = strlen(JNI_LIB_PREFIX);
-    size_t suffixLen = strlen(JNI_LIB_SUFFIX);
-    size_t len;
-    jstring lib;
-    void *ret;
-    const char *onLoadSymbols[] = JNI_ONLOAD_SYMBOLS;
-
-    if (name == NULL) {
-        JNU_ThrowInternalError(env, "NULL filename for native library");
-        return NULL;
-    }
-    procHandle = getProcessHandle();
-    cname = JNU_GetStringPlatformChars(env, name, 0);
-    if (cname == NULL) {
-        return NULL;
-    }
-    // Copy name Skipping PREFIX
-    len = strlen(cname);
-    if (len <= (prefixLen+suffixLen)) {
-        JNU_ReleaseStringPlatformChars(env, name, cname);
-        return NULL;
-    }
-    libName = malloc(len + 1); //+1 for null if prefix+suffix == 0
-    if (libName == NULL) {
-        JNU_ReleaseStringPlatformChars(env, name, cname);
-        JNU_ThrowOutOfMemoryError(env, NULL);
-        return NULL;
-    }
-    if (len > prefixLen) {
-        strcpy(libName, cname+prefixLen);
-    }
-    JNU_ReleaseStringPlatformChars(env, name, cname);
-
-    // Strip SUFFIX
-    libName[strlen(libName)-suffixLen] = '\0';
-
-    // Check for JNI_OnLoad_libname function
-    ret = findJniFunction(env, procHandle, libName, JNI_TRUE);
-    if (ret != NULL) {
-        lib = JNU_NewStringPlatform(env, libName);
-        free(libName);
-        return lib;
-    }
-    free(libName);
-    return NULL;
-}
< prev index next >