JDK8中java.c如何选择调用对应平台的JVMInit/LoadJavaVM实现?
JDK8中java.c的JVMInit/LoadJavaVM函数平台实现选择机制
问题背景
在JDK8的jdk/src/share/bin/java.c中调用了JVMInit和LoadJavaVM函数,但这两个函数在不同平台有专属实现:
- Windows:
jdk/src/windows/bin/java_md.c - Linux/Solaris:
jdk/src/solaris/bin/java_md_solinux.c - macOS:
jdk/src/macosx/bin/java_md_macosx.c
找不到源码中的选择逻辑,需明确其工作机制。
附java.c中相关代码片段:
int JLI_Launch(int argc, char ** argv, /* main argc, argc */ int jargc, const char** jargv, /* java args */ int appclassc, const char** appclassv, /* app classpath */ const char* fullversion, /* full version defined */ const char* dotversion, /* dot version defined */ const char* pname, /* program name */ const char* lname, /* launcher name */ jboolean javaargs, /* JAVA_ARGS */ jboolean cpwildcard, /* classpath wildcard*/ jboolean javaw, /* windows-only javaw */ jint ergo /* ergonomics class policy */ ) { int mode = LM_UNKNOWN; char *what = NULL; char *cpath = 0; char *main_class = NULL; int ret; InvocationFunctions ifn; jlong start = 0, end = 0; char jvmpath[MAXPATHLEN]; char jrepath[MAXPATHLEN]; char jvmcfg[MAXPATHLEN]; ... if (!LoadJavaVM(jvmpath, &ifn)) { return(6); } ... return JVMInit(&ifn, threadStackSize, argc, argv, mode, what, ret); }
核心原理:构建阶段的静态选择
这并非运行时动态选择,而是编译构建阶段由JDK的平台专属构建脚本决定的静态绑定,具体逻辑如下:
- 源码树的平台分层设计
JDK8源码按"通用+专属"分层:
src/share/:存放所有平台通用的代码(如java.c)src/<platform>/:存放对应操作系统的专属代码(如windows、solaris、macosx目录下的文件)
- 构建脚本的源文件筛选
JDK8使用GNU Make作为构建工具,构建时会通过HOST_OS等环境变量识别目标平台,只编译对应平台目录下的源文件:
- 编译Windows版本时,仅包含
jdk/src/windows/bin/java_md.c,其他平台的java_md文件不会参与编译 - 编译Linux/Solaris版本时,仅包含
jdk/src/solaris/bin/java_md_solinux.c - 编译macOS版本时,仅包含
jdk/src/macosx/bin/java_md_macosx.c
- 函数声明与链接
通用代码的头文件(如jdk/src/share/include/jli.h)中会统一声明LoadJavaVM和JVMInit的函数接口:
jboolean LoadJavaVM(const char *jvmpath, InvocationFunctions *ifn); int JVMInit(InvocationFunctions *ifn, jlong threadStackSize, int argc, char **argv, int mode, char *what, int ret);
构建时,平台专属实现的函数会和通用代码编译后的目标文件链接,最终生成对应平台的java/javaw可执行程序。
简言之:不同平台的java_md文件不会同时编译,构建工具会根据目标操作系统挑选对应实现,和通用代码绑定成最终可执行文件,不存在运行时选择的环节。
内容的提问来源于stack exchange,提问作者HeGotIt
相关产品推荐
相关产品推荐

