# HG changeset patch # User Carnë Draug # Date 1434330521 -3600 # Node ID 137f183b7deeccaf4ccef100bb9b2b7f8ea9f0be # Parent 36b32c07c04586ee43a9ebe935aabafdc2deda4f 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. diff -r 36b32c07c045 -r 137f183b7dee libinterp/octave-value/ov-java.cc --- 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 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) */