jdk/src/share/classes/java/lang/ClassLoader.java
// Invoked in the java.lang.Runtime class to implement load and loadLibrary.
static void loadLibrary(Class fromClass, String name,
boolean isAbsolute) {
{- -------------------------------------------
(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.