31#if defined (HAVE_CONFIG_H)
35#if defined (HAVE_WINDOWS_H)
49#include "builtin-defun-decls.h"
69#if defined (HAVE_JAVA)
73#if defined (HAVE_JAVA)
77#if defined (OCTAVE_USE_WINDOWS_API)
78# define LIBJVM_FILE_NAME "jvm.dll"
79#elif defined (__APPLE__)
80# define LIBJVM_FILE_NAME "libjvm.dylib"
81# define JAVA_HOME_CMD "/usr/libexec/java_home"
83# define LIBJVM_FILE_NAME "libjvm.so"
86#define TO_JOBJECT(obj) reinterpret_cast<jobject> (obj)
87#define TO_JCLASS(obj) reinterpret_cast<jclass> (obj)
89#define TO_JNIENV(env) reinterpret_cast<JNIEnv *> (env)
163box (JNIEnv *jni_env,
void *jobj,
void *jcls_arg =
nullptr);
166box_more (JNIEnv *jni_env,
void *jobj_arg,
void *jcls_arg =
nullptr);
178 JNIEXPORT jboolean JNICALL
182 JNIEXPORT
void JNICALL
185 JNIEXPORT
void JNICALL
188 JNIEXPORT
void JNICALL
191 JNIEXPORT jboolean JNICALL
198static JavaVM *
jvm =
nullptr;
227OCTAVE_NAMESPACE_BEGIN
252 void add (
const std::string& opt)
261 if (! js.bad () && ! js.fail ())
265 while (! js.eof () && ! js.fail ())
267 std::getline (js, line);
269 if (line.find (
'-') == 0)
272 warning (
"invalid JVM option, skipping: %s", line.c_str ());
283 for (
int i = 0; i <
m_vm_args.nOptions; i++)
284 delete []
m_vm_args.options[i].optionString;
346 static std::string java_dir;
348 if (java_dir.empty ())
352 if (java_dir.empty ())
377 std::string classpath;
381 if (! fs.bad () && ! fs.fail ())
385 while (! fs.eof () && ! fs.fail ())
387 std::getline (fs, line);
388 if (line.length () > 0 && line[0] !=
'#' && line[0] !=
'%')
394 int last = line.find_last_not_of (
" \t\f\v\r\n");
427 std::string retval = java_dir;
430 if (! retval.empty ())
434 std::string jar_file = java_dir + sep +
"octave.jar";
454 std::vector<std::string> cp_list = {
"javaclasspath.txt",
457 for (std::string filename : cp_list)
459 std::string cp_file = filename;
469 retval.append (classpath);
476 cp_file =
'~' + sep + filename;
483 retval.append (classpath);
491 cp_file = java_dir + sep + filename;
497 retval.append (classpath);
503 error (
"octave.jar does not exist: %s", jar_file.c_str ());
506 error (
"initial java dir is empty");
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 =
520 {
"jre/lib/server",
"jre/lib",
"lib/client",
"lib/server",
521 "jre/lib/amd64/client",
"jre/lib/amd64/server",
522 "jre/lib/i386/client",
"jre/lib/i386/server"
526 for (std::size_t i = 0; i < subdirs.size (); i++)
528 std::string candidate = java_home_path +
"/" + subdirs[i]
536#if defined (OCTAVE_USE_WINDOWS_API)
538OCTAVE_NAMESPACE_BEGIN
541 get_regkey_value (HKEY h_rootkey,
const std::string subkey,
546get_jvm_lib_path_from_registry ()
549 std::string key, jversion, value;
552 key = R
"(software\javasoft\jdk)";
555 bool maybe_version_15_or_newer =
true;
558 if (jversion.empty ())
560 value =
"CurrentVersion";
561 retval = octave::get_regkey_value (HKEY_LOCAL_MACHINE, key, value,
564 if (retval != ERROR_SUCCESS)
567 maybe_version_15_or_newer =
false;
568 key = R
"(software\javasoft\jre)";
569 retval = octave::get_regkey_value (HKEY_LOCAL_MACHINE, key, value,
572 if (retval != ERROR_SUCCESS)
575 key = R
"(software\javasoft\java runtime environment)";
576 retval = octave::get_regkey_value (HKEY_LOCAL_MACHINE, key,
581 if (retval != ERROR_SUCCESS)
582 error (
"unable to find Java Runtime Environment: %s::%s",
583 key.c_str (), value.c_str ());
585 jversion = regval.
xstring_value (
"initialize_jvm: registry value "
586 R
"("%s" at "%s" must be a string)",
587 value.c_str (), key.c_str ());
590 std::string jvm_lib_path;
591 if (maybe_version_15_or_newer)
594 key = key +
'\\' + jversion;
596 retval = octave::get_regkey_value (HKEY_LOCAL_MACHINE, key, value,
599 if (retval != ERROR_SUCCESS)
600 error (
"unable to find Java Runtime Environment: %s::%s",
601 key.c_str (), value.c_str ());
604 = regval.
xstring_value (R
"(initialize_jvm: registry value "%s" at )"
605 R"("%s" must be a string)",
606 value.c_str (), key.c_str ())
607 + R"(\bin\server\jvm.dll)";
609 if (! jvm_lib_path.empty ())
615 key = R
"(software\javasoft\jre\)" + jversion;
616 value = "RuntimeLib";
617 retval = octave::get_regkey_value (HKEY_LOCAL_MACHINE, key, value,
620 if (retval != ERROR_SUCCESS)
623 key = R
"(software\javasoft\java runtime environment\)" + jversion;
624 retval = octave::get_regkey_value (HKEY_LOCAL_MACHINE, key, value,
628 if (retval != ERROR_SUCCESS)
629 error (
"unable to find Java Runtime Environment: %s::%s",
630 key.c_str (), value.c_str ());
633 = regval.
xstring_value (R
"(initialize_jvm: registry value "%s" at )"
634 R"("%s" must be a string)",
635 value.c_str (), key.c_str ());
637 if (jvm_lib_path.empty ())
638 error (
"unable to find Java Runtime Environment: %s::%s",
639 key.c_str (), value.c_str ());
678 const char *static_locale = setlocale (LC_ALL,
nullptr);
681 locale = std::string (static_locale);
684 std::string jvm_lib_path;
688 (lib.
search (
"JNI_CreateJavaVM"));
690 (lib.
search (
"JNI_GetCreatedJavaVMs"));
692 if (create_vm && get_vm)
693 jvm_lib_path =
"linked in or loaded libraries";
698 if (! java_home_env.empty ())
704 if (jvm_lib_path.empty ())
708# if defined (__APPLE__)
710 if (jvm_lib_path.empty ())
713 if (libexec_java_home_exists)
718 std::string java_home_cmd = std::string (JAVA_HOME_CMD)
719 +
" --failfast --version 1.6+ 2>/dev/null";
727 std::string found_path = output.substr (0, output.length() - 1);
729 if (!jvm_lib_found.empty ())
730 jvm_lib_path = jvm_lib_found;
736 if (jvm_lib_path.empty ())
738#if defined (OCTAVE_USE_WINDOWS_API)
739 jvm_lib_path = get_jvm_lib_path_from_registry ();
749 error (
"unable to load Java Runtime Environment from %s",
750 jvm_lib_path.c_str ());
753 (lib.
search (
"JNI_CreateJavaVM"));
755 (lib.
search (
"JNI_GetCreatedJavaVMs"));
758 error (
"unable to find JNI_CreateJavaVM in %s", jvm_lib_path.c_str ());
761 error (
"unable to find JNI_GetCreatedJavaVMs in %s",
762 jvm_lib_path.c_str ());
768 if (get_vm (&
jvm, 1, &nVMs) == 0 && nVMs > 0)
772 switch (
jvm->GetEnv (
reinterpret_cast<void **
> (¤t_env),
777 JavaVMAttachArgs m_vm_args;
778 m_vm_args.version = JNI_VERSION_1_6;
779 m_vm_args.name =
const_cast<char *
> (
"octave");
780 m_vm_args.group =
nullptr;
781 if (
jvm->AttachCurrentThread (
reinterpret_cast<void **
> (¤t_env),
783 error (
"JVM internal error, unable to attach octave to existing JVM");
787 error (
"JVM internal error, the required JNI version is not supported");
800 octave::JVMArgs m_vm_args;
804#if defined (HAVE_BROKEN_PTHREAD_STACKSIZE)
805 m_vm_args.add (
"-Djdk.lang.processReaperUseDefaultStackSize=true");
807 m_vm_args.add (
"-Xrs");
814 if (create_vm (&
jvm, ¤t_env, m_vm_args.to_args ()) != JNI_OK)
815 error (
"unable to start Java VM in %s", jvm_lib_path.c_str ());
820 setlocale (LC_ALL, locale.c_str ());
838 jvm->DetachCurrentThread ();
840 jvm->DestroyJavaVM ();
861 const char *cstr = jni_env->GetStringUTFChars (s,
nullptr);
863 jni_env->ReleaseStringUTFChars (s, cstr);
876 jclass_ref cls (jni_env, jni_env->FindClass (
"java/lang/String"));
879 if (jni_env->IsInstanceOf (obj, cls))
881 reinterpret_cast<jstring
> (obj));
894static inline JNIEnv *
897 JNIEnv *env =
nullptr;
900 jvm->GetEnv (
reinterpret_cast<void **
> (&env), JNI_VERSION_1_6);
910#if defined (HAVE_JAVA)
916 jclass_ref cls (current_env, current_env->FindClass (
"java/lang/String"));
935#if defined (HAVE_JAVA)
939 std::string cls_cpp = cls_name;
940 std::replace (cls_cpp.begin (), cls_cpp.end (),
'.',
'/');
944 jclass_ref cls (current_env, current_env->FindClass (cls_cpp.c_str ()));
945 if (current_env->ExceptionCheck ())
946 current_env->ExceptionClear ();
954 octave_unused_parameter (cls_name);
964#if defined (HAVE_JAVA)
976 jni_env->ExceptionDescribe ();
978 jni_env->ExceptionClear ();
980 jclass_ref jcls (jni_env, jni_env->GetObjectClass (ex));
981 jmethodID mID = jni_env->GetMethodID (jcls,
"toString",
982 "()Ljava/lang/String;");
984 reinterpret_cast<jstring
> (jni_env->CallObjectMethod (ex,
988 error (
"[java] %s", msg.c_str ());
999 static std::string class_loader;
1000 static jclass uiClass =
nullptr;
1002 jclass jcls = jni_env->FindClass (
name);
1004 if (jcls ==
nullptr)
1006 jni_env->ExceptionClear ();
1010 if (class_loader.empty ())
1013 jni_env->FindClass (
"java/lang/System"));
1014 jmethodID mID = jni_env->GetStaticMethodID
1017 "(Ljava/lang/String;)Ljava/lang/String;");
1019 jni_env->NewStringUTF (
"octave.class.loader"));
1020 js =
reinterpret_cast<jstring
> (jni_env->CallStaticObjectMethod
1021 (syscls, mID, jstring (js)));
1023 std::replace (class_loader.begin (), class_loader.end (),
1028 jni_env->FindClass (class_loader.c_str ()));
1032 jni_env->ExceptionClear ();
1035 std::replace (class_loader.begin (), class_loader.end (),
1038 jni_env->FindClass (
"org/openide/util/Lookup"));
1039 jmethodID mID = jni_env->GetStaticMethodID
1040 (jcls2,
"getDefault",
"()Lorg/openide/util/Lookup;");
1042 jni_env->CallStaticObjectMethod (jcls2, mID));
1043 mID = jni_env->GetMethodID (jcls2,
"lookup",
1044 "(Ljava/lang/Class;)Ljava/lang/Object;");
1046 jni_env->FindClass (
"java/lang/ClassLoader"));
1048 jni_env->CallObjectMethod
1049 (lObj, mID, jclass (cLoaderCls)));
1050 mID = jni_env->GetMethodID (cLoaderCls,
"loadClass",
1051 "(Ljava/lang/String;)Ljava/lang/Class;");
1053 jni_env->NewStringUTF (class_loader.c_str ()));
1054 uicls =
reinterpret_cast<jclass
>
1055 (jni_env->CallObjectMethod (cLoader, mID, jstring (js)));
1059 uiClass =
reinterpret_cast<jclass
>
1060 (jni_env->NewGlobalRef (jclass (uicls)));
1065 jmethodID mID = jni_env->GetStaticMethodID
1066 (uiClass,
"findClass",
"(Ljava/lang/String;)Ljava/lang/Class;");
1068 jcls =
reinterpret_cast<jclass
>
1069 (jni_env->CallStaticObjectMethod (uiClass, mID, jstring (js)));
1080 jclass_ref jcls (jni_env, jni_env->GetObjectClass (obj));
1081 jclass_ref ccls (jni_env, jni_env->GetObjectClass (jcls));
1082 jmethodID isArray_ID = jni_env->GetMethodID (ccls,
"isArray",
"()Z");
1083 jmethodID getComponentType_ID = jni_env->GetMethodID (ccls,
1085 "()Ljava/lang/Class;");
1091 while (jcls && jni_env->CallBooleanMethod (jcls, isArray_ID))
1093 int len = (jobj ? jni_env->GetArrayLength (jobj) : 0);
1094 if (idx >= dv.
ndims ())
1097 jcls =
reinterpret_cast<jclass
>
1098 (jni_env->CallObjectMethod (jcls, getComponentType_ID));
1100 ?
reinterpret_cast<jobjectArray
> (jni_env->GetObjectArrayElement (jobj,
1114 jclass_ref ocls (jni_env, jni_env->FindClass (
"[I"));
1115 jobjectArray retval = jni_env->NewObjectArray (idx.
length (), ocls,
nullptr);
1119 for (
int i = 0; i < idx.
length (); i++)
1125 jint *buf = jni_env->GetIntArrayElements (i_array,
nullptr);
1129 for (
int k = 0; k < v.
length (); k++)
1133 jni_env->ReleaseIntArrayElements (i_array, buf, 0);
1134 jni_env->SetObjectArrayElement (retval, i, i_array);
1158 "org/octave/ClassHelper"));
1159 jmethodID mID = jni_env
1160 ->GetStaticMethodID (helperClass,
"arraySubsref",
1161 "(Ljava/lang/Object;[[I)Ljava/lang/Object;");
1162 resObj = jni_env->CallStaticObjectMethod
1163 (helperClass, mID, jobj, jobject (java_idx));
1166 retval =
box (jni_env, resObj);
1186 if (
unbox (jni_env, rhs, rhsObj, rhsCls))
1190 "org/octave/ClassHelper"));
1191 jmethodID mID = jni_env->GetStaticMethodID (helperClass,
"arraySubsasgn",
1192 "(Ljava/lang/Object;[[ILjava/lang/Object;)" "Ljava/lang/Object;");
1193 resObj = jni_env->CallStaticObjectMethod
1194 (helperClass, mID, jobj, jobject (java_idx), jobject (rhsObj));
1198 retval =
box (jni_env, resObj);
1212 std::list<std::string> name_list;
1216 jclass_ref cls (jni_env, jni_env->GetObjectClass (jobj));
1217 jclass_ref ccls (jni_env, jni_env->GetObjectClass (cls));
1218 jmethodID getMethods_ID = jni_env->GetMethodID
1219 (ccls,
"getMethods",
"()[Ljava/lang/reflect/Method;");
1220 jmethodID getFields_ID = jni_env->GetMethodID
1221 (ccls,
"getFields",
"()[Ljava/lang/reflect/Field;");
1223 reinterpret_cast<jobjectArray
>
1224 (jni_env->CallObjectMethod (cls, getMethods_ID)));
1226 reinterpret_cast<jobjectArray
>
1227 (jni_env->CallObjectMethod (cls, getFields_ID)));
1228 int mLen = jni_env->GetArrayLength (mList);
1229 int fLen = jni_env->GetArrayLength (fList);
1231 jni_env->FindClass (
"java/lang/reflect/Method"));
1233 jni_env->FindClass (
"java/lang/reflect/Field"));
1234 jmethodID m_getName_ID = jni_env->GetMethodID (mCls,
"getName",
1235 "()Ljava/lang/String;");
1236 jmethodID f_getName_ID = jni_env->GetMethodID (fCls,
"getName",
1237 "()Ljava/lang/String;");
1239 for (
int i = 0; i < mLen; i++)
1241 jobject_ref meth (jni_env, jni_env->GetObjectArrayElement (mList, i));
1242 jstring_ref methName (jni_env,
reinterpret_cast<jstring
>
1243 (jni_env->CallObjectMethod (meth,
1248 for (
int i = 0; i < fLen; i++)
1251 jni_env->GetObjectArrayElement (fList, i));
1253 reinterpret_cast<jstring
>
1254 (jni_env->CallObjectMethod
1255 (field, f_getName_ID)));
1264 return v.
sort (
true);
1272 if (jni_env && m_java_object)
1274 jclass_ref cls (jni_env, jni_env->FindClass (
"java/lang/String"));
1276 if (jni_env->IsInstanceOf (m_java_object, cls))
1280 cls = jni_env->FindClass (
"[Ljava/lang/String;");
1282 if (jni_env->IsInstanceOf (m_java_object, cls))
1284 jobjectArray array =
reinterpret_cast<jobjectArray
> (m_java_object);
1285 int len = jni_env->GetArrayLength (array);
1288 for (
int i = 0; i <
len; i++)
1291 reinterpret_cast<jstring
>
1292 (jni_env->GetObjectArrayElement (array, i)));
1304 cls = jni_env->FindClass (
"java/lang/Object");
1305 jmethodID mID = jni_env->GetMethodID (cls,
"toString",
1306 "()Ljava/lang/String;");
1308 reinterpret_cast<jstring
>
1309 (jni_env->CallObjectMethod (m_java_object,
1319 error (
"unable to convert Java object to string");
1327#define TO_JAVA(obj) dynamic_cast<octave_java *> ((obj).internal_rep ())
1343 cls = jni_env->FindClass (
"java/lang/Double");
1344 if (jni_env->IsInstanceOf (jobj, cls))
1346 cls = jni_env->FindClass (
"java/lang/Float");
1347 if (jni_env->IsInstanceOf (jobj, cls))
1349 cls = jni_env->FindClass (
"java/lang/Byte");
1350 if (jni_env->IsInstanceOf (jobj, cls))
1352 cls = jni_env->FindClass (
"java/lang/Short");
1353 if (jni_env->IsInstanceOf (jobj, cls))
1355 cls = jni_env->FindClass (
"java/lang/Integer");
1356 if (jni_env->IsInstanceOf (jobj, cls))
1358 cls = jni_env->FindClass (
"java/lang/Long");
1359 if (jni_env->IsInstanceOf (jobj, cls))
1386box (JNIEnv *jni_env,
void *jobj_arg,
void *jcls_arg)
1403 cls = jni_env->FindClass (
"java/lang/Number");
1404 if (jni_env->IsInstanceOf (jobj, cls)
1407 jmethodID m = jni_env->GetMethodID (cls,
"doubleValue",
"()D");
1408 retval = jni_env->CallDoubleMethod (jobj, m);
1412 cls = jni_env->FindClass (
"java/lang/Boolean");
1413 if (jni_env->IsInstanceOf (jobj, cls))
1415 jmethodID m = jni_env->GetMethodID (cls,
"booleanValue",
"()Z");
1416 retval = (jni_env->CallBooleanMethod (jobj, m) ? true :
false);
1420 cls = jni_env->FindClass (
"java/lang/String");
1421 if (jni_env->IsInstanceOf (jobj, cls))
1427 cls = jni_env->FindClass (
"java/lang/Character");
1428 if (jni_env->IsInstanceOf (jobj, cls))
1430 jmethodID m = jni_env->GetMethodID (cls,
"charValue",
"()C");
1431 retval = jni_env->CallCharMethod (jobj, m);
1436#define BOX_PRIMITIVE_ARRAY(JAVA_TYPE, JAVA_ID, JAVA_TYPE_CAP, OCTAVE_ID) \
1437 cls = jni_env->FindClass (JAVA_ID); \
1438 if (jni_env->IsInstanceOf (jobj, cls)) \
1440 const JAVA_TYPE ## Array jarr = reinterpret_cast<JAVA_TYPE ## Array> (jobj); \
1441 const jsize len = jni_env->GetArrayLength (jarr); \
1442 OCTAVE_ID ## NDArray d (dim_vector (len, 1)); \
1443 JAVA_TYPE *buffer = reinterpret_cast<JAVA_TYPE *> (d.fortran_vec ()); \
1444 jni_env->Get ## JAVA_TYPE_CAP ## ArrayRegion (jarr, 0, len, buffer); \
1458#undef BOX_PRIMITIVE_ARRAY
1464 if (jni_env->IsInstanceOf (jobj, cls))
1466 jmethodID mID = jni_env->GetMethodID (cls,
"getDims",
"()[I");
1468 reinterpret_cast<jintArray
>
1469 (jni_env->CallObjectMethod (jobj, mID)));
1470 jint *iv_data = jni_env->GetIntArrayElements (jintArray (iv),
1473 dims.
resize (jni_env->GetArrayLength (jintArray (iv)));
1475 for (
int i = 0; i < dims.
ndims (); i++)
1476 dims(i) = iv_data[i];
1478 jni_env->ReleaseIntArrayElements (jintArray (iv), iv_data, 0);
1479 mID = jni_env->GetMethodID (cls,
"getClassName",
1480 "()Ljava/lang/String;");
1482 reinterpret_cast<jstring
>
1483 (jni_env->CallObjectMethod (jobj, mID)));
1490 mID = jni_env->GetMethodID (cls,
"toDouble",
"()[D");
1492 reinterpret_cast<jdoubleArray
>
1493 (jni_env->CallObjectMethod (jobj,
1495 jni_env->GetDoubleArrayRegion (dv, 0, m.
numel (),
1500 else if (s ==
"byte")
1505 mID = jni_env->GetMethodID (cls,
"toByte",
"()[B");
1507 reinterpret_cast<jbyteArray
>
1508 (jni_env->CallObjectMethod (jobj,
1510 jni_env->GetByteArrayRegion (dv, 0, m.
numel (),
1511 reinterpret_cast<jbyte *
>
1519 mID = jni_env->GetMethodID (cls,
"toByte",
"()[B");
1521 reinterpret_cast<jbyteArray
>
1522 (jni_env->CallObjectMethod (jobj,
1524 jni_env->GetByteArrayRegion (dv, 0, m.
numel (),
1525 reinterpret_cast<jbyte *
>
1531 else if (s ==
"integer")
1536 mID = jni_env->GetMethodID (cls,
"toInt",
"()[I");
1538 reinterpret_cast<jintArray
>
1539 (jni_env->CallObjectMethod (jobj,
1541 jni_env->GetIntArrayRegion (dv, 0, m.
numel (),
1542 reinterpret_cast<jint *
>
1550 mID = jni_env->GetMethodID (cls,
"toInt",
"()[I");
1552 reinterpret_cast<jintArray
>
1553 (jni_env->CallObjectMethod (jobj,
1555 jni_env->GetIntArrayRegion (dv, 0, m.
numel (),
1556 reinterpret_cast<jint *
>
1566 if (jni_env->IsInstanceOf (jobj, cls))
1568 jmethodID mID = jni_env->GetMethodID (cls,
"getID",
"()I");
1569 int ID = jni_env->CallIntMethod (jobj, mID);
1573 retval = it->second;
1586box_more (JNIEnv *jni_env,
void *jobj_arg,
void *jcls_arg)
1601 cls = jni_env->FindClass (
"[D");
1603 if (jni_env->IsInstanceOf (jobj, cls))
1605 jdoubleArray jarr =
reinterpret_cast<jdoubleArray
> (jobj);
1606 int len = jni_env->GetArrayLength (jarr);
1611 jni_env->GetDoubleArrayRegion (jarr, 0,
len,
1622 cls = jni_env->FindClass (
"[[D");
1624 if (jni_env->IsInstanceOf (jobj, cls))
1626 jobjectArray jarr =
reinterpret_cast<jobjectArray
> (jobj);
1627 int rows = jni_env->GetArrayLength (jarr);
1634 for (
int r = 0; r < rows; r++)
1637 reinterpret_cast<jdoubleArray
>
1638 (jni_env->GetObjectArrayElement
1643 cols = jni_env->GetArrayLength (row);
1646 jni_env->GetDoubleArrayRegion
1658 cls = jni_env->FindClass (
"[Ljava/lang/String;");
1660 if (jni_env->IsInstanceOf (jobj, cls))
1662 jobjectArray jarr =
reinterpret_cast<jobjectArray
> (jobj);
1663 int len = jni_env->GetArrayLength (jarr);
1666 for (
int i = 0; i <
len; i++)
1669 reinterpret_cast<jstring
>
1670 (jni_env->GetObjectArrayElement (jarr, i)));
1698 jcls = jni_env->GetObjectClass (jobj);
1704 jobj = jni_env->NewStringUTF (s.c_str ());
1705 jcls = jni_env->GetObjectClass (jobj);
1712 jclass_ref scls (jni_env, jni_env->FindClass (
"java/lang/String"));
1713 jobjectArray array = jni_env->NewObjectArray (n, scls,
nullptr);
1718 (str_arr(i).c_str ()));
1719 jni_env->SetObjectArrayElement (array, i, jstr);
1723 jcls = jni_env->GetObjectClass (jobj);
1730#define UNBOX_PRIMITIVE_ARRAY(METHOD_T, OCTAVE_T, JAVA_T, JAVA_T_CAP) \
1733 const OCTAVE_T ## NDArray v = val.METHOD_T ## array_value (); \
1734 JAVA_T ## Array jarr = jni_env->New ## JAVA_T_CAP ## Array (v.numel ()); \
1735 const JAVA_T *jv = reinterpret_cast<const JAVA_T *> (v.data ()); \
1736 jni_env->Set ## JAVA_T_CAP ## ArrayRegion (jarr, 0, v.numel (), jv); \
1737 jobj = reinterpret_cast<jobject> (jarr); \
1738 jcls = jni_env->GetObjectClass (jobj); \
1768#undef UNBOX_PRIMITIVE_ARRAY
1775#define UNBOX_PRIMITIVE_SCALAR(OCTAVE_T, METHOD_T, JAVA_T, JAVA_CON) \
1778 const OCTAVE_T ov = val.METHOD_T ## _value (); \
1779 jclass_ref dcls (jni_env, jni_env->FindClass (JAVA_T)); \
1780 const jfieldID fid = jni_env->GetStaticFieldID (dcls, "TYPE", "Ljava/lang/Class;"); \
1781 const jmethodID mid = jni_env->GetMethodID (dcls, "<init>", JAVA_CON); \
1782 jcls = reinterpret_cast<jclass> (jni_env->GetStaticObjectField (dcls, fid)); \
1783 jobj = jni_env->NewObject (dcls, mid, ov); \
1810#undef UNBOX_PRIMITIVE_SCALAR
1824 jdoubleArray dv = jni_env->NewDoubleArray (m.
numel ());
1827 jcls = jni_env->GetObjectClass (jobj);
1834 "org/octave/Matrix"));
1837 jint *iv_data = jni_env->GetIntArrayElements (jintArray (iv),
nullptr);
1839 for (
int i = 0; i < dims.
ndims (); i++)
1840 iv_data[i] = dims(i);
1842 jni_env->ReleaseIntArrayElements (jintArray (iv), iv_data, 0);
1848 jni_env->SetDoubleArrayRegion (jdoubleArray (dv), 0, m.
numel (),
1850 jmethodID mID = jni_env->GetMethodID (mcls,
"<init>",
"([D[I)V");
1851 jobj = jni_env->NewObject (jclass (mcls), mID, jdoubleArray (dv),
1853 jcls = jni_env->GetObjectClass (jobj);
1859 jni_env->SetByteArrayRegion (jbyteArray (bv), 0, m.
numel (),
1860 reinterpret_cast<jbyte *
>
1862 jmethodID mID = jni_env->GetMethodID (mcls,
"<init>",
"([B[I)V");
1863 jobj = jni_env->NewObject
1864 (jclass (mcls), mID, jbyteArray (bv), jintArray (iv));
1865 jcls = jni_env->GetObjectClass (jobj);
1871 jni_env->SetByteArrayRegion (jbyteArray (bv), 0, m.
numel (),
1872 reinterpret_cast<jbyte *
>
1874 jmethodID mID = jni_env->GetMethodID (mcls,
"<init>",
"([B[I)V");
1875 jobj = jni_env->NewObject
1876 (jclass (mcls), mID, jbyteArray (bv), jintArray (iv));
1877 jcls = jni_env->GetObjectClass (jobj);
1883 jni_env->SetIntArrayRegion (jintArray (v), 0, m.
numel (),
1884 reinterpret_cast<jint *
>
1886 jmethodID mID = jni_env->GetMethodID (mcls,
"<init>",
"([I[I)V");
1887 jobj = jni_env->NewObject
1888 (jclass (mcls), mID, jintArray (v), jintArray (iv));
1889 jcls = jni_env->GetObjectClass (jobj);
1893 error (
"cannot convert matrix of type '%s'",
1900 jmethodID mID = jni_env->GetMethodID (rcls,
"<init>",
"(I)V");
1903 jobj = jni_env->NewObject (rcls, mID, ID);
1917 jclass_ref ocls (jni_env, jni_env->FindClass (
"java/lang/Object"));
1918 jclass_ref ccls (jni_env, jni_env->FindClass (
"java/lang/Class"));
1921 jobjs = jni_env->NewObjectArray (args.
length (), ocls,
nullptr);
1924 jclss = jni_env->NewObjectArray (args.
length (), ccls,
nullptr);
1926 for (
int i = 0; i < args.
length (); i++)
1931 found =
unbox (jni_env, args(i), jobj, jcls);
1935 jni_env->SetObjectArrayElement (jobjs, i, jobj);
1936 jni_env->SetObjectArrayElement (jclss, i, jcls);
1955 jclass_ref cls (jni_env, jni_env->FindClass (
"java/lang/Thread"));
1956 jmethodID mID = jni_env->GetStaticMethodID (cls,
"currentThread",
1957 "()Ljava/lang/Thread;");
1958 jobject_ref jthread (jni_env, jni_env->CallStaticObjectMethod (cls, mID));
1963 jclass_ref jth_cls (jni_env, jni_env->GetObjectClass (jthread));
1964 mID = jni_env->GetMethodID (jth_cls,
"getId",
"()J");
1965 long result = jni_env->CallLongMethod (jthread, mID);
1986 "org/octave/Octave"));
1987 jmethodID mID = current_env->GetStaticMethodID
1988 (cls,
"checkPendingAction",
"()V");
1989 current_env->CallStaticVoidMethod (cls, mID);
2019 catch (
const std::string msg)
2021 error (
"%s", msg.c_str ());
2028JNIEXPORT jboolean JNICALL
2030 jobjectArray argin, jobjectArray argout)
2034 int nargout = env->GetArrayLength (argout);
2035 int nargin = env->GetArrayLength (argin);
2039 for (
int i = 0; i < nargin; i++)
2040 varargin(i) =
box (env, env->GetObjectArrayElement (argin, i),
nullptr);
2046 return unbox (env, varargout, out_objs, out_clss);
2049JNIEXPORT
void JNICALL
2055JNIEXPORT
void JNICALL
2064 int len = env->GetArrayLength (args);
2067 for (
int i = 0; i <
len; i++)
2069 jobject_ref jobj (env, env->GetObjectArrayElement (args, i));
2070 oct_args(i) =
box (env, jobj,
nullptr);
2080 && val.
cell_value()(0).is_function_handle ())
2085 for (
int i=1; i<c.
numel (); i++)
2086 oct_args(
len+i-1) = c(i);
2091 error (
"trying to invoke non-invocable object");
2095JNIEXPORT
void JNICALL
2098 octave::interpreter& interp
2103 interp.eval_string (s,
false, pstatus, 0);
2106JNIEXPORT jboolean JNICALL
2119#if ! defined (HAVE_JAVA)
2129#if defined (HAVE_JAVA)
2135 octave_unused_parameter (jobj);
2136 octave_unused_parameter (jcls);
2150#if defined (HAVE_JAVA)
2157 octave_unused_parameter (ti);
2165#if defined (HAVE_JAVA)
2186 const std::list<octave_value_list>& idx,
int nargout)
2188#if defined (HAVE_JAVA)
2198 if (type.length () > 1 && type[1] ==
'(')
2203 ovl(0) = (idx.front ())(0);
2204 auto it = idx.begin ();
2214 ovl(1) = (idx.front ())(0);
2226 error (
"subsref: Java object cannot be indexed with %c", type[0]);
2230 if (idx.size () > 1 && type.length () > 1)
2231 retval = retval(0).next_subsref (nargout, type, idx, skip);
2237 octave_unused_parameter (type);
2238 octave_unused_parameter (idx);
2239 octave_unused_parameter (nargout);
2251 const std::list<octave_value_list>& idx,
2254#if defined (HAVE_JAVA)
2263 if (type.length () == 1)
2269 ovl(1) = (idx.front ())(0);
2276 else if (type.length () > 2 && type[1] ==
'(')
2278 std::list<octave_value_list> new_idx;
2279 auto it = idx.begin ();
2280 new_idx.push_back (*it++);
2281 new_idx.push_back (*it++);
2284 std::list<octave_value_list> next_idx (idx);
2285 next_idx.erase (next_idx.begin ());
2286 next_idx.erase (next_idx.begin ());
2287 u(0).subsasgn (type.substr (2), next_idx, rhs);
2292 else if (type[1] ==
'.')
2296 std::list<octave_value_list> next_idx (idx);
2297 next_idx.erase (next_idx.begin ());
2298 u(0).subsasgn (type.substr (1), next_idx, rhs);
2304 error (
"invalid indexing/assignment on Java object");
2319 error (
"Java object cannot be indexed with %c", type[0]);
2327 octave_unused_parameter (type);
2328 octave_unused_parameter (idx);
2329 octave_unused_parameter (rhs);
2342#if defined (HAVE_JAVA)
2364#if defined (HAVE_JAVA)
2375 octave_unused_parameter (force);
2376 octave_unused_parameter (type);
2396 os <<
"<Java object: " << m_java_classname << '>
';
2399// FIXME: Need routines to actually save/load java objects through Serialize.
2403octave_java::save_ascii (std::ostream& /* os */)
2405 warning ("save: unable to save java objects, skipping");
2411octave_java::load_ascii (std::istream& /* is */)
2413 // Silently skip over java object that was not saved
2418octave_java::save_binary (std::ostream& /* os */, bool /* save_as_floats */)
2420 warning ("save: unable to save java objects, skipping");
2426octave_java::load_binary (std::istream& /* is */, bool /* swap*/,
2427 octave::mach_info::float_format /* fmt */)
2429 // Silently skip over java object that was not saved
2434octave_java::save_hdf5 (octave_hdf5_id /* loc_id */, const char * /* name */,
2435 bool /* save_as_floats */)
2437 warning ("save: unable to save java objects, skipping");
2443octave_java::load_hdf5 (octave_hdf5_id /* loc_id */, const char * /* name */)
2445 // Silently skip object that was not saved
2450octave_java::do_javaMethod (void *jni_env_arg, const std::string& name,
2451 const octave_value_list& args)
2453#if defined (HAVE_JAVA)
2455 octave_value retval;
2457 JNIEnv *jni_env = TO_JNIENV (jni_env_arg);
2461 jobjectArray_ref arg_objs (jni_env), arg_types (jni_env);
2462 if (unbox (jni_env, args, arg_objs, arg_types))
2464 jclass_ref helperClass (jni_env, find_octave_class (jni_env, "org/octave/ClassHelper"));
2465 jmethodID mID = jni_env->GetStaticMethodID (helperClass, "invokeMethod",
2466 "(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;[Ljava/lang/Class;)Ljava/lang/Object;");
2467 jstring_ref methName (jni_env, jni_env->NewStringUTF (name.c_str ()));
2468 jobjectArray_ref resObj (jni_env, reinterpret_cast<jobjectArray> (jni_env->CallStaticObjectMethod (helperClass, mID,
2469 to_java (), jstring (methName), jobjectArray (arg_objs), jobjectArray (arg_types))));
2471 retval = box (jni_env, resObj);
2473 retval = check_exception (jni_env);
2476 octave_set_default_fpucw ();
2483 octave_unused_parameter (jni_env_arg);
2484 octave_unused_parameter (name);
2485 octave_unused_parameter (args);
2487 // This shouldn't happen because construction of
octave_java objects is
2499#if defined (HAVE_JAVA)
2505 octave_unused_parameter (
name);
2506 octave_unused_parameter (args);
2518 const std::string& class_name,
2519 const std::string&
name,
2522#if defined (HAVE_JAVA)
2526 JNIEnv *jni_env =
TO_JNIENV (jni_env_arg);
2531 if (
unbox (jni_env, args, arg_objs, arg_types))
2535 "org/octave/ClassHelper"));
2536 jmethodID mID = jni_env->GetStaticMethodID (helperClass,
2537 "invokeStaticMethod",
2538 "(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;[Ljava/lang/Class;)Ljava/lang/Object;");
2540 jni_env->NewStringUTF (
name.c_str ()));
2542 jni_env->NewStringUTF (
class_name.c_str ()));
2544 jni_env->CallStaticObjectMethod (helperClass,
2548 jobjectArray (arg_objs),
2549 jobjectArray (arg_types)));
2551 retval =
box (jni_env, resObj);
2563 octave_unused_parameter (jni_env_arg);
2565 octave_unused_parameter (
name);
2566 octave_unused_parameter (args);
2578 const std::string&
name,
2581#if defined (HAVE_JAVA)
2588 octave_unused_parameter (
name);
2589 octave_unused_parameter (args);
2603#if defined (HAVE_JAVA)
2607 JNIEnv *jni_env =
TO_JNIENV (jni_env_arg);
2613 if (
unbox (jni_env, args, arg_objs, arg_types))
2617 "org/octave/ClassHelper"));
2618 jmethodID mID = jni_env->GetStaticMethodID (helperClass,
2619 "invokeConstructor",
2620 "(Ljava/lang/String;[Ljava/lang/Object;[Ljava/lang/Class;)Ljava/lang/Object;");
2622 jni_env->NewStringUTF (
name.c_str ()));
2624 jni_env->CallStaticObjectMethod (helperClass,
2627 jobjectArray (arg_objs),
2628 jobjectArray (arg_types)));
2643 octave_unused_parameter (jni_env_arg);
2644 octave_unused_parameter (
name);
2645 octave_unused_parameter (args);
2659#if defined (HAVE_JAVA)
2665 octave_unused_parameter (
name);
2666 octave_unused_parameter (args);
2679#if defined (HAVE_JAVA)
2683 JNIEnv *jni_env =
TO_JNIENV (jni_env_arg);
2689 "org/octave/ClassHelper"));
2690 jmethodID mID = jni_env->GetStaticMethodID (helperClass,
"getField",
2691 "(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;");
2694 jni_env->CallStaticObjectMethod (helperClass,
2700 retval =
box (jni_env, resObj);
2711 octave_unused_parameter (jni_env_arg);
2712 octave_unused_parameter (
name);
2725#if defined (HAVE_JAVA)
2731 octave_unused_parameter (
name);
2743 const std::string&
name)
2745#if defined (HAVE_JAVA)
2749 JNIEnv *jni_env =
TO_JNIENV (jni_env_arg);
2755 "org/octave/ClassHelper"));
2756 jmethodID mID = jni_env->GetStaticMethodID (helperClass,
2758 "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;");
2762 jni_env->CallStaticObjectMethod (helperClass, mID,
2766 retval =
box (jni_env, resObj);
2777 octave_unused_parameter (jni_env_arg);
2779 octave_unused_parameter (
name);
2791 const std::string&
name)
2793#if defined (HAVE_JAVA)
2800 octave_unused_parameter (
name);
2814#if defined (HAVE_JAVA)
2818 JNIEnv *jni_env =
TO_JNIENV (jni_env_arg);
2825 if (
unbox (jni_env, val, jobj, jcls))
2829 "org/octave/ClassHelper"));
2830 jmethodID mID = jni_env->GetStaticMethodID (helperClass,
"setField",
2831 "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)V");
2833 jni_env->CallStaticObjectMethod (helperClass, mID,
to_java (),
2834 jstring (fName), jobject (jobj));
2845 octave_unused_parameter (jni_env_arg);
2846 octave_unused_parameter (
name);
2847 octave_unused_parameter (val);
2860#if defined (HAVE_JAVA)
2866 octave_unused_parameter (
name);
2867 octave_unused_parameter (val);
2881#if defined (HAVE_JAVA)
2885 JNIEnv *jni_env =
TO_JNIENV (jni_env_arg);
2892 if (
unbox (jni_env, val, jobj, jcls))
2896 "org/octave/ClassHelper"));
2897 jmethodID mID = jni_env->GetStaticMethodID (helperClass,
2899 "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V");
2901 jni_env->NewStringUTF (
class_name.c_str ()));
2903 jni_env->CallStaticObjectMethod (helperClass, mID, jstring (cName),
2904 jstring (fName), jobject (jobj));
2915 octave_unused_parameter (jni_env_arg);
2917 octave_unused_parameter (
name);
2918 octave_unused_parameter (val);
2930 const std::string&
name,
2933#if defined (HAVE_JAVA)
2940 octave_unused_parameter (
name);
2941 octave_unused_parameter (val);
2954#if defined (HAVE_JAVA)
2972 m_java_class = current_env->NewGlobalRef (jclass (ocls));
2979 jmethodID mID = current_env->GetMethodID (clsCls,
2981 "()Ljava/lang/String;");
2990 octave_unused_parameter (jobj_arg);
2991 octave_unused_parameter (jcls_arg);
3004#if defined (HAVE_JAVA)
3030OCTAVE_NAMESPACE_BEGIN
3035DEFUN (__java_init__, , ,
3043#if defined (HAVE_JAVA)
3060DEFUN (__java_exit__, , ,
3069#if defined (HAVE_JAVA)
3082DEFUN (javaObject, args, ,
3102#if defined (HAVE_JAVA)
3104 if (args.length () == 0)
3107 std::string classname = args(0).xstring_value (
"javaObject: CLASSNAME must be a string");
3114 for (
int i=1; i<args.length (); i++)
3121 octave_unused_parameter (args);
3137DEFUN (javaMethod, args, ,
3163#if defined (HAVE_JAVA)
3165 if (args.length () < 2)
3168 std::string methodname = args(0).xstring_value (
"javaMethod: METHODNAME must be a string");
3177 for (
int i=2; i<args.length (); i++)
3180 if (args(1).isjava ())
3183 retval = jobj->
do_javaMethod (current_env, methodname, tmp);
3185 else if (args(1).is_string ())
3191 error (
"javaMethod: OBJ must be a Java object or a string");
3197 octave_unused_parameter (args);
3216DEFUN (__java_get__, args, ,
3238#if defined (HAVE_JAVA)
3240 if (args.length () != 2)
3243 std::string
name = args(1).xstring_value (
"__java_get__: NAME must be a string");
3251 if (args(0).isjava ())
3256 else if (args(0).is_string ())
3262 error (
"__java_get__: OBJ must be a Java object or a string");
3268 octave_unused_parameter (args);
3275DEFUN (__java_set__, args, ,
3298#if defined (HAVE_JAVA)
3300 if (args.length () != 3)
3303 std::string
name = args(1).xstring_value (
"__java_set__: NAME must be a string");
3311 if (args(0).isjava ())
3316 else if (args(0).is_string ())
3322 error (
"__java_set__: OBJ must be a Java object or a string");
3328 octave_unused_parameter (args);
3335DEFUN (__java2mat__, args, ,
3341#if defined (HAVE_JAVA)
3343 if (args.length () != 1)
3352 if (args(0).isjava ())
3358 retval =
ovl (args(0));
3364 octave_unused_parameter (args);
3371DEFUN (java_matrix_autoconversion, args, nargout,
3387#if defined (HAVE_JAVA)
3390 "java_matrix_autoconversion");
3394 octave_unused_parameter (args);
3395 octave_unused_parameter (nargout);
3402DEFUN (java_unsigned_autoconversion, args, nargout,
3419#if defined (HAVE_JAVA)
3422 "java_unsigned_autoconversion");
3426 octave_unused_parameter (args);
3427 octave_unused_parameter (nargout);
3434DEFUN (debug_java, args, nargout,
3449#if defined (HAVE_JAVA)
3455 octave_unused_parameter (args);
3456 octave_unused_parameter (nargout);
3467DEFUN (isjava, args, ,
3474 if (args.length () != 1)
3477 return ovl (args(0).isjava ());
octave_idx_type numel(void) const
Number of elements in the array.
bool isempty(void) const
Size of the specified dimension.
OCTARRAY_API T * fortran_vec(void)
Size of the specified dimension.
void read_java_opts(const std::string &filename)
std::list< std::string > m_java_opts
JavaVMInitArgs * to_args()
void add(const std::string &opt)
Matrix transpose(void) const
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)
bool isvector(void) const
octave_idx_type ndims(void) const
Number of dimensions.
java_local_ref(JNIEnv *env, T obj)
java_local_ref(JNIEnv *env)
static void add_event_hook(event_hook_fcn f)
static std::string path_sep_str(void)
void * search(const std::string &nm, const name_mangler &mangler=name_mangler()) const
std::list< std::string > close(void)
octave_idx_type length(octave_idx_type n=0) const
void set_pos_if_unset(octave_idx_type nd_arg, octave_idx_type dim_arg)
int exit_status(void) const
std::string stdout_output(void) const
static std::string getenv(const std::string &name)
static std::string get_home_directory(void)
static std::string get_current_directory(void)
octave::refcount< octave_idx_type > count
OCTINTERP_API void newline(std::ostream &os) const
static void register_type(void)
friend class octave_value
static const std::string t_name
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)
std::string m_java_classname
void print(std::ostream &os, bool pr_as_read_syntax=false)
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
bool is_java_string(void) const
void * to_java(void) const
octave_value subsasgn(const std::string &type, const std::list< octave_value_list > &idx, const octave_value &rhs)
void init(void *jobj, void *jcls)
std::string class_name(void) const
octave_value_list subsref(const std::string &type, const std::list< octave_value_list > &idx, int nargout)
dim_vector dims(void) const
string_vector map_keys(void) const
octave_value_list & append(const octave_value &val)
octave_idx_type length(void) const
int32NDArray int32_array_value(void) const
bool iscellstr(void) const
OCTINTERP_API std::string xstring_value(const char *fmt,...) const
OCTINTERP_API octave_function * function_value(bool silent=false) const
bool is_uint16_type(void) const
bool is_bool_scalar(void) const
bool is_int8_type(void) const
octave_idx_type rows(void) const
octave_idx_type numel(void) const
bool is_string(void) const
bool is_double_type(void) const
Cell cell_value(void) const
bool is_function_handle(void) const
std::string class_name(void) const
bool is_uint32_type(void) const
octave_idx_type columns(void) const
int8NDArray int8_array_value(void) const
bool is_int64_type(void) const
uint8NDArray uint8_array_value(void) const
std::string string_value(bool force=false) const
Array< std::string > cellstr_value(void) const
bool is_matrix_type(void) const
bool is_int32_type(void) const
bool is_uint64_type(void) const
bool is_int16_type(void) const
bool is_range(void) const
NDArray array_value(bool frc_str_conv=false) const
bool is_real_matrix(void) const
octave_value convert_to_str(bool pad=false, bool force=false, char type='\'') const
bool is_real_scalar(void) const
bool is_undefined(void) const
OCTINTERP_API octave_idx_type length(void) const
bool is_uint8_type(void) const
Matrix matrix_value(bool frc_str_conv=false) const
bool islogical(void) const
dim_vector dims(void) const
string_vector & sort(bool make_uniq=false)
OCTINTERP_API void print_usage(void)
#define DEFUN(name, args_name, nargout_name, doc)
Macro to define a builtin function.
void warning(const char *fmt,...)
void error(const char *fmt,...)
#define panic_impossible()
void err_disabled_feature(const std::string &fcn, const std::string &feature, const std::string &pkg)
void octave_set_default_fpucw(void)
static char * strsave(const char *s)
std::string fcn_file_dir(void)
std::string tilde_expand(const std::string &name)
std::string dir_sep_str(void)
std::ifstream ifstream(const std::string &filename, const std::ios::openmode mode)
OCTINTERP_API octave_value_list feval(const char *name, const octave_value_list &args=octave_value_list(), int nargout=0)
interpreter & __get_interpreter__(const std::string &who)
process_execution_result run_command_and_return_output(const std::string &cmd_str)
return octave_value(v1.char_array_value() . concat(v2.char_array_value(), ra_idx),((a1.is_sq_string()||a2.is_sq_string()) ? '\'' :'"'))
OCTAVE_EXPORT octave_value_list F__java_set__(const octave_value_list &args, int)
static octave_value get_array_elements(JNIEnv *jni_env, jobject jobj, const octave_value_list &idx)
static bool is_auto_convertible_number(JNIEnv *jni_env, jobject jobj)
Return whether jobj shall be automatically converted to an Octave numeric value.
OCTAVE_EXPORT octave_value_list F__java_get__(const octave_value_list &args, int)
static octave_value check_exception(JNIEnv *jni_env)
static octave_value convert_to_string(JNIEnv *jni_env, jobject m_java_object, bool force, char type)
#define BOX_PRIMITIVE_ARRAY(JAVA_TYPE, JAVA_ID, JAVA_TYPE_CAP, OCTAVE_ID)
static std::map< int, octave_value > listener_map
static long octave_thread_ID
The thread id of the currently executing thread or -1 if this is unknown.
static int java_event_hook(void)
Run the java method org.octave.Octave.checkPendingAction().
static string_vector get_invoke_list(JNIEnv *jni_env, void *jobj_arg)
static std::string read_classpath_txt(const std::string &filepath)
Return the classpath in the given file filepath as a string.
JNIEXPORT jboolean JNICALL Java_org_octave_Octave_call(JNIEnv *, jclass, jstring, jobjectArray, jobjectArray)
bool Vjava_unsigned_autoconversion
static std::string get_jvm_lib_path_in_subdir(std::string java_home_path)
java_local_ref< jthrowable > jthrowable_ref
#define UNBOX_PRIMITIVE_SCALAR(OCTAVE_T, METHOD_T, JAVA_T, JAVA_CON)
static bool jvm_attached
Whether the current thread is attached to the jvm given by jvm.
JNIEXPORT jboolean JNICALL Java_org_octave_Octave_needThreadedInvokation(JNIEnv *, jclass)
static jobject make_java_index(JNIEnv *jni_env, const octave_value_list &idx)
static int octave_java_refcount
static JNIEnv * thread_jni_env(void)
}
static dim_vector compute_array_dimensions(JNIEnv *jni_env, jobject obj)
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)
static octave::dynamic_library jvm_lib
Need to keep hold of the shared library handle until exit.
static octave_value box(JNIEnv *jni_env, void *jobj, void *jcls_arg=nullptr)
Convert the Java object pointed to by jobj_arg with class jcls_arg to an Octave value.
java_local_ref< jbyteArray > jbyteArray_ref
static std::map< int, octave_value > octave_ref_map
static OCTAVE_NAMESPACE_END std::string initial_java_dir(void)
The java initialization directory is given by the environment variable OCTAVE_JAVA_DIR if defined; ot...
static void initialize_jvm(void)
Initialize the java virtual machine (jvm) and field jvm if necessary.
static long get_current_thread_ID(JNIEnv *jni_env)
Returns the id of the current thread.
static jclass find_octave_class(JNIEnv *jni_env, const char *name)
static octave_value set_array_elements(JNIEnv *jni_env, jobject jobj, const octave_value_list &idx, const octave_value &rhs)
JNIEXPORT void JNICALL Java_org_octave_Octave_doInvoke(JNIEnv *, jclass, jint, jobjectArray)
static bool unbox(JNIEnv *jni_env, const octave_value &val, jobject_ref &jobj, jclass_ref &jcls)
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
static void terminate_jvm(void)
Terminate the current jvm, if there is any.
static std::string jstring_to_string(JNIEnv *jni_env, jstring s)
Converts a Java string object to std::string.
static JavaVM * jvm
The pointer to a java virtual machine either created in the current thread or attached this thread to...
static void initialize_java(void)
Initialize java including the virtual machine (jvm) if necessary.
java_local_ref< jintArray > jintArray_ref
static octave_value box_more(JNIEnv *jni_env, void *jobj_arg, void *jcls_arg=nullptr)
OCTAVE_EXPORT octave_value_list FjavaMethod(const octave_value_list &args, int)
static std::string initial_class_path(void)
Return the initial classpath.
jint(JNICALL * JNI_GetCreatedJavaVMs_t)(JavaVM **pvm, jsize bufLen, jsize *nVMs)
OCTAVE_NAMESPACE_END typedef void * voidptr
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)