hotspot/src/share/vm/runtime/java.cpp
void JDK_Version::initialize() {
jdk_version_info info;
assert(!_current.is_valid(), "Don't initialize twice");
{- -------------------------------------------
(1) libjava 内から JDK_GetVersionInfo0() 関数を探す.
もし見つからなければ, ここでは _partially_initialized を true にするだけで終了.
---------------------------------------- -}
void *lib_handle = os::native_java_library();
jdk_version_info_fn_t func = CAST_TO_FN_PTR(jdk_version_info_fn_t,
os::dll_lookup(lib_handle, "JDK_GetVersionInfo0"));
if (func == NULL) {
// JDK older than 1.6
_current._partially_initialized = true;
{- -------------------------------------------
(1) JDK_GetVersionInfo0() 関数が見つかれば,
関数を呼び出し, その結果を _current に設定する.
(なお, "1.5.0" と返ってきた場合については "5.0" に変更している模様. (が 1.4.2 についてはそのままにするとのこと))
---------------------------------------- -}
} else {
(*func)(&info, sizeof(info));
int major = JDK_VERSION_MAJOR(info.jdk_version);
int minor = JDK_VERSION_MINOR(info.jdk_version);
int micro = JDK_VERSION_MICRO(info.jdk_version);
int build = JDK_VERSION_BUILD(info.jdk_version);
if (major == 1 && minor > 4) {
// We represent "1.5.0" as "5.0", but 1.4.2 as itself.
major = minor;
minor = micro;
micro = 0;
}
_current = JDK_Version(major, minor, micro, info.update_version,
info.special_update_version, build,
info.thread_park_blocker == 1,
info.post_vm_init_hook_enabled == 1);
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.