Up Top

JNI の処理 : native method の処理 : native method の dynamic loading 処理(java.lang.System.loadLibrary() の処理) (JNI_OnLoad() の呼び出し処理も含む)


概要(Summary)

基本的には, 各 OS が提供しているダイナミックロード用のシステムコールを呼び出すだけ.

なお, JNI_OnLoad() シンボルが含まれている場合には, それを呼び出す処理も行われる.

備考(Notes)

JNI_OnLoad のシンボル名は, プラットフォームによっては (より具体的に言うと Windows の場合には) 複数の候補が存在することがある.

    ((cite: hotspot/src/os/windows/vm/jvm_windows.h))
    #define JNI_ONLOAD_SYMBOLS      {"_JNI_OnLoad@8", "JNI_OnLoad"}

処理の流れ (概要)(Execution Flows : Summary)

java.lang.System.loadLibrary()
-> java.lang.Runtime.loadLibrary0()
   -> java.lang.ClassLoader.loadLibrary()
      -> java.lang.ClassLoader.findLibrary()    (<= 必要に応じて呼び出される)
      -> java.lang.ClassLoader.loadLibrary0()
         -> java.lang.ClassLoader$NativeLibrary.load()
            -> Java_java_lang_ClassLoader_00024NativeLibrary_load()
               -> (1) ライブラリをロードする.
                      -> JVM_LoadLibrary()
                         -> os::dll_load()
                            * Linux の場合
                              -> dlopen()
                            * Solaris の場合
                              -> dlopen()
                            * Windows の場合
                              -> LoadLibrary()
                  (1) もし JNI_OnLoad シンボルが含まれていればそれを呼び出す.
                      -> JVM_FindLibraryEntry()
                         -> os::dll_lookup()
                            * Linux の場合
                              -> dlsym()
                            * Solaris の場合
                              -> dlsym()
                            * Windows の場合
                              -> GetProcAddress()
                  (1) ロードしたライブラリの JNI version をチェックする.
                      -> JVM_IsSupportedJNIVersion()
                         -> Threads::is_supported_jni_version_including_1_1()
                            -> Threads::is_supported_jni_version()
                  (1) もし何かエラーが発生していたり, jni version が合わなかった場合はアンロード.
                      -> JVM_UnloadLibrary()
                         -> os::dll_unload()
                            * Linux の場合
                              -> dlclose()
                            * Solaris の場合
                              -> dlclose()
                            * Windows の場合
                              -> FreeLibrary()

処理の流れ (詳細)(Execution Flows : Details)

java.lang.System.loadLibrary()

See: here for details

java.lang.Runtime.loadLibrary0()

See: here for details

java.lang.ClassLoader.loadLibrary()

See: here for details

java.lang.ClassLoader.findLibrary()

See: here for details

java.lang.ClassLoader.loadLibrary0()

See: here for details

java.lang.ClassLoader$nativeLibraryContext.push()

(#Under Construction)

java.lang.ClassLoader$nativeLibraryContext.pop()

(#Under Construction)

Java_java_lang_ClassLoader_00024NativeLibrary_load()

See: here for details

initIDs()

See: here for details

JNU_GetStringPlatformChars()

(#Under Construction)

JVM_LoadLibrary()

See: here for details

os::dll_load() (Linux の場合)

See: here for details

os::dll_load() (Solaris の場合)

See: here for details

os::dll_load() (Windows の場合)

See: here for details

JVM_FindLibraryEntry()

See: here for details

os::dll_lookup() (Linux の場合)

See: here for details

os::dll_lookup() (Solaris の場合)

See: here for details

os::dll_lookup() (Windows の場合)

See: here for details

JVM_IsSupportedJNIVersion()

See: here for details

Threads::is_supported_jni_version_including_1_1()

See: here for details

Threads::is_supported_jni_version()

See: here for details

JVM_UnloadLibrary()

See: here for details

os::dll_unload() (Linux の場合)

See: here for details

os::dll_unload() (Solaris の場合)

See: here for details

os::dll_unload() (Windows の場合)

See: here for details


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