Mercurial > hg > octave-nkf
changeset 20330:2db2db2df55b
Automatically convert arrays of java primitives into Octave types (bug #44882)
* libinterp/octave-value/ov-java.cc (box): when the result of a java method is
a java primitive type, these are converted to octave types automatically. We
seem to be handling this correctly for scalars but not for arrays yet. This
fixes it on the java -> octave direction.
author | Carnë Draug <carandraug@octave.org> |
---|---|
date | Mon, 20 Apr 2015 15:01:27 +0100 |
parents | f46f6d906654 |
children | 41064c150724 |
files | libinterp/octave-value/ov-java.cc |
diffstat | 1 files changed, 29 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/octave-value/ov-java.cc +++ b/libinterp/octave-value/ov-java.cc @@ -1047,6 +1047,30 @@ break; } +#define BOX_PRIMITIVE_ARRAY(JAVA_TYPE, JAVA_ID, JAVA_TYPE_CAP, OCTAVE_ID) \ + cls = jni_env->FindClass (JAVA_ID); \ + if (jni_env->IsInstanceOf (jobj, cls)) \ + { \ + const JAVA_TYPE ## Array jarr = reinterpret_cast<JAVA_TYPE ## Array> (jobj); \ + const jsize len = jni_env->GetArrayLength (jarr); \ + OCTAVE_ID ## NDArray d (dim_vector (len, 1)); \ + JAVA_TYPE * buffer = reinterpret_cast<JAVA_TYPE *> (d.fortran_vec ()); \ + jni_env->Get ## JAVA_TYPE_CAP ## ArrayRegion (jarr, 0, len, buffer); \ + retval = d; \ + break; \ + } + +BOX_PRIMITIVE_ARRAY (jboolean, "[Z", Boolean, bool) +BOX_PRIMITIVE_ARRAY (jchar, "[C", Char, char) +BOX_PRIMITIVE_ARRAY (jbyte, "[B", Byte, int8) +BOX_PRIMITIVE_ARRAY (jshort, "[S", Short, int16) +BOX_PRIMITIVE_ARRAY (jint, "[I", Int, int32) +BOX_PRIMITIVE_ARRAY (jlong, "[J", Long, int64) +BOX_PRIMITIVE_ARRAY (jfloat, "[F", Float, Float) +BOX_PRIMITIVE_ARRAY (jdouble, "[D", Double, ) + +#undef BOX_PRIMITIVE_ARRAY + if (Vjava_matrix_autoconversion) { cls = find_octave_class (jni_env, "org/octave/Matrix"); @@ -2437,3 +2461,8 @@ return retval; } +/* +## Check automatic conversion of java primitive arrays into octave types +%!assert (javaObject ("java.lang.String", "hello").getBytes (), +%! int8 ([104 101 108 108 111]')) +*/