5 #ifndef _UGCS_VSM_JAVA_H_
6 #define _UGCS_VSM_JAVA_H_
13 namespace java_internals {
15 #define JAVA_EXCEPTION_CHECK(__env) do { \
16 if (__env->ExceptionCheck()) { \
17 VSM_EXCEPTION(ugcs::vsm::Internal_error_exception, "Java exception occurred"); \
21 template <
typename T_ret>
26 template <
typename... T_args>
28 Call(JNIEnv *env, jobject obj, jmethodID method_id, T_args... args)
30 env->CallVoidMethod(obj, method_id, args...);
31 JAVA_EXCEPTION_CHECK(env);
35 #define __JAVA_CONCAT_(x, y) x ## y
36 #define __JAVA_CONCAT(x, y) __JAVA_CONCAT_(x, y)
38 #define JAVA_DEF_METHOD_SELECTOR(__type, __name) \
40 struct MethodCallSelector<__type> { \
41 template <typename... T_args> \
43 Call(JNIEnv *env, jobject obj, jmethodID method_id, T_args... args) \
45 __type res = __JAVA_CONCAT( \
46 __JAVA_CONCAT(env->Call, __name), Method)(obj, method_id, args...); \
47 JAVA_EXCEPTION_CHECK(env); \
52 JAVA_DEF_METHOD_SELECTOR(jobject, Object)
53 JAVA_DEF_METHOD_SELECTOR(jboolean, Boolean)
54 JAVA_DEF_METHOD_SELECTOR(jbyte, Byte)
55 JAVA_DEF_METHOD_SELECTOR(jchar,
Char)
56 JAVA_DEF_METHOD_SELECTOR(jshort, Short)
57 JAVA_DEF_METHOD_SELECTOR(jint, Int)
58 JAVA_DEF_METHOD_SELECTOR(jlong, Long)
59 JAVA_DEF_METHOD_SELECTOR(jfloat, Float)
60 JAVA_DEF_METHOD_SELECTOR(jdouble, Double)
64 ArrayBase(JNIEnv *env, jobject array):
65 env(env), array(reinterpret_cast<jarray>(array))
71 env->DeleteLocalRef(array);
81 using ArrayBase::ArrayBase;
88 using ArrayBase::ArrayBase;
93 return env->GetArrayLength(array);
99 jobject res = env->GetObjectArrayElement(
100 reinterpret_cast<jobjectArray>(array), idx);
101 JAVA_EXCEPTION_CHECK(env);
106 operator[](
size_t idx)
112 template <
typename T>
119 using ObjectArray::ObjectArray;
126 template <
typename T>
141 template <
typename T_ret,
typename... T_args>
143 CallMethod(jobject obj,
const std::string &method_name,
144 const std::string &method_signature, T_args... args)
146 jclass cls = env->GetObjectClass(obj);
147 JAVA_EXCEPTION_CHECK(env);
148 jmethodID mid = env->GetMethodID(cls, method_name.c_str(),
149 method_signature.c_str());
150 JAVA_EXCEPTION_CHECK(env);
151 env->DeleteLocalRef(cls);
153 (env, obj, mid, args...);
156 template <
typename T_ret,
typename... T_args>
158 CallVsmMethod(
const std::string &method_name,
159 const std::string &method_signature, T_args... args)
161 return CallMethod<T_ret, T_args...>(java_vsm_obj, method_name,
162 method_signature, args...);
165 template <
typename T>
167 GetArray(jobject array)
176 const char *chars = env->GetStringUTFChars(reinterpret_cast<jstring>(s),
180 "Failed to get Java string data");
182 std::string res(chars);
183 env->ReleaseStringUTFChars(reinterpret_cast<jstring>(s), chars);
188 WrapString(
const std::string &s)
190 return env->NewStringUTF(s.c_str());
198 Initialize(JNIEnv *env, jobject vsm_obj);
205 Get_env(JNIEnv *env =
nullptr);
209 static JavaVM *java_vm;
211 static jobject java_vsm_obj;
Value< int8_t, CHAR > Char
Value containers for all MAVLink types.
Definition: mavlink.h:178
#define VSM_EXCEPTION(__exc_class, __msg,...)
Throw VSM exception instance.
Definition: exception.h:168
static void Detach_current_thread()
Must be called before attached to VM thread is exiting.