You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的平台专属构建脚本决定的静态绑定,具体逻辑如下:

  1. 源码树的平台分层设计
    JDK8源码按"通用+专属"分层:
  • src/share/:存放所有平台通用的代码(如java.c)
  • src/<platform>/:存放对应操作系统的专属代码(如windows、solaris、macosx目录下的文件)
  1. 构建脚本的源文件筛选
    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
  1. 函数声明与链接
    通用代码的头文件(如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 09:47:51