changeset 28996:55bdcab3d85b stable

Detect Java versions >= 15 on Windows (bug #59215). * ov-java.cc (get_jvm_lib_path_from_registry): Also check for Java VM version 15 or newer.
author Markus Mützel <markus.muetzel@gmx.de>
date Thu, 08 Oct 2020 16:09:52 +0200
parents cc287e633588
children 22536a27d0a2 b3cd6eb1cca5
files libinterp/octave-value/ov-java.cc
diffstat 1 files changed, 54 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/octave-value/ov-java.cc	Fri Oct 23 18:59:29 2020 +0200
+++ b/libinterp/octave-value/ov-java.cc	Thu Oct 08 16:09:52 2020 +0200
@@ -550,51 +550,92 @@
 get_jvm_lib_path_from_registry ()
 {
   // In Windows, find the location of the JRE from the registry
-  // and load the symbol from the dll.
   std::string key, jversion, value;
 
-  // First search for JRE >= 9
-  key = R"(software\javasoft\jre)";
+  // First search for JRE >= 15
+  key = R"(software\javasoft\jdk)";
 
   jversion = octave::sys::env::getenv ("JAVA_VERSION");
+  bool maybe_version_15_or_newer = true;
   octave_value regval;
   LONG retval;
   if (jversion.empty ())
     {
       value = "CurrentVersion";
-      retval = octave::get_regkey_value (HKEY_LOCAL_MACHINE, key, value, regval);
+      retval = octave::get_regkey_value (HKEY_LOCAL_MACHINE, key, value,
+                                         regval);
 
       if (retval != ERROR_SUCCESS)
         {
-          // Search for JRE < 9
-          key = R"(software\javasoft\java runtime environment)";
-          retval = octave::get_regkey_value (HKEY_LOCAL_MACHINE, key, value, regval);
+          // Search for JRE < 15
+          maybe_version_15_or_newer = false;
+          key = R"(software\javasoft\jre)";
+          retval = octave::get_regkey_value (HKEY_LOCAL_MACHINE, key, value,
+                                             regval);
+
+          if (retval != ERROR_SUCCESS)
+            {
+              // Search for JRE < 9
+              key = R"(software\javasoft\java runtime environment)";
+              retval = octave::get_regkey_value (HKEY_LOCAL_MACHINE, key,
+                                                 value, regval);
+            }
         }
 
       if (retval != ERROR_SUCCESS)
         error ("unable to find Java Runtime Environment: %s::%s",
                key.c_str (), value.c_str ());
 
-      jversion = regval.xstring_value ("initialize_jvm: registry value \"%s\" at \"%s\" must be a string",
+      jversion = regval.xstring_value ("initialize_jvm: registry value "
+                                       R"("%s" at "%s" must be a string)",
                                        value.c_str (), key.c_str ());
     }
 
-  key = key + '\\' + jversion;
+  std::string jvm_lib_path;
+  if (maybe_version_15_or_newer)
+    {
+      // Look for value used by JRE >= 15
+      key = key + '\\' + jversion;
+      value = "JavaHome";
+      retval = octave::get_regkey_value (HKEY_LOCAL_MACHINE, key, value,
+                                         regval);
+
+      if (retval != ERROR_SUCCESS)
+        error ("unable to find Java Runtime Environment: %s::%s",
+               key.c_str (), value.c_str ());
+
+      jvm_lib_path
+        = regval.xstring_value (R"(initialize_jvm: registry value "%s" at )"
+                                R"("%s" must be a string)",
+                                value.c_str (), key.c_str ())
+          + R"(\bin\server\jvm.dll)";
+
+      if (! jvm_lib_path.empty ())
+        return jvm_lib_path;
+
+    }
+
+  // Search for JRE < 15
+  key = R"(software\javasoft\jre\)" + jversion;
   value = "RuntimeLib";
-  retval = octave::get_regkey_value (HKEY_LOCAL_MACHINE, key, value, regval);
+  retval = octave::get_regkey_value (HKEY_LOCAL_MACHINE, key, value,
+                                     regval);
+
   if (retval != ERROR_SUCCESS)
     {
       // Search for JRE < 9
       key = R"(software\javasoft\java runtime environment\)" + jversion;
-      retval = octave::get_regkey_value (HKEY_LOCAL_MACHINE, key, value, regval);
+      retval = octave::get_regkey_value (HKEY_LOCAL_MACHINE, key, value,
+                                         regval);
     }
 
   if (retval != ERROR_SUCCESS)
     error ("unable to find Java Runtime Environment: %s::%s",
            key.c_str (), value.c_str ());
 
-  std::string jvm_lib_path
-    = regval.xstring_value ("initialize_jvm: registry value \"%s\" at \"%s\" must be a string",
+  jvm_lib_path
+    = regval.xstring_value (R"(initialize_jvm: registry value "%s" at )"
+                            R"("%s" must be a string)",
                             value.c_str (), key.c_str ());
 
   if (jvm_lib_path.empty ())