Android Base API merge to master
[platform/upstream/iotivity.git] / android / android_api / base / jni / JniOcStack.h
1 /*\r
2 * //******************************************************************\r
3 * //\r
4 * // Copyright 2015 Intel Corporation.\r
5 * //\r
6 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
7 * //\r
8 * // Licensed under the Apache License, Version 2.0 (the "License");\r
9 * // you may not use this file except in compliance with the License.\r
10 * // You may obtain a copy of the License at\r
11 * //\r
12 * //      http://www.apache.org/licenses/LICENSE-2.0\r
13 * //\r
14 * // Unless required by applicable law or agreed to in writing, software\r
15 * // distributed under the License is distributed on an "AS IS" BASIS,\r
16 * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
17 * // See the License for the specific language governing permissions and\r
18 * // limitations under the License.\r
19 * //\r
20 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
21 */\r
22 #include <jni.h>\r
23 #include <android/log.h>\r
24 #include "OCApi.h"\r
25 \r
26 #ifndef _Included_org_iotivity_base_ocstack\r
27 #define _Included_org_iotivity_base_ocstack\r
28 \r
29 #define TAG "OIC-JNI"\r
30 \r
31 #define JNI_CURRENT_VERSION JNI_VERSION_1_6\r
32 \r
33 #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)\r
34 #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)\r
35 #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)\r
36 \r
37 #define JNI_EXCEPTION 1000\r
38 #define JNI_NO_NATIVE_POINTER 1001\r
39 #define JNI_INVALID_VALUE 1002\r
40 #define JNI_NO_SUCH_KEY 1003\r
41 \r
42 jobject getOcException(JNIEnv* env, const char* file, const char* functionName, const int line,\r
43     const int code, const char* message);\r
44 void throwOcException(JNIEnv* env, jobject ex);\r
45 #define GetOcException(code, message) getOcException (env,__FILE__,__func__,__LINE__,code,message)\r
46 #define ThrowOcException(code, message) throwOcException (env, GetOcException(code, message))\r
47 \r
48 extern JavaVM* g_jvm;\r
49 \r
50 extern jclass g_cls_Integer;\r
51 extern jclass g_cls_int1DArray;\r
52 extern jclass g_cls_int2DArray;\r
53 extern jclass g_cls_Double;\r
54 extern jclass g_cls_double1DArray;\r
55 extern jclass g_cls_double2DArray;\r
56 extern jclass g_cls_Boolean;\r
57 extern jclass g_cls_boolean1DArray;\r
58 extern jclass g_cls_boolean2DArray;\r
59 extern jclass g_cls_String;\r
60 extern jclass g_cls_String1DArray;\r
61 extern jclass g_cls_String2DArray;\r
62 extern jclass g_cls_LinkedList;\r
63 extern jclass g_cls_Map;\r
64 extern jclass g_cls_MapEntry;\r
65 extern jclass g_cls_Set;\r
66 extern jclass g_cls_Iterator;\r
67 extern jclass g_cls_HashMap;\r
68 extern jclass g_cls_OcException;\r
69 extern jclass g_cls_OcResource;\r
70 extern jclass g_cls_OcRepresentation;\r
71 extern jclass g_cls_OcRepresentation1DArray;\r
72 extern jclass g_cls_OcRepresentation2DArray;\r
73 extern jclass g_cls_OcResourceRequest;\r
74 extern jclass g_cls_OcResourceResponse;\r
75 extern jclass g_cls_OcResourceHandle;\r
76 extern jclass g_cls_OcPresenceHandle;\r
77 extern jclass g_cls_OcRequestHandle;\r
78 extern jclass g_cls_OcPresenceStatus;\r
79 extern jclass g_cls_OcHeaderOption;\r
80 extern jclass g_cls_ObservationInfo;\r
81 extern jclass g_cls_OcResourceIdentifier;\r
82 \r
83 extern jmethodID g_mid_Integer_ctor;\r
84 extern jmethodID g_mid_Double_ctor;\r
85 extern jmethodID g_mid_Boolean_ctor;\r
86 extern jmethodID g_mid_LinkedList_ctor;\r
87 extern jmethodID g_mid_LinkedList_add_object;\r
88 extern jmethodID g_mid_Map_entrySet;\r
89 extern jmethodID g_mid_MapEntry_getKey;\r
90 extern jmethodID g_mid_MapEntry_getValue;\r
91 extern jmethodID g_mid_Set_iterator;\r
92 extern jmethodID g_mid_Iterator_hasNext;\r
93 extern jmethodID g_mid_Iterator_next;\r
94 extern jmethodID g_mid_HashMap_ctor;\r
95 extern jmethodID g_mid_HashMap_put;\r
96 extern jmethodID g_mid_OcException_ctor;\r
97 extern jmethodID g_mid_OcException_setNativeExceptionLocation;\r
98 extern jmethodID g_mid_OcResource_ctor;\r
99 extern jmethodID g_mid_OcRepresentation_N_ctor;\r
100 extern jmethodID g_mid_OcRepresentation_N_ctor_bool;\r
101 extern jmethodID g_mid_OcResourceRequest_N_ctor;\r
102 extern jmethodID g_mid_OcResourceResponse_N_ctor;\r
103 extern jmethodID g_mid_OcResourceHandle_N_ctor;\r
104 extern jmethodID g_mid_OcPresenceHandle_N_ctor;\r
105 extern jmethodID g_mid_OcRequestHandle_N_ctor;\r
106 extern jmethodID g_mid_OcHeaderOption_ctor;\r
107 extern jmethodID g_mid_OcHeaderOption_get_id;\r
108 extern jmethodID g_mid_OcHeaderOption_get_data;\r
109 extern jmethodID g_mid_ObservationInfo_N_ctor;\r
110 extern jmethodID g_mid_OcPresenceStatus_get;\r
111 extern jmethodID g_mid_OcResourceIdentifier_N_ctor;\r
112 \r
113 typedef void(*RemoveListenerCallback)(JNIEnv* env, jobject jListener);\r
114 \r
115 static jfieldID GetHandleField(JNIEnv *env, jobject jobj)\r
116 {\r
117     jclass cls = env->GetObjectClass(jobj);\r
118     return env->GetFieldID(cls, "mNativeHandle", "J");\r
119 }\r
120 \r
121 template <typename T>\r
122 static T *GetHandle(JNIEnv *env, jobject jobj)\r
123 {\r
124     jlong handle = env->GetLongField(jobj, GetHandleField(env, jobj));\r
125     return reinterpret_cast<T *>(handle);\r
126 }\r
127 \r
128 template <typename T>\r
129 static void SetHandle(JNIEnv *env, jobject jobj, T *type)\r
130 {\r
131     jlong handle = reinterpret_cast<jlong>(type);\r
132 \r
133     env->SetLongField(jobj, GetHandleField(env, jobj), handle);\r
134 }\r
135 \r
136 static JNIEnv* GetJNIEnv(jint& ret)\r
137 {\r
138     JNIEnv *env = NULL;\r
139 \r
140     ret = g_jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION);\r
141     switch (ret) {\r
142     case JNI_OK:\r
143         return env;\r
144     case JNI_EDETACHED:\r
145         if (g_jvm->AttachCurrentThread(&env, NULL) < 0)\r
146         {\r
147             LOGE("Failed to get the environment");\r
148             return nullptr;\r
149         }\r
150         else\r
151         {\r
152             return env;\r
153         }\r
154 \r
155     case JNI_EVERSION:\r
156         LOGE("JNI version not supported");\r
157     default:\r
158         LOGE("Failed to get the environment");\r
159         return nullptr;\r
160     }\r
161 }\r
162 \r
163 static void DuplicateString(char ** targetString, std::string sourceString)\r
164 {\r
165     *targetString = new char[sourceString.length() + 1];\r
166     strncpy(*targetString, sourceString.c_str(), (sourceString.length() + 1));\r
167 }\r
168 \r
169 #endif // _Included_org_iotivity_base_ocstack