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