Mercurial > octave
diff libinterp/octave-value/ov-java.cc @ 25770:374edade7b1b
fix use of JAVA_HOME to fail if not found and fall back correctly (bug #40111)
* ov-java.cc (LIBJVM_FILE_NAME): Define to system dependent library name.
(get_jvm_lib_path_in_subdir): Use it.
(initialize_jvm): Always attempt to use JAVA_HOME when set in the environment.
Fall back to compiled-in default (or Windows registry) only when not set.
author | Mike Miller <mtmiller@octave.org> |
---|---|
date | Fri, 10 Aug 2018 14:59:42 -0700 |
parents | 3ddd74bd7b11 |
children | 3fc9d7453ba6 |
line wrap: on
line diff
--- a/libinterp/octave-value/ov-java.cc Tue Aug 07 19:54:42 2018 +0200 +++ b/libinterp/octave-value/ov-java.cc Fri Aug 10 14:59:42 2018 -0700 @@ -66,6 +66,14 @@ #if defined (HAVE_JAVA) +#if defined (OCTAVE_USE_WINDOWS_API) +# define LIBJVM_FILE_NAME "jvm.dll" +#elif defined (__APPLE__) +# define LIBJVM_FILE_NAME "libjvm.dylib" +#else +# define LIBJVM_FILE_NAME "libjvm.so" +#endif + #define TO_JOBJECT(obj) reinterpret_cast<jobject> (obj) #define TO_JCLASS(obj) reinterpret_cast<jclass> (obj) @@ -503,21 +511,16 @@ // this machine #if defined (OCTAVE_USE_WINDOWS_API) std::string subdirs[] = {"bin/client", "bin/server"}; - std::string libjvm = "jvm.dll"; #else std::string subdirs[] = {"jre/lib/server", "jre/lib", "lib/client", "lib/server", "jre/lib/amd64/client", "jre/lib/amd64/server", "jre/lib/i386/client", "jre/lib/i386/server"}; -# if defined (__APPLE__) - std::string libjvm = "libjvm.dylib"; -# else - std::string libjvm = "libjvm.so"; -# endif #endif for (size_t i = 0; i < sizeof (subdirs) / sizeof (subdirs[0]); i++) { - std::string candidate = java_home_path + "/" + subdirs[i] + "/" + libjvm; + std::string candidate = java_home_path + "/" + subdirs[i] + + "/" LIBJVM_FILE_NAME; if (octave::sys::file_stat (candidate)) return candidate; } @@ -642,18 +645,23 @@ // JAVA_HOME environment variable takes precedence std::string java_home_env = octave::sys::env::getenv ("JAVA_HOME"); if (! java_home_env.empty ()) - jvm_lib_path = get_jvm_lib_path_in_subdir (java_home_env); - - if (jvm_lib_path.empty ()) + { + jvm_lib_path = get_jvm_lib_path_in_subdir (java_home_env); + + // If JAVA_HOME does not look like a Java directory, use it anyway + // to fail with a useful error message indicating the directory + if (jvm_lib_path.empty ()) + jvm_lib_path = java_home_env + "/" LIBJVM_FILE_NAME; + } + else + { #if defined (OCTAVE_USE_WINDOWS_API) - jvm_lib_path = get_jvm_lib_path_from_registry (); -#elif defined (__APPLE__) - // Fall back to JAVA_LDPATH determined by configure and set in config.h - jvm_lib_path = std::string (JAVA_LDPATH) + "/libjvm.dylib"; + jvm_lib_path = get_jvm_lib_path_from_registry (); #else - // Fall back to JAVA_LDPATH determined by configure and set in config.h - jvm_lib_path = std::string (JAVA_LDPATH) + "/libjvm.so"; + // Fall back to JAVA_LDPATH, determined by the build system + jvm_lib_path = std::string (JAVA_LDPATH) + "/" LIBJVM_FILE_NAME; #endif + } lib = octave::dynamic_library (jvm_lib_path);