changeset 20295:137f183b7dee stable

Fix conversion from string cell array into java's String[] (bug #45290) * libinterp/octave-value/ov-java.cc: when unboxing an octave_value into a java object, cell arrays were never handled because they were caught in the block handling numeric arrays. This was a regression introduced by cset 81fcf4aa9e03.
author Carnë Draug <carandraug@octave.org>
date Mon, 15 Jun 2015 02:08:41 +0100
parents 36b32c07c045
children 2691947f5409
files libinterp/octave-value/ov-java.cc
diffstat 1 files changed, 20 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/octave-value/ov-java.cc	Sat Jun 13 14:07:28 2015 +0200
+++ b/libinterp/octave-value/ov-java.cc	Mon Jun 15 02:08:41 2015 +0100
@@ -1281,6 +1281,20 @@
       jobj = jni_env->NewStringUTF (s.c_str ());
       jcls = jni_env->GetObjectClass (jobj);
     }
+  else if (val.is_cellstr ())
+    {
+      const Array<std::string> str_arr = val.cellstr_value ();
+      const octave_idx_type n = str_arr.numel ();
+      jclass_ref scls (jni_env, jni_env->FindClass ("java/lang/String"));
+      jobjectArray array = jni_env->NewObjectArray (n, scls, NULL);
+      for (octave_idx_type i = 0; i < n; i++)
+        {
+          jstring_ref jstr (jni_env, jni_env->NewStringUTF (str_arr(i).c_str ()));
+          jni_env->SetObjectArrayElement (array, i, jstr);
+        }
+      jobj = array;
+      jcls = jni_env->GetObjectClass (jobj);
+    }
   else if (val.numel () > 1 && val.dims ().is_vector ())
     {
 #define IF_UNBOX_PRIMITIVE_ARRAY(CHECK_TYPE, METHOD_TYPE, OCTAVE_TYPE, JAVA_TYPE, JAVA_TYPE_CAP) \
@@ -1414,20 +1428,6 @@
           error ("cannot convert matrix of type '%s'", val.class_name ().c_str ());
         }
     }
-  else if (val.is_cellstr ())
-    {
-      Cell cellStr = val.cell_value ();
-      jclass_ref scls (jni_env, jni_env->FindClass ("java/lang/String"));
-      jobjectArray array = jni_env->NewObjectArray (cellStr.length (), scls, 0);
-      for (int i = 0; i < cellStr.length (); i++)
-        {
-          jstring_ref jstr (jni_env,
-                            jni_env->NewStringUTF (cellStr(i).string_value().c_str ()));
-          jni_env->SetObjectArrayElement (array, i, jstr);
-        }
-      jobj = array;
-      jcls = jni_env->GetObjectClass (jobj);
-    }
   else
     {
       jclass rcls = find_octave_class (jni_env, "org/octave/OctaveReference");
@@ -2502,4 +2502,10 @@
 %! assert (class (javaObject ("java.lang.Byte", int8 (1))), "java.lang.Byte");
 %! assert (class (javaObject ("java.lang.Short", uint16 (1))), "java.lang.Short");
 %! assert (class (javaObject ("java.lang.Short", int16 (1))), "java.lang.Short");
+
+## Automatic conversion from string cell array into String[] (bug #45290)
+%!testif HAVE_JAVA
+%! assert (javaMethod ("binarySearch", "java.util.Arrays", {"aaa", "bbb", "ccc", "zzz"}, "aaa"), 0)
+%! assert (javaMethod ("binarySearch", "java.util.Arrays", {"aaa", "bbb", "ccc", "zzz"}, "zzz"), 3)
+%! assert (javaMethod ("binarySearch", "java.util.Arrays", {"aaa", "bbb", "ccc", "zzz"}, "hhh") < 0)
 */