《jdk8u源码分析》1.main函数

jdk8u源码下载

src/share/bin/main.c::main(int argc, char **argv)

/*
 * Entry point.
 */
//根据变量JAVAW是否存在执行不同的代码块
#ifdef JAVAW
//MFC窗体程序入口
char **__initenv;

int WINAPI
WinMain(HINSTANCE inst, HINSTANCE previnst, LPSTR cmdline, int cmdshow)
{
    int margc;
    char** margv;
    const jboolean const_javaw = JNI_TRUE;

    __initenv = _environ;

#else /* JAVAW */
//命令行程序启动入口
int
main(int argc, char **argv)
{
    int margc;//命令行参数计数
    char** margv;//命令行参数数组,数据结构:StdArg
    const jboolean const_javaw = JNI_FALSE;
#endif /* JAVAW */
#ifdef _WIN32
    {
        int i = 0;
        if (getenv(JLDEBUG_ENV_ENTRY) != NULL) {
        	//Windows original main args:
            printf("Windows original main args:\n");
            for (i = 0 ; i < __argc ; i++) {
                printf("wwwd_args[%d] = %s\n", i, __argv[i]);
				//wwwd_args[0] = java
				//wwwd_args[1] = -jar
				//wwwd_args[2] = test.jar
            }
        }
    }
    JLI_CmdToArgs(GetCommandLine());
    margc = JLI_GetStdArgc();
    // add one more to mark the end
    margv = (char **)JLI_MemAlloc((margc + 1) * (sizeof(char *)));
    {
        int i = 0;
        StdArg *stdargs = JLI_GetStdArgs();
        for (i = 0 ; i < margc ; i++) {
            margv[i] = stdargs[i].arg;
        }
        margv[i] = NULL;
    }
#else /* *NIXES */
    margc = argc;
    margv = argv;
#endif /* WIN32 */
    //无论是命令行程序还是窗口程序,最终都会调用该方法
    return JLI_Launch(margc, margv,
                   sizeof(const_jargs) / sizeof(char *), const_jargs,
                   sizeof(const_appclasspath) / sizeof(char *), const_appclasspath,
                   FULL_VERSION,
                   DOT_VERSION,
                   (const_progname != NULL) ? const_progname : *margv,
                   (const_launcher != NULL) ? const_launcher : *margv,
                   (const_jargs != NULL) ? JNI_TRUE : JNI_FALSE,
                   const_cpwildcard, const_javaw, const_ergo_class);
}
命令 程序类型 是否阻塞
JAVA 命令行程序 阻塞程序
JAVAW 窗口程序 非阻塞程序

src/windows/bin/cmdtoargs.c::StdArg

typedef struct  {
    char* arg;//参数数组,包含键值对
    boolean has_wildcard;//是否包含通配符
} StdArg ;

猜你喜欢

转载自blog.csdn.net/weixin_37477523/article/details/87989513