{ // accommodate the NULL at the end // 长度3的数组 JLI_List args = JLI_List_new(argc + 1); int i = 0;
// Add first arg, which is the app name // 数组首元素就是编译好的java可执行文件全路径 JLI_List_add(args, JLI_StringDup(argv[0])); // Append JDK_JAVA_OPTIONS if (JLI_AddArgsFromEnvVar(args, JDK_JAVA_OPTIONS)) { // 从环境变量中加载键JDK_JAVA_OPTIONS对应的值放到列表args里面 没有配置这个环境变量这个分支不执行 // JLI_SetTraceLauncher is not called yet // Show _JAVA_OPTIONS content along with JDK_JAVA_OPTIONS to aid diagnosis if (getenv(JLDEBUG_ENV_ENTRY)) { char *tmp = getenv("_JAVA_OPTIONS"); if (NULL != tmp) { JLI_ReportMessage(ARG_INFO_ENVVAR, "_JAVA_OPTIONS", tmp); } } } // Iterate the rest of command line for (i = 1; i < argc; i++) { JLI_List argsInFile = JLI_PreprocessArg(argv[i], JNI_TRUE); if (NULL == argsInFile) { // 将VMLoaderTest放到args中 其实就是为了将来JVM初始化好回调到Java类中的main方法 JLI_List_add(args, JLI_StringDup(argv[i])); } else { int cnt, idx; cnt = argsInFile->size; for (idx = 0; idx < cnt; idx++) { JLI_List_add(args, argsInFile->elements[idx]); } // Shallow free, we reuse the string to avoid copy JLI_MemFree(argsInFile->elements); JLI_MemFree(argsInFile); } } margc = args->size; // main方法实际的启动参数 // add the NULL pointer at argv[argc] JLI_List_add(args, NULL); // args数组中最后一个脚标占位了null margv = args->elements; }