VSM C++ SDK
Vehicle Specific Modules SDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
java.h
1 // Copyright (c) 2018, Smart Projects Holdings Ltd
2 // All rights reserved.
3 // See LICENSE file for license details.
4 
5 #ifndef _UGCS_VSM_JAVA_H_
6 #define _UGCS_VSM_JAVA_H_
7 
8 #include <jni.h>
9 
10 namespace ugcs {
11 namespace vsm {
12 
13 namespace java_internals {
14 
15 #define JAVA_EXCEPTION_CHECK(__env) do { \
16  if (__env->ExceptionCheck()) { \
17  VSM_EXCEPTION(ugcs::vsm::Internal_error_exception, "Java exception occurred"); \
18  } \
19 } while (false)
20 
21 template <typename T_ret>
23 
24 template <>
25 struct MethodCallSelector<void> {
26  template <typename... T_args>
27  static void
28  Call(JNIEnv *env, jobject obj, jmethodID method_id, T_args... args)
29  {
30  env->CallVoidMethod(obj, method_id, args...);
31  JAVA_EXCEPTION_CHECK(env);
32  }
33 };
34 
35 #define __JAVA_CONCAT_(x, y) x ## y
36 #define __JAVA_CONCAT(x, y) __JAVA_CONCAT_(x, y)
37 
38 #define JAVA_DEF_METHOD_SELECTOR(__type, __name) \
39  template <> \
40  struct MethodCallSelector<__type> { \
41  template <typename... T_args> \
42  static __type \
43  Call(JNIEnv *env, jobject obj, jmethodID method_id, T_args... args) \
44  { \
45  __type res = __JAVA_CONCAT( \
46  __JAVA_CONCAT(env->Call, __name), Method)(obj, method_id, args...); \
47  JAVA_EXCEPTION_CHECK(env); \
48  return res; \
49  } \
50  };
51 
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)
61 
62 class ArrayBase {
63 public:
64  ArrayBase(JNIEnv *env, jobject array):
65  env(env), array(reinterpret_cast<jarray>(array))
66  {}
67 
68  void
69  Release()
70  {
71  env->DeleteLocalRef(array);
72  }
73 protected:
74  JNIEnv *env;
75  jarray array;
76 };
77 
78 template <typename T>
79 class PrimitiveArray: public ArrayBase {
80 public:
81  using ArrayBase::ArrayBase;
82 
83  // XXX
84 };
85 
86 class ObjectArray: public ArrayBase {
87 public:
88  using ArrayBase::ArrayBase;
89 
90  size_t
91  Size() const
92  {
93  return env->GetArrayLength(array);
94  }
95 
96  jobject
97  Get(size_t idx)
98  {
99  jobject res = env->GetObjectArrayElement(
100  reinterpret_cast<jobjectArray>(array), idx);
101  JAVA_EXCEPTION_CHECK(env);
102  return res;
103  }
104 
105  jobject
106  operator[](size_t idx)
107  {
108  return Get(idx);
109  }
110 };
111 
112 template <typename T>
115 };
116 
117 template <>
118 class Array<jobject>: public ObjectArray {
119  using ObjectArray::ObjectArray;
120 };
121 
122 } /* namespace java_internals */
123 
124 class Java {
125 public:
126  template <typename T>
128 
129  class Env {
130  public:
131  Env(JNIEnv *env):
132  env(env)
133  {}
134 
135  JNIEnv *
136  operator ->()
137  {
138  return env;
139  }
140 
141  template <typename T_ret, typename... T_args>
142  T_ret
143  CallMethod(jobject obj, const std::string &method_name,
144  const std::string &method_signature, T_args... args)
145  {
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...);
154  }
155 
156  template <typename T_ret, typename... T_args>
157  T_ret
158  CallVsmMethod(const std::string &method_name,
159  const std::string &method_signature, T_args... args)
160  {
161  return CallMethod<T_ret, T_args...>(java_vsm_obj, method_name,
162  method_signature, args...);
163  }
164 
165  template <typename T>
166  Array<T>
167  GetArray(jobject array)
168  {
169  return Array<T>(env, array);
170  }
171 
172  std::string
173  GetString(jobject s)
174  {
175  jboolean isCopy;
176  const char *chars = env->GetStringUTFChars(reinterpret_cast<jstring>(s),
177  &isCopy);
178  if (!chars) {
179  VSM_EXCEPTION(ugcs::vsm::Internal_error_exception,
180  "Failed to get Java string data");
181  }
182  std::string res(chars);
183  env->ReleaseStringUTFChars(reinterpret_cast<jstring>(s), chars);
184  return res;
185  }
186 
187  jstring
188  WrapString(const std::string &s)
189  {
190  return env->NewStringUTF(s.c_str());
191  }
192 
193  private:
194  JNIEnv *env;
195  };
196 
197  static void
198  Initialize(JNIEnv *env, jobject vsm_obj);
199 
201  static void
203 
204  static Env
205  Get_env(JNIEnv *env = nullptr);
206 
207 private:
209  static JavaVM *java_vm;
211  static jobject java_vsm_obj;
212 };
213 
214 } /* namespace vsm */
215 } /* namespace ugcs */
216 
217 #endif /* _UGCS_VSM_JAVA_H_ */
Definition: java.h:124
Definition: java.h:129
Definition: java.h:113
#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.