[REEF-2001] Driver launcher fails to find the JVM.DLL if JAVA_HOME is a JRE
This adds additional search paths for `JVM.DLL` to the C++ Bridge code.
JIRA:
[REEF-2001](https://issues.apache.org/jira/browse/REEF-2001)
Pull Request:
This closes #1443
diff --git a/lang/cs/Org.Apache.REEF.Bridge/DriverLauncher.cpp b/lang/cs/Org.Apache.REEF.Bridge/DriverLauncher.cpp
index 1243013..38098cf 100644
--- a/lang/cs/Org.Apache.REEF.Bridge/DriverLauncher.cpp
+++ b/lang/cs/Org.Apache.REEF.Bridge/DriverLauncher.cpp
@@ -25,12 +25,13 @@
LPCTSTR JAVA_HOME = L"JAVA_HOME";
// Where should we try to load jvm dll from?
-// Try server version first. Path relative to $(JAVA_HOME)
-LPCTSTR JVM_DLL1 = L"\\jre\\bin\\server\\jvm.dll";
-
-// If we could not find server jvm, Try client version.
-// Path relative to $(JAVA_HOME)
-LPCTSTR JVM_DLL2 = L"\\jre\\bin\\client\\jvm.dll";
+// Try these paths relative to $(JAVA_HOME).
+LPCTSTR const JVM_DLL_PATHS[] = {
+ L"\\jre\\bin\\server\\jvm.dll",
+ L"\\jre\\bin\\client\\jvm.dll",
+ L"\\bin\\server\\jvm.dll",
+ L"\\bin\\client\\jvm.dll" };
+int JVM_DLL_PATHS_SIZE = sizeof(JVM_DLL_PATHS) / sizeof(LPCTSTR);
// Name of the function that creates a java VM
const char* JNI_CreateJavaVM_Func_Name = "JNI_CreateJavaVM";
@@ -214,26 +215,32 @@
int Get_CreateJavaVM_Function(JNI_CreateJavaVM_FN& fn_JNI_CreateJavaVM)
{
- wchar_t jvmDllPath1[maxPathBufSize];
- wchar_t jvmDllPath2[maxPathBufSize];
- DWORD rc = GetEnvironmentVariable(JAVA_HOME, jvmDllPath1, maxPathBufSize);
+ wchar_t javaHomePath[maxPathBufSize];
+ wchar_t jvmDllPath[maxPathBufSize];
+
+ DWORD rc = GetEnvironmentVariable(JAVA_HOME, javaHomePath, maxPathBufSize);
if (0 == rc) {
wprintf(L"Could not GetEnvironmentVariable %ls\n", JAVA_HOME);
return ErrGetEnvironmentVariable;
}
- wcscat_s(jvmDllPath1, maxPathBufSize, JVM_DLL1);
+ // Try all possible dll paths
+ HMODULE jvm_dll = NULL;
+ for (int i = 0; i < JVM_DLL_PATHS_SIZE; i++) {
+ swprintf(jvmDllPath, maxPathBufSize, L"%ls%ls", javaHomePath, JVM_DLL_PATHS[i]);
- HMODULE jvm_dll = LoadLibrary(jvmDllPath1);
- if (jvm_dll == NULL) {
- wprintf(L"Could not load dll %ls\n", jvmDllPath1);
- GetEnvironmentVariable(JAVA_HOME, jvmDllPath2, maxPathBufSize);
- wcscat_s(jvmDllPath2, maxPathBufSize, JVM_DLL2);
- jvm_dll = LoadLibrary(jvmDllPath2);
+ jvm_dll = LoadLibrary(jvmDllPath);
if (jvm_dll == NULL) {
- wprintf(L"Could not load dll %ls\n", jvmDllPath2);
- return ErrLoadLibraryJVM;
+ wprintf(L"Could not load dll %ls\n", jvmDllPath);
}
+ else
+ {
+ break;
+ }
+ }
+
+ if (jvm_dll == NULL) {
+ return ErrLoadLibraryJVM;
}
fn_JNI_CreateJavaVM = (JNI_CreateJavaVM_FN)GetProcAddress(jvm_dll, JNI_CreateJavaVM_Func_Name);
@@ -279,7 +286,7 @@
//
int CallMainMethodOfEntryClass(
JNIEnv* env,
- char* argv[],
+ char* argv[],
int firstArgOrdinal,
int argCount)
{