bool JvmLauncher::start()

in src/main/cpp/bootstrap/jvmlauncher.cpp [106:154]


bool JvmLauncher::start(const char *mainClassName, const list<string> &args, const list<string> &options, bool &separateProcess, DWORD *retCode) {
    assert(mainClassName);
    logMsg("JvmLauncher::start()\n\tmainClassName: %s\n\tseparateProcess: %s",
            mainClassName, separateProcess ? "true" : "false");
    logMsg("  args:");
    for (list<string>::const_iterator it = args.begin(); it != args.end(); ++it) {
        logMsg("\t%s", it->c_str());
    }
    logMsg("  options:");
    for (list<string>::const_iterator it = options.begin(); it != options.end(); ++it) {
        logMsg("\t%s", it->c_str());
    }

    if (!javaExePath.empty() && javaClientDllPath.empty() && javaServerDllPath.empty()) {
        logMsg("Found only java.exe at %s. No DLLs. Falling back to java.exe\n", javaExePath.c_str());
        separateProcess = true;
    } else {
        if (javaExePath.empty() || (javaClientDllPath.empty() && javaServerDllPath.empty())) {
            if (!initialize("")) {
                return false;
            }
        }
    }  

    if (!separateProcess) {
        // both client/server found, check option which should be used
        if (!javaClientDllPath.empty() && !javaServerDllPath.empty()) {
            javaDllPath = findClientOption(options) ? javaClientDllPath : javaServerDllPath;
        } else {
            javaDllPath = javaClientDllPath.empty() ? javaServerDllPath : javaClientDllPath;
        }

        // it is necessary to absolutize dll path because current dir has to be
        // temporarily changed for dll loading
        char absoluteJavaDllPath[MAX_PATH] = "";
        strncpy(absoluteJavaDllPath, javaDllPath.c_str(), MAX_PATH);
        normalizePath(absoluteJavaDllPath, MAX_PATH);
        javaDllPath = absoluteJavaDllPath;

        logMsg("Java DLL path: %s", javaDllPath.c_str());
        if (!canLoadJavaDll()) {
            logMsg("Falling back to running Java in a separate process; DLL cannot be loaded (64-bit DLL?).");
            separateProcess = true;
        }
    }

    return separateProcess ? startOutProcJvm(mainClassName, args, options, retCode)
            : startInProcJvm(mainClassName, args, options);
}