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);
}