Repository: reef Updated Branches: refs/heads/master 8c6a6535d -> fed6fb770
[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 Project: http://git-wip-us.apache.org/repos/asf/reef/repo Commit: http://git-wip-us.apache.org/repos/asf/reef/commit/fed6fb77 Tree: http://git-wip-us.apache.org/repos/asf/reef/tree/fed6fb77 Diff: http://git-wip-us.apache.org/repos/asf/reef/diff/fed6fb77 Branch: refs/heads/master Commit: fed6fb77050b58cc8429adb010bffb9e2b0a23e8 Parents: 8c6a653 Author: Tyler Clintworth <tycli...@microsoft.com> Authored: Wed Apr 4 15:22:42 2018 -0700 Committer: Markus Weimer <wei...@apache.org> Committed: Tue Apr 10 10:44:09 2018 -0700 ---------------------------------------------------------------------- .../Org.Apache.REEF.Bridge/DriverLauncher.cpp | 45 +++++++++++--------- 1 file changed, 26 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/reef/blob/fed6fb77/lang/cs/Org.Apache.REEF.Bridge/DriverLauncher.cpp ---------------------------------------------------------------------- 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 @@ typedef jint(JNICALL *JNI_CreateJavaVM_FN)(JavaVM **pvm, void **penv, void *args 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 @@ JavaVMOption* GetJavaOptions(char *argv[], int& optionCount, int firstOptionOrdi 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 CreateJVM(JNIEnv*& env, JavaVM*& jvm, JavaVMOption* options, int optionCount // int CallMainMethodOfEntryClass( JNIEnv* env, - char* argv[], + char* argv[], int firstArgOrdinal, int argCount) {