Clean up some SonarQube warnings (trailing whitespace, etc).
[platform/upstream/iotivity.git] / android / android_api / base / jni / JniOcStack.cpp
1 /*
2 * //******************************************************************
3 * //
4 * // Copyright 2015 Intel Corporation.
5 * //
6 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7 * //
8 * // Licensed under the Apache License, Version 2.0 (the "License");
9 * // you may not use this file except in compliance with the License.
10 * // You may obtain a copy of the License at
11 * //
12 * //      http://www.apache.org/licenses/LICENSE-2.0
13 * //
14 * // Unless required by applicable law or agreed to in writing, software
15 * // distributed under the License is distributed on an "AS IS" BASIS,
16 * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * // See the License for the specific language governing permissions and
18 * // limitations under the License.
19 * //
20 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
21 */
22 #include "JniOcStack.h"
23 #include "OCApi.h"
24 #include "OCPlatform.h"
25 #include "OCRepresentation.h"
26 #include "JniUtils.h"
27
28 JavaVM* g_jvm = NULL;
29
30 jclass g_cls_Integer = NULL;
31 jclass g_cls_int1DArray = NULL;
32 jclass g_cls_int2DArray = NULL;
33 jclass g_cls_Double = NULL;
34 jclass g_cls_double1DArray = NULL;
35 jclass g_cls_double2DArray = NULL;
36 jclass g_cls_Boolean = NULL;
37 jclass g_cls_boolean1DArray = NULL;
38 jclass g_cls_boolean2DArray = NULL;
39 jclass g_cls_String = NULL;
40 jclass g_cls_String1DArray = NULL;
41 jclass g_cls_String2DArray = NULL;
42 jclass g_cls_LinkedList = NULL;
43 jclass g_cls_Map = NULL;
44 jclass g_cls_MapEntry = NULL;
45 jclass g_cls_Set = NULL;
46 jclass g_cls_Iterator = NULL;
47 jclass g_cls_HashMap = NULL;
48 jclass g_cls_OcException = NULL;
49 jclass g_cls_OcResource = NULL;
50 jclass g_cls_OcRepresentation = NULL;
51 jclass g_cls_OcRepresentation1DArray = NULL;
52 jclass g_cls_OcRepresentation2DArray = NULL;
53 jclass g_cls_OcResourceRequest = NULL;
54 jclass g_cls_OcResourceResponse = NULL;
55 jclass g_cls_OcResourceHandle = NULL;
56 jclass g_cls_OcPresenceHandle = NULL;
57 jclass g_cls_OcRequestHandle = NULL;
58 jclass g_cls_OcPresenceStatus = NULL;
59 jclass g_cls_OcHeaderOption = NULL;
60 jclass g_cls_ObservationInfo = NULL;
61 jclass g_cls_OcResourceIdentifier = NULL;
62
63 jmethodID g_mid_Integer_ctor = NULL;
64 jmethodID g_mid_Double_ctor = NULL;
65 jmethodID g_mid_Boolean_ctor = NULL;
66 jmethodID g_mid_LinkedList_ctor = NULL;
67 jmethodID g_mid_LinkedList_add_object = NULL;
68 jmethodID g_mid_Map_entrySet = NULL;
69 jmethodID g_mid_MapEntry_getKey = NULL;
70 jmethodID g_mid_MapEntry_getValue = NULL;
71 jmethodID g_mid_Set_iterator = NULL;
72 jmethodID g_mid_Iterator_hasNext = NULL;
73 jmethodID g_mid_Iterator_next = NULL;
74 jmethodID g_mid_HashMap_ctor = NULL;
75 jmethodID g_mid_HashMap_put = NULL;
76 jmethodID g_mid_OcException_ctor = NULL;
77 jmethodID g_mid_OcException_setNativeExceptionLocation = NULL;
78 jmethodID g_mid_OcResource_ctor = NULL;
79 jmethodID g_mid_OcRepresentation_N_ctor = NULL;
80 jmethodID g_mid_OcRepresentation_N_ctor_bool = NULL;
81 jmethodID g_mid_OcResourceRequest_N_ctor = NULL;
82 jmethodID g_mid_OcResourceResponse_N_ctor = NULL;
83 jmethodID g_mid_OcResourceHandle_N_ctor = NULL;
84 jmethodID g_mid_OcPresenceHandle_N_ctor = NULL;
85 jmethodID g_mid_OcRequestHandle_N_ctor = NULL;
86 jmethodID g_mid_OcHeaderOption_ctor = NULL;
87 jmethodID g_mid_OcHeaderOption_get_id = NULL;
88 jmethodID g_mid_OcHeaderOption_get_data = NULL;
89 jmethodID g_mid_ObservationInfo_N_ctor = NULL;
90 jmethodID g_mid_OcPresenceStatus_get = NULL;
91 jmethodID g_mid_OcResourceIdentifier_N_ctor = NULL;
92
93 jobject getOcException(JNIEnv* env, const char* file, const char* functionName,
94     const int line, const int code, const char* message)
95 {
96     std::string codeStr = JniUtils::stackResultToStr(code);
97     if (codeStr.empty())
98     {
99         codeStr = JniUtils::stackResultToStr(JNI_INVALID_VALUE);
100     }
101     jobject ex = env->NewObject(g_cls_OcException,
102         g_mid_OcException_ctor,
103         env->NewStringUTF(codeStr.c_str()),
104         env->NewStringUTF(message));
105     if (!ex)
106     {
107         return nullptr;
108     }
109     env->CallVoidMethod(ex,
110         g_mid_OcException_setNativeExceptionLocation,
111         env->NewStringUTF(file),
112         env->NewStringUTF(functionName),
113         line);
114     if (env->ExceptionCheck())
115     {
116         return nullptr;
117     }
118     return ex;
119 }
120
121 void throwOcException(JNIEnv* env, jobject ex)
122 {
123     env->Throw((jthrowable)ex);
124 }
125
126 // JNI OnLoad
127 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)
128 {
129     LOGI("JNI_OnLoad");
130     JNIEnv* env;
131     g_jvm = vm;
132
133     if (g_jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)
134     {
135         LOGE("Failed to get the environment using GetEnv()");
136         return JNI_ERR;
137     }
138
139     jclass clazz = nullptr;
140
141     //Integer
142     clazz = env->FindClass("java/lang/Integer");
143     if (!clazz) return JNI_ERR;
144     g_cls_Integer = (jclass)env->NewGlobalRef(clazz);
145     env->DeleteLocalRef(clazz);
146
147     g_mid_Integer_ctor = env->GetMethodID(g_cls_Integer, "<init>", "(I)V");
148     if (!g_mid_Integer_ctor) return JNI_ERR;
149
150     clazz = env->FindClass("[I");
151     if (!clazz) return JNI_ERR;
152     g_cls_int1DArray = (jclass)env->NewGlobalRef(clazz);
153     env->DeleteLocalRef(clazz);
154
155     clazz = env->FindClass("[[I");
156     if (!clazz) return JNI_ERR;
157     g_cls_int2DArray = (jclass)env->NewGlobalRef(clazz);
158     env->DeleteLocalRef(clazz);
159
160     //Double
161     clazz = env->FindClass("java/lang/Double");
162     if (!clazz) return JNI_ERR;
163     g_cls_Double = (jclass)env->NewGlobalRef(clazz);
164     env->DeleteLocalRef(clazz);
165
166     g_mid_Double_ctor = env->GetMethodID(g_cls_Double, "<init>", "(D)V");
167     if (!g_mid_Double_ctor) return JNI_ERR;
168
169     clazz = env->FindClass("[D");
170     if (!clazz) return JNI_ERR;
171     g_cls_double1DArray = (jclass)env->NewGlobalRef(clazz);
172     env->DeleteLocalRef(clazz);
173
174     clazz = env->FindClass("[[D");
175     if (!clazz) return JNI_ERR;
176     g_cls_double2DArray = (jclass)env->NewGlobalRef(clazz);
177     env->DeleteLocalRef(clazz);
178
179     //Boolean
180     clazz = env->FindClass("java/lang/Boolean");
181     if (!clazz) return JNI_ERR;
182     g_cls_Boolean = (jclass)env->NewGlobalRef(clazz);
183     env->DeleteLocalRef(clazz);
184
185     g_mid_Boolean_ctor = env->GetMethodID(g_cls_Boolean, "<init>", "(Z)V");
186     if (!g_mid_Boolean_ctor) return JNI_ERR;
187
188     clazz = env->FindClass("[Z");
189     if (!clazz) return JNI_ERR;
190     g_cls_boolean1DArray = (jclass)env->NewGlobalRef(clazz);
191     env->DeleteLocalRef(clazz);
192
193     clazz = env->FindClass("[[Z");
194     if (!clazz) return JNI_ERR;
195     g_cls_boolean2DArray = (jclass)env->NewGlobalRef(clazz);
196     env->DeleteLocalRef(clazz);
197
198     //String
199     clazz = env->FindClass("java/lang/String");
200     if (!clazz) return JNI_ERR;
201     g_cls_String = (jclass)env->NewGlobalRef(clazz);
202     env->DeleteLocalRef(clazz);
203
204     clazz = env->FindClass("[Ljava/lang/String;");
205     if (!clazz) return JNI_ERR;
206     g_cls_String1DArray = (jclass)env->NewGlobalRef(clazz);
207     env->DeleteLocalRef(clazz);
208
209     clazz = env->FindClass("[[Ljava/lang/String;");
210     if (!clazz) return JNI_ERR;
211     g_cls_String2DArray = (jclass)env->NewGlobalRef(clazz);
212     env->DeleteLocalRef(clazz);
213
214     //LinkedList
215     clazz = env->FindClass("java/util/LinkedList");
216     if (!clazz) return JNI_ERR;
217     g_cls_LinkedList = (jclass)env->NewGlobalRef(clazz);
218     env->DeleteLocalRef(clazz);
219
220     g_mid_LinkedList_ctor = env->GetMethodID(g_cls_LinkedList, "<init>", "()V");
221     if (!g_mid_LinkedList_ctor) return JNI_ERR;
222
223     g_mid_LinkedList_add_object = env->GetMethodID(g_cls_LinkedList, "add", "(Ljava/lang/Object;)Z");
224     if (!g_mid_LinkedList_add_object) return JNI_ERR;
225
226     //Map
227     clazz = env->FindClass("java/util/Map");
228     if (!clazz) return JNI_ERR;
229     g_cls_Map = (jclass)env->NewGlobalRef(clazz);
230     env->DeleteLocalRef(clazz);
231
232     g_mid_Map_entrySet = env->GetMethodID(g_cls_Map, "entrySet", "()Ljava/util/Set;");
233     if (!g_mid_Map_entrySet) return JNI_ERR;
234
235     //MapEntry
236     clazz = env->FindClass("java/util/Map$Entry");
237     if (!clazz) return JNI_ERR;
238     g_cls_MapEntry = (jclass)env->NewGlobalRef(clazz);
239     env->DeleteLocalRef(clazz);
240
241     g_mid_MapEntry_getKey = env->GetMethodID(g_cls_MapEntry, "getKey", "()Ljava/lang/Object;");
242     if (!g_mid_MapEntry_getKey) return JNI_ERR;
243     g_mid_MapEntry_getValue = env->GetMethodID(g_cls_MapEntry, "getValue", "()Ljava/lang/Object;");
244     if (!g_mid_MapEntry_getValue) return JNI_ERR;
245
246     //Set
247     clazz = env->FindClass("java/util/Set");
248     if (!clazz) return JNI_ERR;
249     g_cls_Set = (jclass)env->NewGlobalRef(clazz);
250     env->DeleteLocalRef(clazz);
251
252     g_mid_Set_iterator = env->GetMethodID(g_cls_Set, "iterator", "()Ljava/util/Iterator;");
253     if (!g_mid_Set_iterator) return JNI_ERR;
254
255     //Iterator
256     clazz = env->FindClass("java/util/Iterator");
257     if (!clazz) return JNI_ERR;
258     g_cls_Iterator = (jclass)env->NewGlobalRef(clazz);
259     env->DeleteLocalRef(clazz);
260
261     g_mid_Iterator_hasNext = env->GetMethodID(g_cls_Iterator, "hasNext", "()Z");
262     if (!g_mid_Iterator_hasNext) return JNI_ERR;
263
264     g_mid_Iterator_next = env->GetMethodID(g_cls_Iterator, "next", "()Ljava/lang/Object;");
265     if (!g_mid_Iterator_next) return JNI_ERR;
266
267     //HashMap
268     clazz = env->FindClass("java/util/HashMap");
269     if (!clazz) return JNI_ERR;
270     g_cls_HashMap = (jclass)env->NewGlobalRef(clazz);
271     env->DeleteLocalRef(clazz);
272
273     g_mid_HashMap_ctor = env->GetMethodID(g_cls_HashMap, "<init>", "()V");
274     if (!g_mid_HashMap_ctor) return JNI_ERR;
275
276     g_mid_HashMap_put = env->GetMethodID(g_cls_HashMap, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
277     if (!g_mid_HashMap_put) return JNI_ERR;
278
279     //OcException
280     clazz = env->FindClass("org/iotivity/base/OcException");
281     if (!clazz) return JNI_ERR;
282     g_cls_OcException = (jclass)env->NewGlobalRef(clazz);
283     env->DeleteLocalRef(clazz);
284
285     g_mid_OcException_ctor = env->GetMethodID(g_cls_OcException, "<init>", "(Ljava/lang/String;Ljava/lang/String;)V");
286     if (!g_mid_OcException_ctor) return JNI_ERR;
287
288     g_mid_OcException_setNativeExceptionLocation = env->GetMethodID(g_cls_OcException, "setNativeExceptionLocation",
289         "(Ljava/lang/String;""Ljava/lang/String;""I)V");
290     if (!g_mid_OcException_setNativeExceptionLocation) return JNI_ERR;
291
292     //OcResource
293     clazz = env->FindClass("org/iotivity/base/OcResource");
294     if (!clazz) return JNI_ERR;
295     g_cls_OcResource = (jclass)env->NewGlobalRef(clazz);
296     env->DeleteLocalRef(clazz);
297
298     g_mid_OcResource_ctor = env->GetMethodID(g_cls_OcResource, "<init>", "(J)V");
299     if (!g_mid_OcResource_ctor) return JNI_ERR;
300
301     //OcRepresentation
302     clazz = env->FindClass("org/iotivity/base/OcRepresentation");
303     if (!clazz) return JNI_ERR;
304     g_cls_OcRepresentation = (jclass)env->NewGlobalRef(clazz);
305     env->DeleteLocalRef(clazz);
306
307     g_mid_OcRepresentation_N_ctor = env->GetMethodID(g_cls_OcRepresentation, "<init>", "(J)V");
308     if (!g_mid_OcRepresentation_N_ctor) return JNI_ERR;
309
310     g_mid_OcRepresentation_N_ctor_bool = env->GetMethodID(g_cls_OcRepresentation, "<init>", "(JZ)V");
311     if (!g_mid_OcRepresentation_N_ctor_bool) return JNI_ERR;
312
313     clazz = env->FindClass("[Lorg/iotivity/base/OcRepresentation;");
314     if (!clazz) return JNI_ERR;
315     g_cls_OcRepresentation1DArray = (jclass)env->NewGlobalRef(clazz);
316     env->DeleteLocalRef(clazz);
317
318     clazz = env->FindClass("[[Lorg/iotivity/base/OcRepresentation;");
319     if (!clazz) return JNI_ERR;
320     g_cls_OcRepresentation2DArray = (jclass)env->NewGlobalRef(clazz);
321     env->DeleteLocalRef(clazz);
322
323     //HeaderOptions
324     clazz = env->FindClass("org/iotivity/base/OcHeaderOption");
325     if (!clazz) return JNI_ERR;
326     g_cls_OcHeaderOption = (jclass)env->NewGlobalRef(clazz);
327     env->DeleteLocalRef(clazz);
328     g_mid_OcHeaderOption_ctor = env->GetMethodID(g_cls_OcHeaderOption, "<init>", "(ILjava/lang/String;)V");
329     if (!g_mid_OcHeaderOption_ctor) return JNI_ERR;
330
331     g_mid_OcHeaderOption_get_id = env->GetMethodID(g_cls_OcHeaderOption, "getOptionId", "()I");
332     if (!g_mid_OcHeaderOption_get_id) return JNI_ERR;
333
334     g_mid_OcHeaderOption_get_data = env->GetMethodID(g_cls_OcHeaderOption, "getOptionData", "()Ljava/lang/String;");
335     if (!g_mid_OcHeaderOption_get_data) return JNI_ERR;
336
337     //OcResourceRequest
338     clazz = env->FindClass("org/iotivity/base/OcResourceRequest");
339     if (!clazz) return JNI_ERR;
340     g_cls_OcResourceRequest = (jclass)env->NewGlobalRef(clazz);
341     env->DeleteLocalRef(clazz);
342
343     g_mid_OcResourceRequest_N_ctor = env->GetMethodID(g_cls_OcResourceRequest, "<init>", "(J)V");
344     if (!g_mid_OcResourceRequest_N_ctor) return JNI_ERR;
345
346     //OcResourceResponse
347     clazz = env->FindClass("org/iotivity/base/OcResourceResponse");
348     if (!clazz) return JNI_ERR;
349     g_cls_OcResourceResponse = (jclass)env->NewGlobalRef(clazz);
350     env->DeleteLocalRef(clazz);
351
352     g_mid_OcResourceResponse_N_ctor = env->GetMethodID(g_cls_OcResourceResponse, "<init>", "(J)V");
353     if (!g_mid_OcResourceResponse_N_ctor) return JNI_ERR;
354
355     //OcResourceHandle
356     clazz = env->FindClass("org/iotivity/base/OcResourceHandle");
357     if (!clazz) return JNI_ERR;
358     g_cls_OcResourceHandle = (jclass)env->NewGlobalRef(clazz);
359     env->DeleteLocalRef(clazz);
360     g_mid_OcResourceHandle_N_ctor = env->GetMethodID(g_cls_OcResourceHandle, "<init>", "(J)V");
361     if (!g_mid_OcResourceHandle_N_ctor) return JNI_ERR;
362
363     //OcPresenceHandle
364     clazz = env->FindClass("org/iotivity/base/OcPresenceHandle");
365     if (!clazz) return JNI_ERR;
366     g_cls_OcPresenceHandle = (jclass)env->NewGlobalRef(clazz);
367     env->DeleteLocalRef(clazz);
368     g_mid_OcPresenceHandle_N_ctor = env->GetMethodID(g_cls_OcPresenceHandle, "<init>", "(J)V");
369     if (!g_mid_OcPresenceHandle_N_ctor) return JNI_ERR;
370
371     //OcRequestHandle
372     clazz = env->FindClass("org/iotivity/base/OcRequestHandle");
373     if (!clazz) return JNI_ERR;
374     g_cls_OcRequestHandle = (jclass)env->NewGlobalRef(clazz);
375     env->DeleteLocalRef(clazz);
376     g_mid_OcRequestHandle_N_ctor = env->GetMethodID(g_cls_OcRequestHandle, "<init>", "(J)V");
377     if (!g_mid_OcRequestHandle_N_ctor) return JNI_ERR;
378
379     //OcPresenceStatus
380     clazz = env->FindClass("org/iotivity/base/OcPresenceStatus");
381     if (!clazz) return JNI_ERR;
382     g_cls_OcPresenceStatus = (jclass)env->NewGlobalRef(clazz);
383     env->DeleteLocalRef(clazz);
384     g_mid_OcPresenceStatus_get = env->GetStaticMethodID(g_cls_OcPresenceStatus, "get",
385         "(Ljava/lang/String;)Lorg/iotivity/base/OcPresenceStatus;");
386     if (!g_mid_OcPresenceStatus_get) return JNI_ERR;
387
388     //ObservationInfo
389     clazz = env->FindClass("org/iotivity/base/ObservationInfo");
390     if (!clazz) return JNI_ERR;
391     g_cls_ObservationInfo = (jclass)env->NewGlobalRef(clazz);
392     env->DeleteLocalRef(clazz);
393     g_mid_ObservationInfo_N_ctor = env->GetMethodID(g_cls_ObservationInfo, "<init>", "(IB)V");
394     if (!g_mid_ObservationInfo_N_ctor) return JNI_ERR;
395
396     clazz = env->FindClass("org/iotivity/base/OcResourceIdentifier");
397     if (!clazz) return JNI_ERR;
398     g_cls_OcResourceIdentifier = (jclass)env->NewGlobalRef(clazz);
399     env->DeleteLocalRef(clazz);
400     g_mid_OcResourceIdentifier_N_ctor = env->GetMethodID(g_cls_OcResourceIdentifier, "<init>", "(J)V");
401     if (!g_mid_OcResourceIdentifier_N_ctor) return JNI_ERR;
402
403     return JNI_CURRENT_VERSION;
404 }
405
406 JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved)
407 {
408     LOGI("JNI_OnUnload");
409     JNIEnv* env;
410
411     if (g_jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)
412     {
413         LOGE("Failed to get the environment using GetEnv()");
414         return;
415     }
416
417     env->DeleteGlobalRef(g_cls_Integer);
418     env->DeleteGlobalRef(g_cls_int1DArray);
419     env->DeleteGlobalRef(g_cls_int2DArray);
420     env->DeleteGlobalRef(g_cls_Double);
421     env->DeleteGlobalRef(g_cls_double1DArray);
422     env->DeleteGlobalRef(g_cls_double2DArray);
423     env->DeleteGlobalRef(g_cls_Boolean);
424     env->DeleteGlobalRef(g_cls_boolean1DArray);
425     env->DeleteGlobalRef(g_cls_boolean2DArray);
426     env->DeleteGlobalRef(g_cls_String);
427     env->DeleteGlobalRef(g_cls_String1DArray);
428     env->DeleteGlobalRef(g_cls_String2DArray);
429     env->DeleteGlobalRef(g_cls_LinkedList);
430     env->DeleteGlobalRef(g_cls_Map);
431     env->DeleteGlobalRef(g_cls_MapEntry);
432     env->DeleteGlobalRef(g_cls_Set);
433     env->DeleteGlobalRef(g_cls_Iterator);
434     env->DeleteGlobalRef(g_cls_HashMap);
435     env->DeleteGlobalRef(g_cls_OcResource);
436     env->DeleteGlobalRef(g_cls_OcException);
437     env->DeleteGlobalRef(g_cls_OcRepresentation);
438     env->DeleteGlobalRef(g_cls_OcRepresentation1DArray);
439     env->DeleteGlobalRef(g_cls_OcRepresentation2DArray);
440     env->DeleteGlobalRef(g_cls_OcResourceRequest);
441     env->DeleteGlobalRef(g_cls_OcResourceResponse);
442     env->DeleteGlobalRef(g_cls_OcResourceHandle);
443     env->DeleteGlobalRef(g_cls_OcPresenceHandle);
444     env->DeleteGlobalRef(g_cls_OcRequestHandle);
445     env->DeleteGlobalRef(g_cls_OcPresenceStatus);
446     env->DeleteGlobalRef(g_cls_OcHeaderOption);
447     env->DeleteGlobalRef(g_cls_ObservationInfo);
448     env->DeleteGlobalRef(g_cls_OcResourceIdentifier);
449 }