blob: 01f4e3448c97ec0fc2e5d6adf02e719feaa16624 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/*
* Author: Tomas Holy
*/
#ifndef _JVMLAUNCHER_H
#define _JVMLAUNCHER_H
#include <windows.h>
#include <string>
#include <list>
#include "jni.h"
#include "utilsfuncs.h"
class JvmLauncher {
static const int MAX_ARGS_LEN = 32*1024;
static const char *JDK_KEY;
static const char *JRE_KEY;
// registry key change starting with version 9
static const char *JDK_POST9_KEY;
static const char *JRE_POST9_KEY;
static const char *CUR_VERSION_NAME;
static const char *JAVA_HOME_NAME;
static const char *JAVA_BIN_DIR;
static const char *JAVA_EXE_FILE;
static const char *JAVAW_EXE_FILE;
static const char *JAVA_CLIENT_DLL_FILE;
static const char *JAVA_SERVER_DLL_FILE;
static const char *JAVA_JRE_PREFIX;
static const char *JNI_CREATEVM_FUNC;
public:
JvmLauncher();
virtual ~JvmLauncher();
bool initialize(const char *javaPathOrMinVersion);
bool getJavaPath(std::string &path);
bool start(const char *mainClassName, const std::list<std::string> &args, const std::list<std::string> &options, bool &separateProcess, DWORD *retCode);
void setSuppressConsole(bool val) {
suppressConsole = val;
}
private:
JvmLauncher(const JvmLauncher& orig);
bool checkJava(const char *javaPath, const char *prefix);
bool findJava(const char *minJavaVersion);
bool findJava(const char *javaKey, const char *prefix, const char *minJavaVersion);
bool startOutProcJvm(const char *mainClassName, const std::list<std::string> &args, const std::list<std::string> &options, DWORD *retCode);
bool startInProcJvm(const char *mainClassName, const std::list<std::string> &args, const std::list<std::string> &options);
bool isVersionString(const char *str);
bool canLoadJavaDll();
bool findClientOption(const std::list<std::string> &options);
private:
bool suppressConsole;
std::string javaExePath;
std::string javawExePath;
std::string javaDllPath;
std::string javaClientDllPath;
std::string javaServerDllPath;
std::string javaPath;
std::string javaBinPath;
class PrepareDllPath {
public:
PrepareDllPath(const char *dllDirectory)
: setDllDirectory(0) {
logMsg("PrepareDllPath: %s", dllDirectory);
oldCurDir[0] = '\0';
// SetDllDirectory is present since XP SP1, so we have to load it dynamically
HINSTANCE hKernel32 = GetModuleHandle("kernel32");
if (!hKernel32) {
logErr(true, false, "Cannot load kernel32.");
return;
}
LPFNSDD setDllDirectory = (LPFNSDD)GetProcAddress(hKernel32, "SetDllDirectoryA");
if (setDllDirectory) {
setDllDirectory(dllDirectory);
} else {
logErr(true, false, "Cannot find SetDllDirectoryA");
}
GetCurrentDirectory(MAX_PATH, oldCurDir);
SetCurrentDirectory(dllDirectory);
}
~PrepareDllPath() {
if (setDllDirectory) {
setDllDirectory(NULL);
}
if (oldCurDir[0]) {
SetCurrentDirectory(oldCurDir);
}
}
private:
typedef BOOL (WINAPI *LPFNSDD)(LPCTSTR lpPathname);
LPFNSDD setDllDirectory;
char oldCurDir[MAX_PATH];
};
};
#endif /* _JVMLAUNCHER_H */