《jdk8u源码分析》1.main函数
作者:互联网
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 ;
标签:const,margv,int,args,char,源码,jdk8u,margc,main 来源: https://blog.csdn.net/weixin_37477523/article/details/87989513