31#if defined (HAVE_CONFIG_H)
35#if defined (HAVE_WINDOWS_H)
49#include "builtin-defun-decls.h"
68#if defined (HAVE_JAVA)
72#if defined (HAVE_JAVA)
76#if defined (OCTAVE_USE_WINDOWS_API)
77# define LIBJVM_FILE_NAME "jvm.dll"
78#elif defined (__APPLE__)
79# define LIBJVM_FILE_NAME "libjvm.dylib"
80# define JAVA_HOME_CMD "/usr/libexec/java_home"
82# define LIBJVM_FILE_NAME "libjvm.so"
85#define TO_JOBJECT(obj) reinterpret_cast<jobject> (obj)
86#define TO_JCLASS(obj) reinterpret_cast<jclass> (obj)
88#define TO_JNIENV(env) reinterpret_cast<JNIEnv *> (env)
101 java_local_ref (JNIEnv *
env)
102 : m_jobj (
nullptr), m_detached (
false), m_env (
env) { }
104 java_local_ref (JNIEnv *
env, T obj)
105 : m_jobj (obj), m_detached (
false), m_env (
env) { }
107 ~java_local_ref () {
release (); }
109 T& operator = (T obj)
119 operator bool ()
const {
return (m_jobj != 0); }
120 operator T () {
return m_jobj; }
122 void detach () { m_detached =
true; }
133 : m_jobj (0), m_detached (
false), m_env (0)
138 if (m_env && m_jobj && ! m_detached)
139 m_env->DeleteLocalRef (m_jobj);
156jstring_to_string (JNIEnv *jni_env, jstring s);
159jstring_to_string (JNIEnv *jni_env, jobject obj);
162box (JNIEnv *jni_env,
void *jobj,
void *jcls_arg =
nullptr);
165box_more (JNIEnv *jni_env,
void *jobj_arg,
void *jcls_arg =
nullptr);
177 JNIEXPORT jboolean JNICALL
181 JNIEXPORT
void JNICALL
184 JNIEXPORT
void JNICALL
187 JNIEXPORT
void JNICALL
190 JNIEXPORT jboolean JNICALL
197static JavaVM *jvm =
nullptr;
204static bool jvm_attached =
false;
210static octave::dynamic_library jvm_lib;
212static std::map<int, octave_value> listener_map;
213static std::map<int, octave_value> octave_ref_map;
214static int octave_java_refcount = 0;
220static long octave_thread_ID = -1;
234 m_vm_args.version = JNI_VERSION_1_6;
235 m_vm_args.nOptions = 0;
236 m_vm_args.options =
nullptr;
237 m_vm_args.ignoreUnrecognized =
false;
245 JavaVMInitArgs * to_args ()
251 void add (
const std::string& opt)
253 m_java_opts.push_back (opt);
256 void read_java_opts (
const std::string& filename)
258 std::ifstream js = sys::ifstream (filename.c_str ());
260 if (! js.bad () && ! js.fail ())
264 while (! js.eof () && ! js.fail ())
266 std::getline (js, line);
268 if (line.find (
'-') == 0)
269 m_java_opts.push_back (line);
271 warning (
"invalid JVM option, skipping: %s", line.c_str ());
280 if (m_vm_args.options !=
nullptr)
282 for (
int i = 0; i < m_vm_args.nOptions; i++)
283 delete [] m_vm_args.options[i].optionString;
285 delete [] m_vm_args.options;
287 m_vm_args.options =
nullptr;
288 m_vm_args.nOptions = 0;
296 if (m_java_opts.size () > 0)
300 m_vm_args.nOptions = m_java_opts.size ();
301 m_vm_args.options =
new JavaVMOption [m_vm_args.nOptions];
303 for (
const auto& opt : m_java_opts)
307 m_vm_args.options[index++].optionString =
strsave (opt.c_str ());
310 m_java_opts.clear ();
316 JavaVMInitArgs m_vm_args;
318 std::list<std::string> m_java_opts;
321OCTAVE_END_NAMESPACE(octave)
345 static std::string java_dir;
347 if (java_dir.empty ())
349 java_dir = octave::sys::env::getenv (
"OCTAVE_JAVA_DIR");
351 if (java_dir.empty ())
352 java_dir = (octave::config::fcn_file_dir ()
353 + octave::sys::file_ops::dir_sep_str () +
"java");
374read_classpath_txt (
const std::string& filepath)
376 std::string classpath;
378 std::ifstream fs = octave::sys::ifstream (filepath.c_str ());
380 if (! fs.bad () && ! fs.fail ())
384 while (! fs.eof () && ! fs.fail ())
386 std::getline (fs, line);
387 if (line.length () > 0 && line[0] !=
'#' && line[0] !=
'%')
390 classpath.append (octave::directory_path::path_sep_str ());
393 int last = line.find_last_not_of (
" \t\f\v\r\n");
395 classpath.append (octave::sys::file_ops::tilde_expand (line.substr (0, last+1)));
424 std::string java_dir = initial_java_dir ();
426 std::string retval = java_dir;
429 if (! retval.empty ())
431 std::string sep = octave::sys::file_ops::dir_sep_str ();
433 std::string jar_file = java_dir + sep +
"octave.jar";
435 octave::sys::file_stat jar_exists (jar_file);
448 std::string cwd = octave::sys::env::get_current_directory ();
449 std::string home_dir = octave::sys::env::get_home_directory ();
453 std::vector<std::string> cp_list = {
"javaclasspath.txt",
457 for (std::string filename : cp_list)
459 std::string cp_file = filename;
460 octave::sys::file_stat cp_exists;
464 cp_exists = octave::sys::file_stat (cp_file);
468 std::string classpath = read_classpath_txt (cp_file);
469 retval.append (classpath);
476 cp_file =
'~' + sep + filename;
477 cp_file = octave::sys::file_ops::tilde_expand (cp_file);
478 cp_exists = octave::sys::file_stat (cp_file);
482 std::string classpath = read_classpath_txt (cp_file);
483 retval.append (classpath);
491 cp_file = java_dir + sep + filename;
492 cp_exists = octave::sys::file_stat (cp_file);
496 std::string classpath = read_classpath_txt (cp_file);
497 retval.append (classpath);
503 error (
"octave.jar does not exist: %s", jar_file.c_str ());
506 error (
"initial java dir is empty");
512get_jvm_lib_path_in_subdir (std::string java_home_path)
516#if defined (OCTAVE_USE_WINDOWS_API)
517 const std::array<const std::string, 2> subdirs = {
"bin/client",
"bin/server"};
519 const std::array<const std::string, 8> subdirs =
521 "jre/lib/server",
"jre/lib",
"lib/client",
"lib/server",
522 "jre/lib/amd64/client",
"jre/lib/amd64/server",
523 "jre/lib/i386/client",
"jre/lib/i386/server"
527 for (std::size_t i = 0; i < subdirs.size (); i++)
529 std::string candidate = java_home_path +
"/" + subdirs[i]
531 if (octave::sys::file_stat (candidate))
537#if defined (OCTAVE_USE_WINDOWS_API)
542get_regkey_value (HKEY h_rootkey,
const std::string subkey,
544OCTAVE_END_NAMESPACE(octave)
547get_jvm_lib_path_from_registry ()
550 std::string key, jversion, value;
553 key = R
"(software\javasoft\jdk)";
555 jversion = octave::sys::env::getenv ("JAVA_VERSION");
556 bool maybe_version_15_or_newer =
true;
559 if (jversion.empty ())
561 value =
"CurrentVersion";
562 retval = octave::get_regkey_value (HKEY_LOCAL_MACHINE, key, value,
565 if (retval != ERROR_SUCCESS)
568 maybe_version_15_or_newer =
false;
569 key = R
"(software\javasoft\jre)";
570 retval = octave::get_regkey_value (HKEY_LOCAL_MACHINE, key, value,
573 if (retval != ERROR_SUCCESS)
576 key = R
"(software\javasoft\java runtime environment)";
577 retval = octave::get_regkey_value (HKEY_LOCAL_MACHINE, key,
582 if (retval != ERROR_SUCCESS)
583 error (
"unable to find Java Runtime Environment: %s::%s",
584 key.c_str (), value.c_str ());
586 jversion = regval.
xstring_value (
"initialize_jvm: registry value "
587 R
"("%s" at "%s" must be a string)",
588 value.c_str (), key.c_str ());
591 std::string jvm_lib_path;
592 if (maybe_version_15_or_newer)
595 key = key +
'\\' + jversion;
597 retval = octave::get_regkey_value (HKEY_LOCAL_MACHINE, key, value,
600 if (retval != ERROR_SUCCESS)
601 error (
"unable to find Java Runtime Environment: %s::%s",
602 key.c_str (), value.c_str ());
605 = regval.
xstring_value (R
"(initialize_jvm: registry value "%s" at )"
606 R"("%s" must be a string)",
607 value.c_str (), key.c_str ())
608 + R"(\bin\server\jvm.dll)";
610 if (! jvm_lib_path.empty ())
616 key = R
"(software\javasoft\jre\)" + jversion;
617 value = "RuntimeLib";
618 retval = octave::get_regkey_value (HKEY_LOCAL_MACHINE, key, value,
621 if (retval != ERROR_SUCCESS)
624 key = R
"(software\javasoft\java runtime environment\)" + jversion;
625 retval = octave::get_regkey_value (HKEY_LOCAL_MACHINE, key, value,
629 if (retval != ERROR_SUCCESS)
630 error (
"unable to find Java Runtime Environment: %s::%s",
631 key.c_str (), value.c_str ());
634 = regval.
xstring_value (R
"(initialize_jvm: registry value "%s" at )"
635 R"("%s" must be a string)",
636 value.c_str (), key.c_str ());
638 if (jvm_lib_path.empty ())
639 error (
"unable to find Java Runtime Environment: %s::%s",
640 key.c_str (), value.c_str ());
680 const char *static_locale = setlocale (LC_ALL,
nullptr);
683 locale = std::string (static_locale);
685 octave::dynamic_library lib (
"");
686 std::string jvm_lib_path;
690 (lib.search (
"JNI_CreateJavaVM"));
692 (lib.search (
"JNI_GetCreatedJavaVMs"));
694 if (create_vm && get_vm)
695 jvm_lib_path =
"linked in or loaded libraries";
699 std::string java_home_env = octave::sys::env::getenv (
"JAVA_HOME");
700 if (! java_home_env.empty ())
702 jvm_lib_path = get_jvm_lib_path_in_subdir (java_home_env);
706 if (jvm_lib_path.empty ())
710# if defined (__APPLE__)
712 if (jvm_lib_path.empty ())
714 octave::sys::file_stat libexec_java_home_exists (JAVA_HOME_CMD);
715 if (libexec_java_home_exists)
720 std::string java_home_cmd = std::string (JAVA_HOME_CMD)
721 +
" --failfast --version 1.6+ 2>/dev/null";
723 octave::process_execution_result rslt
724 = octave::run_command_and_return_output (java_home_cmd);
726 if (rslt.exit_status () == 0)
728 std::string output = rslt.stdout_output ();
729 std::string found_path = output.substr (0, output.length() - 1);
730 std::string jvm_lib_found = get_jvm_lib_path_in_subdir (found_path);
731 if (!jvm_lib_found.empty ())
732 jvm_lib_path = jvm_lib_found;
738 if (jvm_lib_path.empty ())
740#if defined (OCTAVE_USE_WINDOWS_API)
741 jvm_lib_path = get_jvm_lib_path_from_registry ();
748 lib = octave::dynamic_library (jvm_lib_path);
751 error (
"unable to load Java Runtime Environment from %s",
752 jvm_lib_path.c_str ());
755 (lib.search (
"JNI_CreateJavaVM"));
757 (lib.search (
"JNI_GetCreatedJavaVMs"));
760 error (
"unable to find JNI_CreateJavaVM in %s", jvm_lib_path.c_str ());
763 error (
"unable to find JNI_GetCreatedJavaVMs in %s",
764 jvm_lib_path.c_str ());
770 if (get_vm (&jvm, 1, &nVMs) == 0 && nVMs > 0)
774 switch (jvm->GetEnv (
reinterpret_cast<void **
> (¤t_env),
779 JavaVMAttachArgs m_vm_args;
780 m_vm_args.version = JNI_VERSION_1_6;
781 m_vm_args.name =
const_cast<char *
> (
"octave");
782 m_vm_args.group =
nullptr;
783 if (jvm->AttachCurrentThread (
reinterpret_cast<void **
> (¤t_env),
785 error (
"JVM internal error, unable to attach octave to existing JVM");
789 error (
"JVM internal error, the required JNI version is not supported");
802 octave::JVMArgs m_vm_args;
805 m_vm_args.add (
"-Djava.class.path=" + initial_class_path ());
806#if defined (HAVE_BROKEN_PTHREAD_STACKSIZE)
807 m_vm_args.add (
"-Djdk.lang.processReaperUseDefaultStackSize=true");
809 m_vm_args.add (
"-Xrs");
812 m_vm_args.read_java_opts (initial_java_dir () +
813 octave::sys::file_ops::dir_sep_str () +
816 if (create_vm (&jvm, ¤t_env, m_vm_args.to_args ()) != JNI_OK)
817 error (
"unable to start Java VM in %s", jvm_lib_path.c_str ());
822 setlocale (LC_ALL, locale.c_str ());
840 jvm->DetachCurrentThread ();
842 jvm->DestroyJavaVM ();
845 jvm_attached =
false;
857jstring_to_string (JNIEnv *jni_env, jstring s)
863 const char *cstr = jni_env->GetStringUTFChars (s,
nullptr);
865 jni_env->ReleaseStringUTFChars (s, cstr);
872jstring_to_string (JNIEnv *jni_env, jobject obj)
878 jclass_ref cls (jni_env, jni_env->FindClass (
"java/lang/String"));
881 if (jni_env->IsInstanceOf (obj, cls))
882 retval = jstring_to_string (jni_env,
883 reinterpret_cast<jstring
> (obj));
896static inline JNIEnv *
899 JNIEnv *
env =
nullptr;
902 jvm->GetEnv (
reinterpret_cast<void **
> (&
env), JNI_VERSION_1_6);
909OCTAVE_NORETURN
static void
910error_unexpected (
const char *name)
912 error (
"unexpected call to %s when HAVE_JAVA is not defined - please report this bug", name);
920#if defined (HAVE_JAVA)
922 JNIEnv *current_env = thread_jni_env ();
924 if (current_env && m_java_object)
926 jclass_ref cls (current_env, current_env->FindClass (
"java/lang/String"));
927 return current_env->IsInstanceOf (
TO_JOBJECT (m_java_object), cls);
937 error_unexpected (
"octave_java::is_java_string");
945#if defined (HAVE_JAVA)
947 JNIEnv *current_env = thread_jni_env ();
949 std::string cls_cpp = cls_name;
950 std::replace (cls_cpp.begin (), cls_cpp.end (),
'.',
'/');
952 if (current_env && m_java_object)
954 jclass_ref cls (current_env, current_env->FindClass (cls_cpp.c_str ()));
955 if (current_env->ExceptionCheck ())
956 current_env->ExceptionClear ();
958 return current_env->IsInstanceOf (
TO_JOBJECT (m_java_object), cls);
964 octave_unused_parameter (cls_name);
969 error_unexpected (
"octave_java::is_instance_of");
974#if defined (HAVE_JAVA)
977check_exception (JNIEnv *jni_env)
986 jni_env->ExceptionDescribe ();
988 jni_env->ExceptionClear ();
990 jclass_ref jcls (jni_env, jni_env->GetObjectClass (ex));
991 jmethodID mID = jni_env->GetMethodID (jcls,
"toString",
992 "()Ljava/lang/String;");
994 reinterpret_cast<jstring
> (jni_env->CallObjectMethod (ex,
996 std::string msg = jstring_to_string (jni_env, js);
998 error (
"[java] %s", msg.c_str ());
1007find_octave_class (JNIEnv *jni_env,
const char *name)
1009 static std::string class_loader;
1010 static jclass uiClass =
nullptr;
1012 jclass jcls = jni_env->FindClass (name);
1014 if (jcls ==
nullptr)
1016 jni_env->ExceptionClear ();
1020 if (class_loader.empty ())
1023 jni_env->FindClass (
"java/lang/System"));
1024 jmethodID mID = jni_env->GetStaticMethodID
1027 "(Ljava/lang/String;)Ljava/lang/String;");
1029 jni_env->NewStringUTF (
"octave.class.loader"));
1030 js =
reinterpret_cast<jstring
> (jni_env->CallStaticObjectMethod
1031 (syscls, mID, jstring (js)));
1032 class_loader = jstring_to_string (jni_env, jstring (js));
1033 std::replace (class_loader.begin (), class_loader.end (),
1038 jni_env->FindClass (class_loader.c_str ()));
1042 jni_env->ExceptionClear ();
1045 std::replace (class_loader.begin (), class_loader.end (),
1048 jni_env->FindClass (
"org/openide/util/Lookup"));
1049 jmethodID mID = jni_env->GetStaticMethodID
1050 (jcls2,
"getDefault",
"()Lorg/openide/util/Lookup;");
1052 jni_env->CallStaticObjectMethod (jcls2, mID));
1053 mID = jni_env->GetMethodID (jcls2,
"lookup",
1054 "(Ljava/lang/Class;)Ljava/lang/Object;");
1056 jni_env->FindClass (
"java/lang/ClassLoader"));
1058 jni_env->CallObjectMethod
1059 (lObj, mID, jclass (cLoaderCls)));
1060 mID = jni_env->GetMethodID (cLoaderCls,
"loadClass",
1061 "(Ljava/lang/String;)Ljava/lang/Class;");
1063 jni_env->NewStringUTF (class_loader.c_str ()));
1064 uicls =
reinterpret_cast<jclass
>
1065 (jni_env->CallObjectMethod (cLoader, mID, jstring (js)));
1069 uiClass =
reinterpret_cast<jclass
>
1070 (jni_env->NewGlobalRef (jclass (uicls)));
1075 jmethodID mID = jni_env->GetStaticMethodID
1076 (uiClass,
"findClass",
"(Ljava/lang/String;)Ljava/lang/Class;");
1077 jstring_ref js (jni_env, jni_env->NewStringUTF (name));
1078 jcls =
reinterpret_cast<jclass
>
1079 (jni_env->CallStaticObjectMethod (uiClass, mID, jstring (js)));
1087compute_array_dimensions (JNIEnv *jni_env, jobject obj)
1090 jclass_ref jcls (jni_env, jni_env->GetObjectClass (obj));
1091 jclass_ref ccls (jni_env, jni_env->GetObjectClass (jcls));
1092 jmethodID isArray_ID = jni_env->GetMethodID (ccls,
"isArray",
"()Z");
1093 jmethodID getComponentType_ID = jni_env->GetMethodID (ccls,
1095 "()Ljava/lang/Class;");
1101 while (jcls && jni_env->CallBooleanMethod (jcls, isArray_ID))
1103 int len = (jobj ? jni_env->GetArrayLength (jobj) : 0);
1104 if (idx >= dv.ndims ())
1107 jcls =
reinterpret_cast<jclass
>
1108 (jni_env->CallObjectMethod (jcls, getComponentType_ID));
1110 ?
reinterpret_cast<jobjectArray
> (jni_env->GetObjectArrayElement (jobj,
1124 jclass_ref ocls (jni_env, jni_env->FindClass (
"[I"));
1125 jobjectArray retval = jni_env->NewObjectArray (idx.
length (), ocls,
nullptr);
1129 for (
int i = 0; i < idx.
length (); i++)
1132 octave::idx_vector v = idx(i).index_vector ();
1134 jintArray_ref i_array (jni_env, jni_env->NewIntArray (v.length ()));
1135 jint *buf = jni_env->GetIntArrayElements (i_array,
nullptr);
1139 for (
int k = 0; k < v.length (); k++)
1143 jni_env->ReleaseIntArrayElements (i_array, buf, 0);
1144 jni_env->SetObjectArrayElement (retval, i, i_array);
1146 check_exception (jni_env);
1148 catch (octave::index_exception& ie)
1151 ie.set_pos_if_unset (idx.
length (), i + 1);
1159get_array_elements (JNIEnv *jni_env, jobject jobj,
1164 jobject_ref java_idx (jni_env, make_java_index (jni_env, idx));
1167 find_octave_class (jni_env,
1168 "org/octave/ClassHelper"));
1169 jmethodID mID = jni_env
1170 ->GetStaticMethodID (helperClass,
"arraySubsref",
1171 "(Ljava/lang/Object;[[I)Ljava/lang/Object;");
1172 resObj = jni_env->CallStaticObjectMethod
1173 (helperClass, mID, jobj, jobject (java_idx));
1176 retval = box (jni_env, resObj);
1178 retval = check_exception (jni_env);
1186set_array_elements (JNIEnv *jni_env, jobject jobj,
1194 jobject_ref java_idx (jni_env, make_java_index (jni_env, idx));
1196 if (unbox (jni_env, rhs, rhsObj, rhsCls))
1199 find_octave_class (jni_env,
1200 "org/octave/ClassHelper"));
1201 jmethodID mID = jni_env->GetStaticMethodID (helperClass,
"arraySubsasgn",
1202 "(Ljava/lang/Object;[[ILjava/lang/Object;)" "Ljava/lang/Object;");
1203 resObj = jni_env->CallStaticObjectMethod
1204 (helperClass, mID, jobj, jobject (java_idx), jobject (rhsObj));
1208 retval = box (jni_env, resObj);
1210 retval = check_exception (jni_env);
1218get_invoke_list (JNIEnv *jni_env,
void *jobj_arg)
1222 std::list<std::string> name_list;
1226 jclass_ref cls (jni_env, jni_env->GetObjectClass (jobj));
1227 jclass_ref ccls (jni_env, jni_env->GetObjectClass (cls));
1228 jmethodID getMethods_ID = jni_env->GetMethodID
1229 (ccls,
"getMethods",
"()[Ljava/lang/reflect/Method;");
1230 jmethodID getFields_ID = jni_env->GetMethodID
1231 (ccls,
"getFields",
"()[Ljava/lang/reflect/Field;");
1233 reinterpret_cast<jobjectArray
>
1234 (jni_env->CallObjectMethod (cls, getMethods_ID)));
1236 reinterpret_cast<jobjectArray
>
1237 (jni_env->CallObjectMethod (cls, getFields_ID)));
1238 int mLen = jni_env->GetArrayLength (mList);
1239 int fLen = jni_env->GetArrayLength (fList);
1241 jni_env->FindClass (
"java/lang/reflect/Method"));
1243 jni_env->FindClass (
"java/lang/reflect/Field"));
1244 jmethodID m_getName_ID = jni_env->GetMethodID (mCls,
"getName",
1245 "()Ljava/lang/String;");
1246 jmethodID f_getName_ID = jni_env->GetMethodID (fCls,
"getName",
1247 "()Ljava/lang/String;");
1249 for (
int i = 0; i < mLen; i++)
1251 jobject_ref meth (jni_env, jni_env->GetObjectArrayElement (mList, i));
1252 jstring_ref methName (jni_env,
reinterpret_cast<jstring
>
1253 (jni_env->CallObjectMethod (meth,
1255 name_list.push_back (jstring_to_string (jni_env, methName));
1258 for (
int i = 0; i < fLen; i++)
1261 jni_env->GetObjectArrayElement (fList, i));
1263 reinterpret_cast<jstring
>
1264 (jni_env->CallObjectMethod
1265 (field, f_getName_ID)));
1266 name_list.push_back (jstring_to_string (jni_env, fieldName));
1274 return v.sort (
true);
1278convert_to_string (JNIEnv *jni_env, jobject m_java_object,
bool force,
1283 if (jni_env && m_java_object)
1285 jclass_ref cls (jni_env, jni_env->FindClass (
"java/lang/String"));
1287 if (jni_env->IsInstanceOf (m_java_object, cls))
1288 retval =
octave_value (jstring_to_string (jni_env, m_java_object),
1292 cls = jni_env->FindClass (
"[Ljava/lang/String;");
1294 if (jni_env->IsInstanceOf (m_java_object, cls))
1296 jobjectArray array =
reinterpret_cast<jobjectArray
> (m_java_object);
1297 int len = jni_env->GetArrayLength (array);
1300 for (
int i = 0; i <
len; i++)
1303 reinterpret_cast<jstring
>
1304 (jni_env->GetObjectArrayElement (array, i)));
1307 c(i) =
octave_value (jstring_to_string (jni_env, js), type);
1309 c(i) = check_exception (jni_env);
1316 cls = jni_env->FindClass (
"java/lang/Object");
1317 jmethodID mID = jni_env->GetMethodID (cls,
"toString",
1318 "()Ljava/lang/String;");
1320 reinterpret_cast<jstring
>
1321 (jni_env->CallObjectMethod (m_java_object,
1325 retval =
octave_value (jstring_to_string (jni_env, js), type);
1327 retval = check_exception (jni_env);
1331 error (
"unable to convert Java object to string");
1339#define TO_JAVA(obj) dynamic_cast<octave_java *> ((obj).internal_rep ())
1353is_auto_convertible_number (JNIEnv *jni_env, jobject jobj)
1356 cls = jni_env->FindClass (
"java/lang/Double");
1357 if (jni_env->IsInstanceOf (jobj, cls))
1359 cls = jni_env->FindClass (
"java/lang/Float");
1360 if (jni_env->IsInstanceOf (jobj, cls))
1362 cls = jni_env->FindClass (
"java/lang/Byte");
1363 if (jni_env->IsInstanceOf (jobj, cls))
1365 cls = jni_env->FindClass (
"java/lang/Short");
1366 if (jni_env->IsInstanceOf (jobj, cls))
1368 cls = jni_env->FindClass (
"java/lang/Integer");
1369 if (jni_env->IsInstanceOf (jobj, cls))
1371 cls = jni_env->FindClass (
"java/lang/Long");
1372 if (jni_env->IsInstanceOf (jobj, cls))
1399box (JNIEnv *jni_env,
void *jobj_arg,
void *jcls_arg)
1416 cls = jni_env->FindClass (
"java/lang/Number");
1417 if (jni_env->IsInstanceOf (jobj, cls)
1418 && is_auto_convertible_number (jni_env, jobj))
1420 jmethodID m = jni_env->GetMethodID (cls,
"doubleValue",
"()D");
1421 retval = jni_env->CallDoubleMethod (jobj, m);
1425 cls = jni_env->FindClass (
"java/lang/Boolean");
1426 if (jni_env->IsInstanceOf (jobj, cls))
1428 jmethodID m = jni_env->GetMethodID (cls,
"booleanValue",
"()Z");
1429 retval = (jni_env->CallBooleanMethod (jobj, m) ? true :
false);
1433 cls = jni_env->FindClass (
"java/lang/String");
1434 if (jni_env->IsInstanceOf (jobj, cls))
1436 retval = jstring_to_string (jni_env, jobj);
1440 cls = jni_env->FindClass (
"java/lang/Character");
1441 if (jni_env->IsInstanceOf (jobj, cls))
1443 jmethodID m = jni_env->GetMethodID (cls,
"charValue",
"()C");
1444 retval = jni_env->CallCharMethod (jobj, m);
1449#define BOX_PRIMITIVE_ARRAY(JAVA_TYPE, JAVA_ID, JAVA_TYPE_CAP, OCTAVE_ID) \
1450 cls = jni_env->FindClass (JAVA_ID); \
1451 if (jni_env->IsInstanceOf (jobj, cls)) \
1453 const JAVA_TYPE ## Array jarr = reinterpret_cast<JAVA_TYPE ## Array> (jobj); \
1454 const jsize len = jni_env->GetArrayLength (jarr); \
1455 OCTAVE_ID ## NDArray d (dim_vector (len, 1)); \
1456 JAVA_TYPE *buffer = reinterpret_cast<JAVA_TYPE *> (d.rwdata ()); \
1457 jni_env->Get ## JAVA_TYPE_CAP ## ArrayRegion (jarr, 0, len, buffer); \
1471#undef BOX_PRIMITIVE_ARRAY
1475 cls = find_octave_class (jni_env,
"org/octave/Matrix");
1477 if (jni_env->IsInstanceOf (jobj, cls))
1479 jmethodID mID = jni_env->GetMethodID (cls,
"getDims",
"()[I");
1481 reinterpret_cast<jintArray
>
1482 (jni_env->CallObjectMethod (jobj, mID)));
1483 jint *iv_data = jni_env->GetIntArrayElements (jintArray (iv),
1486 dims.
resize (jni_env->GetArrayLength (jintArray (iv)));
1488 for (
int i = 0; i < dims.
ndims (); i++)
1489 dims(i) = iv_data[i];
1491 jni_env->ReleaseIntArrayElements (jintArray (iv), iv_data, 0);
1492 mID = jni_env->GetMethodID (cls,
"getClassName",
1493 "()Ljava/lang/String;");
1495 reinterpret_cast<jstring
>
1496 (jni_env->CallObjectMethod (jobj, mID)));
1498 std::string s = jstring_to_string (jni_env, js);
1503 mID = jni_env->GetMethodID (cls,
"toDouble",
"()[D");
1505 reinterpret_cast<jdoubleArray
>
1506 (jni_env->CallObjectMethod (jobj,
1508 jni_env->GetDoubleArrayRegion (dv, 0, m.numel (),
1513 else if (s ==
"byte")
1518 mID = jni_env->GetMethodID (cls,
"toByte",
"()[B");
1520 reinterpret_cast<jbyteArray
>
1521 (jni_env->CallObjectMethod (jobj,
1523 jni_env->GetByteArrayRegion (dv, 0, m.numel (),
1524 reinterpret_cast<jbyte *
>
1532 mID = jni_env->GetMethodID (cls,
"toByte",
"()[B");
1534 reinterpret_cast<jbyteArray
>
1535 (jni_env->CallObjectMethod (jobj,
1537 jni_env->GetByteArrayRegion (dv, 0, m.numel (),
1538 reinterpret_cast<jbyte *
>
1544 else if (s ==
"integer")
1549 mID = jni_env->GetMethodID (cls,
"toInt",
"()[I");
1551 reinterpret_cast<jintArray
>
1552 (jni_env->CallObjectMethod (jobj,
1554 jni_env->GetIntArrayRegion (dv, 0, m.numel (),
1555 reinterpret_cast<jint *
>
1563 mID = jni_env->GetMethodID (cls,
"toInt",
"()[I");
1565 reinterpret_cast<jintArray
>
1566 (jni_env->CallObjectMethod (jobj,
1568 jni_env->GetIntArrayRegion (dv, 0, m.numel (),
1569 reinterpret_cast<jint *
>
1578 cls = find_octave_class (jni_env,
"org/octave/OctaveReference");
1579 if (jni_env->IsInstanceOf (jobj, cls))
1581 jmethodID mID = jni_env->GetMethodID (cls,
"getID",
"()I");
1582 int ID = jni_env->CallIntMethod (jobj, mID);
1583 auto it = octave_ref_map.find (ID);
1585 if (it != octave_ref_map.end ())
1586 retval = it->second;
1599box_more (JNIEnv *jni_env,
void *jobj_arg,
void *jcls_arg)
1614 cls = jni_env->FindClass (
"[D");
1616 if (jni_env->IsInstanceOf (jobj, cls))
1618 jdoubleArray jarr =
reinterpret_cast<jdoubleArray
> (jobj);
1619 int len = jni_env->GetArrayLength (jarr);
1624 jni_env->GetDoubleArrayRegion (jarr, 0,
len,
1635 cls = jni_env->FindClass (
"[[D");
1637 if (jni_env->IsInstanceOf (jobj, cls))
1639 jobjectArray jarr =
reinterpret_cast<jobjectArray
> (jobj);
1640 int rows = jni_env->GetArrayLength (jarr);
1647 for (
int r = 0; r < rows; r++)
1650 reinterpret_cast<jdoubleArray
>
1651 (jni_env->GetObjectArrayElement
1656 cols = jni_env->GetArrayLength (row);
1659 jni_env->GetDoubleArrayRegion
1660 (row, 0, cols, m.
rwdata () + r * cols);
1671 cls = jni_env->FindClass (
"[Ljava/lang/String;");
1673 if (jni_env->IsInstanceOf (jobj, cls))
1675 jobjectArray jarr =
reinterpret_cast<jobjectArray
> (jobj);
1676 int len = jni_env->GetArrayLength (jarr);
1679 for (
int i = 0; i <
len; i++)
1682 reinterpret_cast<jstring
>
1683 (jni_env->GetObjectArrayElement (jarr, i)));
1684 m(i) = jstring_to_string (jni_env, js);
1711 jcls = jni_env->GetObjectClass (jobj);
1717 jobj = jni_env->NewStringUTF (s.c_str ());
1718 jcls = jni_env->GetObjectClass (jobj);
1725 jclass_ref scls (jni_env, jni_env->FindClass (
"java/lang/String"));
1726 jobjectArray array = jni_env->NewObjectArray (n, scls,
nullptr);
1731 (str_arr(i).c_str ()));
1732 jni_env->SetObjectArrayElement (array, i, jstr);
1736 jcls = jni_env->GetObjectClass (jobj);
1743#define UNBOX_PRIMITIVE_ARRAY(METHOD_T, OCTAVE_T, JAVA_T, JAVA_T_CAP) \
1746 const OCTAVE_T ## NDArray v = val.METHOD_T ## array_value (); \
1747 JAVA_T ## Array jarr = jni_env->New ## JAVA_T_CAP ## Array (v.numel ()); \
1748 const JAVA_T *jv = reinterpret_cast<const JAVA_T *> (v.data ()); \
1749 jni_env->Set ## JAVA_T_CAP ## ArrayRegion (jarr, 0, v.numel (), jv); \
1750 jobj = reinterpret_cast<jobject> (jarr); \
1751 jcls = jni_env->GetObjectClass (jobj); \
1781#undef UNBOX_PRIMITIVE_ARRAY
1788#define UNBOX_PRIMITIVE_SCALAR(OCTAVE_T, METHOD_T, JAVA_T, JAVA_CON) \
1791 const OCTAVE_T ov = val.METHOD_T ## _value (); \
1792 jclass_ref dcls (jni_env, jni_env->FindClass (JAVA_T)); \
1793 const jfieldID fid = jni_env->GetStaticFieldID (dcls, "TYPE", "Ljava/lang/Class;"); \
1794 const jmethodID mid = jni_env->GetMethodID (dcls, "<init>", JAVA_CON); \
1795 jcls = reinterpret_cast<jclass> (jni_env->GetStaticObjectField (dcls, fid)); \
1796 jobj = jni_env->NewObject (dcls, mid, ov); \
1823#undef UNBOX_PRIMITIVE_SCALAR
1837 jdoubleArray dv = jni_env->NewDoubleArray (m.
numel ());
1838 jni_env->SetDoubleArrayRegion (dv, 0, m.
numel (), m.
rwdata ());
1840 jcls = jni_env->GetObjectClass (jobj);
1846 jclass_ref mcls (jni_env, find_octave_class (jni_env,
1847 "org/octave/Matrix"));
1850 jint *iv_data = jni_env->GetIntArrayElements (jintArray (iv),
nullptr);
1852 for (
int i = 0; i < dims.
ndims (); i++)
1853 iv_data[i] = dims(i);
1855 jni_env->ReleaseIntArrayElements (jintArray (iv), iv_data, 0);
1861 jni_env->SetDoubleArrayRegion (jdoubleArray (dv), 0, m.
numel (),
1863 jmethodID mID = jni_env->GetMethodID (mcls,
"<init>",
"([D[I)V");
1864 jobj = jni_env->NewObject (jclass (mcls), mID, jdoubleArray (dv),
1866 jcls = jni_env->GetObjectClass (jobj);
1872 jni_env->SetByteArrayRegion (jbyteArray (bv), 0, m.
numel (),
1873 reinterpret_cast<jbyte *
>
1875 jmethodID mID = jni_env->GetMethodID (mcls,
"<init>",
"([B[I)V");
1876 jobj = jni_env->NewObject
1877 (jclass (mcls), mID, jbyteArray (bv), jintArray (iv));
1878 jcls = jni_env->GetObjectClass (jobj);
1884 jni_env->SetByteArrayRegion (jbyteArray (bv), 0, m.
numel (),
1885 reinterpret_cast<jbyte *
>
1887 jmethodID mID = jni_env->GetMethodID (mcls,
"<init>",
"([B[I)V");
1888 jobj = jni_env->NewObject
1889 (jclass (mcls), mID, jbyteArray (bv), jintArray (iv));
1890 jcls = jni_env->GetObjectClass (jobj);
1896 jni_env->SetIntArrayRegion (jintArray (v), 0, m.
numel (),
1897 reinterpret_cast<jint *
>
1899 jmethodID mID = jni_env->GetMethodID (mcls,
"<init>",
"([I[I)V");
1900 jobj = jni_env->NewObject
1901 (jclass (mcls), mID, jintArray (v), jintArray (iv));
1902 jcls = jni_env->GetObjectClass (jobj);
1906 error (
"cannot convert matrix of type '%s'",
1912 jclass rcls = find_octave_class (jni_env,
"org/octave/OctaveReference");
1913 jmethodID mID = jni_env->GetMethodID (rcls,
"<init>",
"(I)V");
1914 int ID = octave_java_refcount++;
1916 jobj = jni_env->NewObject (rcls, mID, ID);
1918 octave_ref_map[ID] = val;
1930 jclass_ref ocls (jni_env, jni_env->FindClass (
"java/lang/Object"));
1931 jclass_ref ccls (jni_env, jni_env->FindClass (
"java/lang/Class"));
1934 jobjs = jni_env->NewObjectArray (args.
length (), ocls,
nullptr);
1937 jclss = jni_env->NewObjectArray (args.
length (), ccls,
nullptr);
1939 for (
int i = 0; i < args.
length (); i++)
1944 found = unbox (jni_env, args(i), jobj, jcls);
1948 jni_env->SetObjectArrayElement (jobjs, i, jobj);
1949 jni_env->SetObjectArrayElement (jclss, i, jcls);
1963get_current_thread_ID (JNIEnv *jni_env)
1968 jclass_ref cls (jni_env, jni_env->FindClass (
"java/lang/Thread"));
1969 jmethodID mID = jni_env->GetStaticMethodID (cls,
"currentThread",
1970 "()Ljava/lang/Thread;");
1971 jobject_ref jthread (jni_env, jni_env->CallStaticObjectMethod (cls, mID));
1976 jclass_ref jth_cls (jni_env, jni_env->GetObjectClass (jthread));
1977 mID = jni_env->GetMethodID (jth_cls,
"getId",
"()J");
1978 long result = jni_env->CallLongMethod (jthread, mID);
1993 JNIEnv *current_env = thread_jni_env ();
1998 jclass_ref cls (current_env, find_octave_class (current_env,
1999 "org/octave/Octave"));
2000 jmethodID mID = current_env->GetStaticMethodID
2001 (cls,
"checkPendingAction",
"()V");
2002 current_env->CallStaticVoidMethod (cls, mID);
2026 JNIEnv *current_env = thread_jni_env ();
2028 octave::command_editor::add_event_hook (java_event_hook);
2030 octave_thread_ID = get_current_thread_ID (current_env);
2032 catch (
const std::string msg)
2034 error (
"%s", msg.c_str ());
2041JNIEXPORT jboolean JNICALL
2043 jobjectArray argin, jobjectArray argout)
2045 std::string fname = jstring_to_string (
env, fcnName);
2047 int nargout =
env->GetArrayLength (argout);
2048 int nargin =
env->GetArrayLength (argin);
2052 for (
int i = 0; i < nargin; i++)
2053 varargin(i) = box (
env,
env->GetObjectArrayElement (argin, i),
nullptr);
2055 octave::interpreter& interp = octave::__get_interpreter__ ();
2061 return unbox (
env, varargout, out_objs, out_clss);
2064JNIEXPORT
void JNICALL
2067 octave_ref_map.erase (ID);
2070JNIEXPORT
void JNICALL
2074 auto it = octave_ref_map.find (ID);
2076 if (it != octave_ref_map.end ())
2079 int len =
env->GetArrayLength (args);
2082 for (
int i = 0; i <
len; i++)
2085 oct_args(i) = box (
env, jobj,
nullptr);
2088 octave::interpreter& interp = octave::__get_interpreter__ ();
2093 interp.feval (fcn, oct_args);
2097 && val.
cell_value()(0).is_function_handle ())
2102 for (
int i=1; i<c.
numel (); i++)
2103 oct_args(
len+i-1) = c(i);
2105 interp.feval (fcn, oct_args);
2108 error (
"trying to invoke non-invocable object");
2112JNIEXPORT
void JNICALL
2115 octave::interpreter& interp = octave::__get_interpreter__ ();
2117 std::string s = jstring_to_string (
env, cmd);
2119 interp.eval_string (s,
false, pstatus, 0);
2122JNIEXPORT jboolean JNICALL
2125 return (get_current_thread_ID (
env) != octave_thread_ID);
2135#if ! defined (HAVE_JAVA)
2145#if defined (HAVE_JAVA)
2151 octave_unused_parameter (jobj);
2152 octave_unused_parameter (jcls);
2159int octave_java::s_t_id (-1);
2161const std::string octave_java::s_t_name (
"octave_java");
2166#if defined (HAVE_JAVA)
2168 s_t_id = ti.register_type (octave_java::s_t_name,
"<unknown>",
2173 octave_unused_parameter (ti);
2181#if defined (HAVE_JAVA)
2183 JNIEnv *current_env = thread_jni_env ();
2185 if (current_env && m_java_object)
2186 return compute_array_dimensions (current_env,
TO_JOBJECT (m_java_object));
2195 error_unexpected (
"octave_java::dims");
2202 const std::list<octave_value_list>& idx,
int nargout)
2204#if defined (HAVE_JAVA)
2209 JNIEnv *current_env = thread_jni_env ();
2214 if (type.length () > 1 && type[1] ==
'(')
2218 ovl(0) = (idx.front ())(0);
2220 auto it = idx.begin ();
2222 retval = octave::FjavaMethod (
ovl, 1);
2230 ovl(1) = (idx.front ())(0);
2231 retval = octave::F__java_get__ (
ovl, 1);
2237 retval = get_array_elements
2242 error (
"subsref: Java object cannot be indexed with %c", type[0]);
2246 if (idx.size () > 1 && type.length () > 1)
2247 retval = retval(0).next_subsref (nargout, type, idx, skip);
2253 octave_unused_parameter (type);
2254 octave_unused_parameter (idx);
2255 octave_unused_parameter (nargout);
2260 error_unexpected (
"octave_java::subsref");
2267 const std::list<octave_value_list>& idx,
2270#if defined (HAVE_JAVA)
2274 JNIEnv *current_env = thread_jni_env ();
2279 if (type.length () == 1)
2285 ovl(1) = (idx.front ())(0);
2287 octave::F__java_set__ (
ovl);
2292 else if (type.length () > 2 && type[1] ==
'(')
2294 std::list<octave_value_list> new_idx;
2295 auto it = idx.begin ();
2296 new_idx.push_back (*it++);
2297 new_idx.push_back (*it++);
2300 std::list<octave_value_list> next_idx (idx);
2301 next_idx.erase (next_idx.begin ());
2302 next_idx.erase (next_idx.begin ());
2303 u(0).subsasgn (type.substr (2), next_idx, rhs);
2308 else if (type[1] ==
'.')
2312 std::list<octave_value_list> next_idx (idx);
2313 next_idx.erase (next_idx.begin ());
2314 u(0).subsasgn (type.substr (1), next_idx, rhs);
2320 error (
"invalid indexing/assignment on Java object");
2335 error (
"Java object cannot be indexed with %c", type[0]);
2343 octave_unused_parameter (type);
2344 octave_unused_parameter (idx);
2345 octave_unused_parameter (rhs);
2350 error_unexpected (
"octave_java::subsasgn");
2358#if defined (HAVE_JAVA)
2360 JNIEnv *current_env = thread_jni_env ();
2363 return get_invoke_list (current_env,
to_java ());
2372 error_unexpected (
"octave_java::map_keys");
2380#if defined (HAVE_JAVA)
2382 JNIEnv *current_env = thread_jni_env ();
2392 octave_unused_parameter (force);
2393 octave_unused_parameter (type);
2398 error_unexpected (
"octave_java::convert_to_str_internal");
2413 os <<
"<Java object: " << m_java_classname <<
'>';
2422 warning (
"save: unable to save java objects, skipping");
2437 warning (
"save: unable to save java objects, skipping");
2444 octave::mach_info::float_format )
2454 warning (
"save: unable to save java objects, skipping");
2470#if defined (HAVE_JAVA)
2474 JNIEnv *jni_env =
TO_JNIENV (jni_env_arg);
2479 if (unbox (jni_env, args, arg_objs, arg_types))
2481 jclass_ref helperClass (jni_env, find_octave_class (jni_env,
"org/octave/ClassHelper"));
2482 jmethodID mID = jni_env->GetStaticMethodID (helperClass,
"invokeMethod",
2483 "(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;[Ljava/lang/Class;)Ljava/lang/Object;");
2484 jstring_ref methName (jni_env, jni_env->NewStringUTF (name.c_str ()));
2486 reinterpret_cast<jobjectArray
> (jni_env->CallStaticObjectMethod (helperClass, mID,
2487 to_java (), jstring (methName), jobjectArray (arg_objs), jobjectArray (arg_types))));
2489 retval = box (jni_env, resObj);
2491 retval = check_exception (jni_env);
2501 octave_unused_parameter (jni_env_arg);
2502 octave_unused_parameter (name);
2503 octave_unused_parameter (args);
2508 error_unexpected (
"octave_java::do_javaMethod");
2517#if defined (HAVE_JAVA)
2523 octave_unused_parameter (name);
2524 octave_unused_parameter (args);
2529 error_unexpected (
"octave_java::do_javaMethod");
2536 const std::string& class_name,
2537 const std::string& name,
2540#if defined (HAVE_JAVA)
2544 JNIEnv *jni_env =
TO_JNIENV (jni_env_arg);
2549 if (unbox (jni_env, args, arg_objs, arg_types))
2552 find_octave_class (jni_env,
2553 "org/octave/ClassHelper"));
2554 jmethodID mID = jni_env->GetStaticMethodID (helperClass,
2555 "invokeStaticMethod",
2556 "(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;[Ljava/lang/Class;)Ljava/lang/Object;");
2558 jni_env->NewStringUTF (name.c_str ()));
2560 jni_env->NewStringUTF (
class_name.c_str ()));
2562 jni_env->CallStaticObjectMethod (helperClass,
2566 jobjectArray (arg_objs),
2567 jobjectArray (arg_types)));
2569 retval = box (jni_env, resObj);
2571 retval = check_exception (jni_env);
2581 octave_unused_parameter (jni_env_arg);
2583 octave_unused_parameter (name);
2584 octave_unused_parameter (args);
2589 error_unexpected (
"octave_java::do_javaMethod");
2596 const std::string& name,
2599#if defined (HAVE_JAVA)
2606 octave_unused_parameter (name);
2607 octave_unused_parameter (args);
2612 error_unexpected (
"octave_java::do_javaMethod");
2621#if defined (HAVE_JAVA)
2625 JNIEnv *jni_env =
TO_JNIENV (jni_env_arg);
2631 if (unbox (jni_env, args, arg_objs, arg_types))
2634 find_octave_class (jni_env,
2635 "org/octave/ClassHelper"));
2636 jmethodID mID = jni_env->GetStaticMethodID (helperClass,
2637 "invokeConstructor",
2638 "(Ljava/lang/String;[Ljava/lang/Object;[Ljava/lang/Class;)Ljava/lang/Object;");
2640 jni_env->NewStringUTF (name.c_str ()));
2642 jni_env->CallStaticObjectMethod (helperClass,
2645 jobjectArray (arg_objs),
2646 jobjectArray (arg_types)));
2651 check_exception (jni_env);
2661 octave_unused_parameter (jni_env_arg);
2662 octave_unused_parameter (name);
2663 octave_unused_parameter (args);
2668 error_unexpected (
"octave_java::do_javaObject");
2677#if defined (HAVE_JAVA)
2683 octave_unused_parameter (name);
2684 octave_unused_parameter (args);
2689 error_unexpected (
"octave_java::do_javaObject");
2697#if defined (HAVE_JAVA)
2701 JNIEnv *jni_env =
TO_JNIENV (jni_env_arg);
2706 find_octave_class (jni_env,
2707 "org/octave/ClassHelper"));
2708 jmethodID mID = jni_env->GetStaticMethodID (helperClass,
"getField",
2709 "(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;");
2710 jstring_ref fName (jni_env, jni_env->NewStringUTF (name.c_str ()));
2712 jni_env->CallStaticObjectMethod (helperClass,
2718 retval = box (jni_env, resObj);
2720 retval = check_exception (jni_env);
2729 octave_unused_parameter (jni_env_arg);
2730 octave_unused_parameter (name);
2735 error_unexpected (
"octave_java::do_java_get");
2743#if defined (HAVE_JAVA)
2749 octave_unused_parameter (name);
2754 error_unexpected (
"octave_java::do_java_get");
2761 const std::string& name)
2763#if defined (HAVE_JAVA)
2767 JNIEnv *jni_env =
TO_JNIENV (jni_env_arg);
2772 find_octave_class (jni_env,
2773 "org/octave/ClassHelper"));
2774 jmethodID mID = jni_env->GetStaticMethodID (helperClass,
2776 "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;");
2778 jstring_ref fName (jni_env, jni_env->NewStringUTF (name.c_str ()));
2780 jni_env->CallStaticObjectMethod (helperClass, mID,
2784 retval = box (jni_env, resObj);
2786 retval = check_exception (jni_env);
2795 octave_unused_parameter (jni_env_arg);
2797 octave_unused_parameter (name);
2802 error_unexpected (
"octave_java::do_java_get");
2809 const std::string& name)
2811#if defined (HAVE_JAVA)
2818 octave_unused_parameter (name);
2823 error_unexpected (
"octave_java::do_java_get");
2832#if defined (HAVE_JAVA)
2836 JNIEnv *jni_env =
TO_JNIENV (jni_env_arg);
2843 if (unbox (jni_env, val, jobj, jcls))
2846 find_octave_class (jni_env,
2847 "org/octave/ClassHelper"));
2848 jmethodID mID = jni_env->GetStaticMethodID (helperClass,
"setField",
2849 "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)V");
2850 jstring_ref fName (jni_env, jni_env->NewStringUTF (name.c_str ()));
2851 jni_env->CallStaticObjectMethod (helperClass, mID,
to_java (),
2852 jstring (fName), jobject (jobj));
2853 check_exception (jni_env);
2863 octave_unused_parameter (jni_env_arg);
2864 octave_unused_parameter (name);
2865 octave_unused_parameter (val);
2870 error_unexpected (
"octave_java::do_java_set");
2878#if defined (HAVE_JAVA)
2880 return do_java_set (thread_jni_env (), name, val);
2884 octave_unused_parameter (name);
2885 octave_unused_parameter (val);
2890 error_unexpected (
"octave_java::do_java_set");
2899#if defined (HAVE_JAVA)
2903 JNIEnv *jni_env =
TO_JNIENV (jni_env_arg);
2910 if (unbox (jni_env, val, jobj, jcls))
2913 find_octave_class (jni_env,
2914 "org/octave/ClassHelper"));
2915 jmethodID mID = jni_env->GetStaticMethodID (helperClass,
2917 "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V");
2919 jni_env->NewStringUTF (
class_name.c_str ()));
2920 jstring_ref fName (jni_env, jni_env->NewStringUTF (name.c_str ()));
2921 jni_env->CallStaticObjectMethod (helperClass, mID, jstring (cName),
2922 jstring (fName), jobject (jobj));
2923 check_exception (jni_env);
2933 octave_unused_parameter (jni_env_arg);
2935 octave_unused_parameter (name);
2936 octave_unused_parameter (val);
2941 error_unexpected (
"octave_java::do_java_set");
2948 const std::string& name,
2951#if defined (HAVE_JAVA)
2958 octave_unused_parameter (name);
2959 octave_unused_parameter (val);
2964 error_unexpected (
"octave_java::do_java_set");
2970octave_java::init (
void *jobj_arg,
void *jcls_arg)
2972#if defined (HAVE_JAVA)
2977 JNIEnv *current_env = thread_jni_env ();
2982 m_java_object = current_env->NewGlobalRef (jobj);
2985 m_java_class = current_env->NewGlobalRef (jcls);
2986 else if (m_java_object)
2989 current_env->GetObjectClass(
TO_JOBJECT (m_java_object)));
2990 m_java_class = current_env->NewGlobalRef (jclass (ocls));
2996 current_env->GetObjectClass (
TO_JCLASS (m_java_class)));
2997 jmethodID mID = current_env->GetMethodID (clsCls,
2999 "()Ljava/lang/String;");
3001 current_env->CallObjectMethod (
TO_JCLASS (m_java_class), mID));
3002 m_java_classname = jstring_to_string (current_env, resObj);
3008 octave_unused_parameter (jobj_arg);
3009 octave_unused_parameter (jcls_arg);
3014 error_unexpected (
"octave_java::init");
3020octave_java::release ()
3022#if defined (HAVE_JAVA)
3024 JNIEnv *current_env = thread_jni_env ();
3029 current_env->DeleteGlobalRef (
TO_JOBJECT (m_java_object));
3032 current_env->DeleteGlobalRef (
TO_JCLASS (m_java_class));
3034 m_java_object =
nullptr;
3035 m_java_class =
nullptr;
3043 error_unexpected (
"octave_java::release");
3053DEFUN (__java_init__, , ,
3065#if defined (HAVE_JAVA)
3082DEFUN (__java_exit__, , ,
3090#if defined (HAVE_JAVA)
3103DEFUN (javaObject, args, ,
3123#if defined (HAVE_JAVA)
3128 std::string classname = args(0).xstring_value (
"javaObject: CLASSNAME must be a string");
3132 JNIEnv *current_env = thread_jni_env ();
3135 for (
int i=1; i<args.
length (); i++)
3142 octave_unused_parameter (args);
3158DEFUN (javaMethod, args, ,
3184#if defined (HAVE_JAVA)
3189 std::string methodname = args(0).xstring_value (
"javaMethod: METHODNAME must be a string");
3193 JNIEnv *current_env = thread_jni_env ();
3198 for (
int i=2; i<args.
length (); i++)
3201 if (args(1).isjava ())
3204 retval = jobj->
do_javaMethod (current_env, methodname, tmp);
3206 else if (args(1).is_string ())
3208 std::string cls = args(1).string_value ();
3212 error (
"javaMethod: OBJ must be a Java object or a string");
3218 octave_unused_parameter (args);
3237DEFUN (__java_get__, args, ,
3259#if defined (HAVE_JAVA)
3264 std::string name = args(1).xstring_value (
"__java_get__: NAME must be a string");
3268 JNIEnv *current_env = thread_jni_env ();
3272 if (args(0).isjava ())
3277 else if (args(0).is_string ())
3279 std::string cls = args(0).string_value ();
3283 error (
"__java_get__: OBJ must be a Java object or a string");
3289 octave_unused_parameter (args);
3296DEFUN (__java_set__, args, ,
3319#if defined (HAVE_JAVA)
3324 std::string name = args(1).xstring_value (
"__java_set__: NAME must be a string");
3328 JNIEnv *current_env = thread_jni_env ();
3332 if (args(0).isjava ())
3335 retval = jobj->
do_java_set (current_env, name, args(2));
3337 else if (args(0).is_string ())
3339 std::string cls = args(0).string_value ();
3343 error (
"__java_set__: OBJ must be a Java object or a string");
3349 octave_unused_parameter (args);
3356DEFUN (__java2mat__, args, ,
3362#if defined (HAVE_JAVA)
3369 JNIEnv *current_env = thread_jni_env ();
3373 if (args(0).isjava ())
3376 retval =
ovl (box_more (current_env, jobj->
to_java (),
nullptr));
3379 retval =
ovl (args(0));
3385 octave_unused_parameter (args);
3392DEFUN (java_matrix_autoconversion, args, nargout,
3408#if defined (HAVE_JAVA)
3411 "java_matrix_autoconversion");
3415 octave_unused_parameter (args);
3416 octave_unused_parameter (nargout);
3423DEFUN (java_unsigned_autoconversion, args, nargout,
3440#if defined (HAVE_JAVA)
3443 "java_unsigned_autoconversion");
3447 octave_unused_parameter (args);
3448 octave_unused_parameter (nargout);
3455DEFUN (debug_java, args, nargout,
3470#if defined (HAVE_JAVA)
3476 octave_unused_parameter (args);
3477 octave_unused_parameter (nargout);
3488DEFUN (isjava, args, ,
3498 return ovl (args(0).isjava ());
3629OCTAVE_END_NAMESPACE(octave)
N Dimensional Array with copy-on-write semantics.
bool isempty() const
Size of the specified dimension.
T * rwdata()
Size of the specified dimension.
octave_idx_type numel() const
Number of elements in the array.
void resize(octave_idx_type nr, octave_idx_type nc, double rfv=0)
Vector representing the dimensions (size) of an Array.
void resize(int n, int fill_value=0)
octave_idx_type ndims() const
Number of dimensions.
void newline(std::ostream &os) const
static void register_type()
octave::refcount< octave_idx_type > m_count
friend class octave_value
bool save_hdf5(octave_hdf5_id loc_id, const char *name, bool save_as_floats)
std::string class_name() const
static octave_value do_javaObject(void *jni_env, const std::string &name, const octave_value_list &args)
octave_value do_java_set(void *jni_env, const std::string &name, const octave_value &val)
void print(std::ostream &os, bool pr_as_read_syntax=false)
string_vector map_keys() const
bool save_ascii(std::ostream &os)
bool load_hdf5(octave_hdf5_id loc_id, const char *name)
bool save_binary(std::ostream &os, bool save_as_floats)
bool is_java_string() const
octave_value do_javaMethod(void *jni_env, const std::string &name, const octave_value_list &args)
octave_value convert_to_str_internal(bool pad, bool force, char type) const
octave_value do_java_get(void *jni_env, const std::string &name)
void print_raw(std::ostream &os, bool pr_as_read_syntax=false) const
bool is_instance_of(const std::string &) const
octave_value subsasgn(const std::string &type, const std::list< octave_value_list > &idx, const octave_value &rhs)
octave_value_list subsref(const std::string &type, const std::list< octave_value_list > &idx, int nargout)
bool load_binary(std::istream &is, bool swap, octave::mach_info::float_format fmt)
bool load_ascii(std::istream &is)
octave_value_list & append(const octave_value &val)
octave_idx_type length() const
bool is_function_handle() const
bool is_undefined() const
bool is_uint32_type() const
std::string class_name() const
octave_function * function_value(bool silent=false) const
bool is_real_scalar() const
int32NDArray int32_array_value() const
int8NDArray int8_array_value() const
octave_idx_type rows() const
Array< std::string > cellstr_value() const
bool is_int8_type() const
bool is_uint8_type() const
bool is_uint64_type() const
bool is_uint16_type() const
bool is_int16_type() const
octave_idx_type numel() const
bool is_real_matrix() const
std::string string_value(bool force=false) const
bool is_int64_type() const
bool is_matrix_type() const
NDArray array_value(bool frc_str_conv=false) const
octave_idx_type length() const
bool is_double_type() const
bool is_int32_type() const
bool is_bool_scalar() const
octave_value convert_to_str(bool pad=false, bool force=false, char type='\'') const
uint8NDArray uint8_array_value() const
std::string xstring_value(const char *fmt,...) const
octave_idx_type columns() const
Matrix matrix_value(bool frc_str_conv=false) const
OCTAVE_BEGIN_NAMESPACE(octave) static octave_value daspk_fcn
#define DEFUN(name, args_name, nargout_name, doc)
Macro to define a builtin function.
void warning(const char *fmt,...)
void error(const char *fmt,...)
void err_disabled_feature(const std::string &fcn, const std::string &feature, const std::string &pkg)
void octave_set_default_fpucw(void)
F77_RET_T const F77_INT F77_CMPLX const F77_INT F77_CMPLX * B
F77_RET_T const F77_INT const F77_INT const F77_INT F77_DBLE const F77_INT F77_DBLE const F77_INT F77_DBLE const F77_INT F77_DBLE * Z
char * strsave(const char *s)
#define BOX_PRIMITIVE_ARRAY(JAVA_TYPE, JAVA_ID, JAVA_TYPE_CAP, OCTAVE_ID)
JNIEXPORT jboolean JNICALL Java_org_octave_Octave_call(JNIEnv *, jclass, jstring, jobjectArray, jobjectArray)
bool Vjava_unsigned_autoconversion
java_local_ref< jthrowable > jthrowable_ref
#define UNBOX_PRIMITIVE_SCALAR(OCTAVE_T, METHOD_T, JAVA_T, JAVA_CON)
JNIEXPORT jboolean JNICALL Java_org_octave_Octave_needThreadedInvokation(JNIEnv *, jclass)
java_local_ref< jdoubleArray > jdoubleArray_ref
java_local_ref< jobjectArray > jobjectArray_ref
java_local_ref< jclass > jclass_ref
jint(JNICALL * JNI_CreateJavaVM_t)(JavaVM **pvm, JNIEnv **penv, void *args)
java_local_ref< jbyteArray > jbyteArray_ref
JNIEXPORT void JNICALL Java_org_octave_Octave_doInvoke(JNIEnv *, jclass, jint, jobjectArray)
JNIEXPORT void JNICALL Java_org_octave_Octave_doEvalString(JNIEnv *, jclass, jstring)
java_local_ref< jobject > jobject_ref
bool Vjava_matrix_autoconversion
#define UNBOX_PRIMITIVE_ARRAY(METHOD_T, OCTAVE_T, JAVA_T, JAVA_T_CAP)
JNIEXPORT void JNICALL Java_org_octave_OctaveReference_doFinalize(JNIEnv *, jclass, jint)
java_local_ref< jstring > jstring_ref
java_local_ref< jintArray > jintArray_ref
jint(JNICALL * JNI_GetCreatedJavaVMs_t)(JavaVM **pvm, jsize bufLen, jsize *nVMs)
octave_value_list ovl(const OV_Args &... args)
Construct an octave_value_list with less typing.
octave_value set_internal_variable(bool &var, const octave_value_list &args, int nargout, const char *nm)