VSM C++ SDK
Vehicle Specific Modules SDK
java.h
1 // Copyright (c) 2014, Smart Projects Holdings Ltd
2 // All rights reserved.
3 // See LICENSE file for license details.
4 
5 #ifndef JAVA_H_
6 #define 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 
127  template <typename T>
129 
130  class Env {
131  public:
132  Env(JNIEnv *env):
133  env(env)
134  {}
135 
136  JNIEnv *
137  operator ->()
138  {
139  return env;
140  }
141 
142  template <typename T_ret, typename... T_args>
143  T_ret
144  CallMethod(jobject obj, const std::string &method_name,
145  const std::string &method_signature, T_args... args)
146  {
147  jclass cls = env->GetObjectClass(obj);
148  JAVA_EXCEPTION_CHECK(env);
149  jmethodID mid = env->GetMethodID(cls, method_name.c_str(),
150  method_signature.c_str());
151  JAVA_EXCEPTION_CHECK(env);
152  env->DeleteLocalRef(cls);
154  (env, obj, mid, args...);
155  }
156 
157  template <typename T_ret, typename... T_args>
158  T_ret
159  CallVsmMethod(const std::string &method_name,
160  const std::string &method_signature, T_args... args)
161  {
162  return CallMethod<T_ret, T_args...>(java_vsm_obj, method_name,
163  method_signature, args...);
164  }
165 
166  template <typename T>
167  Array<T>
168  GetArray(jobject array)
169  {
170  return Array<T>(env, array);
171  }
172 
173  std::string
174  GetString(jobject s)
175  {
176  jboolean isCopy;
177  const char *chars = env->GetStringUTFChars(reinterpret_cast<jstring>(s),
178  &isCopy);
179  if (!chars) {
181  "Failed to get Java string data");
182  }
183  std::string res(chars);
184  env->ReleaseStringUTFChars(reinterpret_cast<jstring>(s), chars);
185  return res;
186  }
187 
188  jstring
189  WrapString(const std::string &s)
190  {
191  return env->NewStringUTF(s.c_str());
192  }
193 
194  private:
195  JNIEnv *env;
196  };
197 
198  static void
199  Initialize(JNIEnv *env, jobject vsm_obj);
200 
202  static void
203  Detach_current_thread();
204 
205  static Env
206  Get_env(JNIEnv *env = nullptr);
207 
208 private:
210  static JavaVM *java_vm;
212  static jobject java_vsm_obj;
213 };
214 
215 } /* namespace vsm */
216 } /* namespace ugcs */
217 
218 #endif /* JAVA_H_ */
UGCS root namespace.
Definition: android-linux/ugcs/vsm/platform_sockets.h:27
Exception class with one parameter.
Definition: exception.h:88
Definition: java.h:124
void Initialize(const std::string &props_file="vsm.conf")
Initialize VSM SDK.
Definition: java.h:130
T Get() const
Get the value of underlying type.
Definition: endian.h:324
Definition: java.h:113
#define VSM_EXCEPTION(__exc_class, __msg,...)
Throw VSM exception instance.
Definition: exception.h:170