Top


定義場所(file name)

jdk/src/share/classes/java/lang/ClassLoader.java

説明(description)

    // Invoked in the java.lang.Runtime class to implement load and loadLibrary.

名前(function name)

    static void loadLibrary(Class fromClass, String name,
                            boolean isAbsolute) {

本体部(body)

  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}

            ClassLoader loader =
                (fromClass == null) ? null : fromClass.getClassLoader();

  {- -------------------------------------------
  (1) (static フィールドの初期化処理)
      ---------------------------------------- -}

            if (sys_paths == null) {
                usr_paths = initializePath("java.library.path");
                sys_paths = initializePath("sun.boot.library.path");
            }

  {- -------------------------------------------
  (1) (以下, ライブラリ名やクラスローダの条件に応じて, 処理パスが以下の4つに分岐.
       * ライブラリ名が絶対パスの場合: 
       * ライブラリ名が相対パスで, システムクラスでの場合: 
       * ライブラリ名が相対パスで, システムクラスではなく, クラスローダー独自のネイティブライブラリ探索パスがある場合: 
       * ライブラリ名が相対パスで, システムクラスではなく, クラスローダー独自のネイティブライブラリ探索パスがない場合:)
      ---------------------------------------- -}

  {- -------------------------------------------
  (1) もしライブラリ名が絶対パスで指定されていれば, このまま ClassLoader.loadLibrary0() でロード処理を行い, リターンする.
      (もし見つからなければ UnsatisfiedLinkError)
      ---------------------------------------- -}

            if (isAbsolute) {
                if (loadLibrary0(fromClass, new File(name))) {
                    return;
                }
                throw new UnsatisfiedLinkError("Can't load library: " + name);
            }

  {- -------------------------------------------
  (1) ライブラリ名が相対パスで, かつクラスローダーがある場合(システムクラスではない場合)には, 
      ClassLoader.findLibrary() でそのクラスローダー独自のネイティブライブラリの探索パスがあるかどうかを調べる.

      もしあれば(= 返値が null でなければ), ClassLoader.loadLibrary0() でロード処理を行い, リターンする.
      (このロード処理の途中でエラーが起こったら UnsatisfiedLinkError)
      ---------------------------------------- -}

            if (loader != null) {
                String libfilename = loader.findLibrary(name);
                if (libfilename != null) {
                    File libfile = new File(libfilename);
                    if (!libfile.isAbsolute()) {
                        throw new UnsatisfiedLinkError(
        "ClassLoader.findLibrary failed to return an absolute path: " + libfilename);
                    }
                    if (loadLibrary0(fromClass, libfile)) {
                        return;
                    }
                    throw new UnsatisfiedLinkError("Can't load " + libfilename);
                }
            }

  {- -------------------------------------------
  (1) ライブラリ名が相対パスで, かつシステムクラスの場合には, 
      "sun.boot.library.path" property で指定されたパスからライブラリを探す.
      ClassLoader.loadLibrary0() が成功すればここでリターンする.
      ---------------------------------------- -}

            for (int i = 0 ; i < sys_paths.length ; i++) {
                File libfile = new File(sys_paths[i], System.mapLibraryName(name));
                if (loadLibrary0(fromClass, libfile)) {
                    return;
                }
            }

  {- -------------------------------------------
  (1) ライブラリ名が相対パスで, かつクラスローダーがあり(システムクラスではない場合), 
      かつそのクラスローダー独自のネイティブライブラリ探索パスがない (ClassLoader.findLibrary() が null) の場合, 
      "java.library.path" property で指定されたパスからライブラリを探す.
      ClassLoader.loadLibrary0() が成功すればここでリターンする.
      ---------------------------------------- -}

            if (loader != null) {
                for (int i = 0 ; i < usr_paths.length ; i++) {
                    File libfile = new File(usr_paths[i],
                                            System.mapLibraryName(name));
                    if (loadLibrary0(fromClass, libfile)) {
                        return;
                    }
                }
            }

  {- -------------------------------------------
  (1) 最後まで見つからなければ UnsatisfiedLinkError
      ---------------------------------------- -}

            // Oops, it failed
            throw new UnsatisfiedLinkError("no " + name + " in java.library.path");
        }

This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.