Imported Upstream version 1.1.0
[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 = nullptr;
29
30 jclass g_cls_Integer = nullptr;
31 jclass g_cls_int1DArray = nullptr;
32 jclass g_cls_int2DArray = nullptr;
33 jclass g_cls_Double = nullptr;
34 jclass g_cls_double1DArray = nullptr;
35 jclass g_cls_double2DArray = nullptr;
36 jclass g_cls_Boolean = nullptr;
37 jclass g_cls_boolean1DArray = nullptr;
38 jclass g_cls_boolean2DArray = nullptr;
39 jclass g_cls_String = nullptr;
40 jclass g_cls_String1DArray = nullptr;
41 jclass g_cls_String2DArray = nullptr;
42 jclass g_cls_LinkedList = nullptr;
43 jclass g_cls_Map = nullptr;
44 jclass g_cls_MapEntry = nullptr;
45 jclass g_cls_Set = nullptr;
46 jclass g_cls_Iterator = nullptr;
47 jclass g_cls_HashMap = nullptr;
48 jclass g_cls_OcException = nullptr;
49 jclass g_cls_OcResource = nullptr;
50 jclass g_cls_OcRepresentation = nullptr;
51 jclass g_cls_OcRepresentation1DArray = nullptr;
52 jclass g_cls_OcRepresentation2DArray = nullptr;
53 jclass g_cls_OcResourceRequest = nullptr;
54 jclass g_cls_OcResourceResponse = nullptr;
55 jclass g_cls_OcResourceHandle = nullptr;
56 jclass g_cls_OcPresenceHandle = nullptr;
57 jclass g_cls_OcRequestHandle = nullptr;
58 jclass g_cls_OcPresenceStatus = nullptr;
59 jclass g_cls_OcHeaderOption = nullptr;
60 jclass g_cls_ObservationInfo = nullptr;
61 jclass g_cls_OcResourceIdentifier = nullptr;
62 jclass g_cls_OcProvisionResult = nullptr;
63 jclass g_cls_OcSecureResource = nullptr;
64 jclass g_cls_OcOicSecAcl = nullptr;
65
66 jmethodID g_mid_Integer_ctor = nullptr;
67 jmethodID g_mid_Double_ctor = nullptr;
68 jmethodID g_mid_Boolean_ctor = nullptr;
69 jmethodID g_mid_LinkedList_ctor = nullptr;
70 jmethodID g_mid_LinkedList_add_object = nullptr;
71 jmethodID g_mid_Map_entrySet = nullptr;
72 jmethodID g_mid_MapEntry_getKey = nullptr;
73 jmethodID g_mid_MapEntry_getValue = nullptr;
74 jmethodID g_mid_Set_iterator = nullptr;
75 jmethodID g_mid_Iterator_hasNext = nullptr;
76 jmethodID g_mid_Iterator_next = nullptr;
77 jmethodID g_mid_HashMap_ctor = nullptr;
78 jmethodID g_mid_HashMap_put = nullptr;
79 jmethodID g_mid_OcException_ctor = nullptr;
80 jmethodID g_mid_OcException_setNativeExceptionLocation = nullptr;
81 jmethodID g_mid_OcResource_ctor = nullptr;
82 jmethodID g_mid_OcRepresentation_N_ctor = nullptr;
83 jmethodID g_mid_OcRepresentation_N_ctor_bool = nullptr;
84 jmethodID g_mid_OcResourceRequest_N_ctor = nullptr;
85 jmethodID g_mid_OcResourceResponse_N_ctor = nullptr;
86 jmethodID g_mid_OcResourceHandle_N_ctor = nullptr;
87 jmethodID g_mid_OcPresenceHandle_N_ctor = nullptr;
88 jmethodID g_mid_OcRequestHandle_N_ctor = nullptr;
89 jmethodID g_mid_OcHeaderOption_ctor = nullptr;
90 jmethodID g_mid_OcHeaderOption_get_id = nullptr;
91 jmethodID g_mid_OcHeaderOption_get_data = nullptr;
92 jmethodID g_mid_ObservationInfo_N_ctor = nullptr;
93 jmethodID g_mid_OcPresenceStatus_get = nullptr;
94 jmethodID g_mid_OcResourceIdentifier_N_ctor = nullptr;
95 jmethodID g_mid_OcProvisionResult_ctor = nullptr;
96 jmethodID g_mid_OcSecureResource_ctor = nullptr;
97
98 jmethodID g_mid_OcOicSecAcl_get_subject = nullptr;
99 jmethodID g_mid_OcOicSecAcl_get_resources_cnt = nullptr;
100 jmethodID g_mid_OcOicSecAcl_get_resources = nullptr;
101 jmethodID g_mid_OcOicSecAcl_get_permission = nullptr;
102 jmethodID g_mid_OcOicSecAcl_get_periods_cnt = nullptr;
103 jmethodID g_mid_OcOicSecAcl_get_periods = nullptr;
104 jmethodID g_mid_OcOicSecAcl_get_recurrences = nullptr;
105 jmethodID g_mid_OcOicSecAcl_get_rownerID = nullptr;
106
107 jobject getOcException(JNIEnv* env, const char* file, const char* functionName,
108     const int line, const int code, const char* message)
109 {
110     std::string codeStr = JniUtils::stackResultToStr(code);
111     if (codeStr.empty())
112     {
113         codeStr = JniUtils::stackResultToStr(JNI_INVALID_VALUE);
114     }
115     jobject ex = env->NewObject(g_cls_OcException,
116         g_mid_OcException_ctor,
117         env->NewStringUTF(codeStr.c_str()),
118         env->NewStringUTF(message));
119     if (!ex)
120     {
121         return nullptr;
122     }
123     env->CallVoidMethod(ex,
124         g_mid_OcException_setNativeExceptionLocation,
125         env->NewStringUTF(file),
126         env->NewStringUTF(functionName),
127         line);
128     if (env->ExceptionCheck())
129     {
130         return nullptr;
131     }
132     return ex;
133 }
134
135 void throwOcException(JNIEnv* env, jobject ex)
136 {
137     env->Throw((jthrowable)ex);
138 }
139
140 // JNI OnLoad
141 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)
142 {
143     LOGI("JNI_OnLoad");
144     JNIEnv* env;
145     g_jvm = vm;
146
147     if (g_jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)
148     {
149         LOGE("Failed to get the environment using GetEnv()");
150         return JNI_ERR;
151     }
152
153     jclass clazz = nullptr;
154
155     //Integer
156     clazz = env->FindClass("java/lang/Integer");
157     if (!clazz) return JNI_ERR;
158     g_cls_Integer = (jclass)env->NewGlobalRef(clazz);
159     env->DeleteLocalRef(clazz);
160
161     g_mid_Integer_ctor = env->GetMethodID(g_cls_Integer, "<init>", "(I)V");
162     if (!g_mid_Integer_ctor) return JNI_ERR;
163
164     clazz = env->FindClass("[I");
165     if (!clazz) return JNI_ERR;
166     g_cls_int1DArray = (jclass)env->NewGlobalRef(clazz);
167     env->DeleteLocalRef(clazz);
168
169     clazz = env->FindClass("[[I");
170     if (!clazz) return JNI_ERR;
171     g_cls_int2DArray = (jclass)env->NewGlobalRef(clazz);
172     env->DeleteLocalRef(clazz);
173
174     //Double
175     clazz = env->FindClass("java/lang/Double");
176     if (!clazz) return JNI_ERR;
177     g_cls_Double = (jclass)env->NewGlobalRef(clazz);
178     env->DeleteLocalRef(clazz);
179
180     g_mid_Double_ctor = env->GetMethodID(g_cls_Double, "<init>", "(D)V");
181     if (!g_mid_Double_ctor) return JNI_ERR;
182
183     clazz = env->FindClass("[D");
184     if (!clazz) return JNI_ERR;
185     g_cls_double1DArray = (jclass)env->NewGlobalRef(clazz);
186     env->DeleteLocalRef(clazz);
187
188     clazz = env->FindClass("[[D");
189     if (!clazz) return JNI_ERR;
190     g_cls_double2DArray = (jclass)env->NewGlobalRef(clazz);
191     env->DeleteLocalRef(clazz);
192
193     //Boolean
194     clazz = env->FindClass("java/lang/Boolean");
195     if (!clazz) return JNI_ERR;
196     g_cls_Boolean = (jclass)env->NewGlobalRef(clazz);
197     env->DeleteLocalRef(clazz);
198
199     g_mid_Boolean_ctor = env->GetMethodID(g_cls_Boolean, "<init>", "(Z)V");
200     if (!g_mid_Boolean_ctor) return JNI_ERR;
201
202     clazz = env->FindClass("[Z");
203     if (!clazz) return JNI_ERR;
204     g_cls_boolean1DArray = (jclass)env->NewGlobalRef(clazz);
205     env->DeleteLocalRef(clazz);
206
207     clazz = env->FindClass("[[Z");
208     if (!clazz) return JNI_ERR;
209     g_cls_boolean2DArray = (jclass)env->NewGlobalRef(clazz);
210     env->DeleteLocalRef(clazz);
211
212     //String
213     clazz = env->FindClass("java/lang/String");
214     if (!clazz) return JNI_ERR;
215     g_cls_String = (jclass)env->NewGlobalRef(clazz);
216     env->DeleteLocalRef(clazz);
217
218     clazz = env->FindClass("[Ljava/lang/String;");
219     if (!clazz) return JNI_ERR;
220     g_cls_String1DArray = (jclass)env->NewGlobalRef(clazz);
221     env->DeleteLocalRef(clazz);
222
223     clazz = env->FindClass("[[Ljava/lang/String;");
224     if (!clazz) return JNI_ERR;
225     g_cls_String2DArray = (jclass)env->NewGlobalRef(clazz);
226     env->DeleteLocalRef(clazz);
227
228     //LinkedList
229     clazz = env->FindClass("java/util/LinkedList");
230     if (!clazz) return JNI_ERR;
231     g_cls_LinkedList = (jclass)env->NewGlobalRef(clazz);
232     env->DeleteLocalRef(clazz);
233
234     g_mid_LinkedList_ctor = env->GetMethodID(g_cls_LinkedList, "<init>", "()V");
235     if (!g_mid_LinkedList_ctor) return JNI_ERR;
236
237     g_mid_LinkedList_add_object = env->GetMethodID(g_cls_LinkedList, "add", "(Ljava/lang/Object;)Z");
238     if (!g_mid_LinkedList_add_object) return JNI_ERR;
239
240     //Map
241     clazz = env->FindClass("java/util/Map");
242     if (!clazz) return JNI_ERR;
243     g_cls_Map = (jclass)env->NewGlobalRef(clazz);
244     env->DeleteLocalRef(clazz);
245
246     g_mid_Map_entrySet = env->GetMethodID(g_cls_Map, "entrySet", "()Ljava/util/Set;");
247     if (!g_mid_Map_entrySet) return JNI_ERR;
248
249     //MapEntry
250     clazz = env->FindClass("java/util/Map$Entry");
251     if (!clazz) return JNI_ERR;
252     g_cls_MapEntry = (jclass)env->NewGlobalRef(clazz);
253     env->DeleteLocalRef(clazz);
254
255     g_mid_MapEntry_getKey = env->GetMethodID(g_cls_MapEntry, "getKey", "()Ljava/lang/Object;");
256     if (!g_mid_MapEntry_getKey) return JNI_ERR;
257     g_mid_MapEntry_getValue = env->GetMethodID(g_cls_MapEntry, "getValue", "()Ljava/lang/Object;");
258     if (!g_mid_MapEntry_getValue) return JNI_ERR;
259
260     //Set
261     clazz = env->FindClass("java/util/Set");
262     if (!clazz) return JNI_ERR;
263     g_cls_Set = (jclass)env->NewGlobalRef(clazz);
264     env->DeleteLocalRef(clazz);
265
266     g_mid_Set_iterator = env->GetMethodID(g_cls_Set, "iterator", "()Ljava/util/Iterator;");
267     if (!g_mid_Set_iterator) return JNI_ERR;
268
269     //Iterator
270     clazz = env->FindClass("java/util/Iterator");
271     if (!clazz) return JNI_ERR;
272     g_cls_Iterator = (jclass)env->NewGlobalRef(clazz);
273     env->DeleteLocalRef(clazz);
274
275     g_mid_Iterator_hasNext = env->GetMethodID(g_cls_Iterator, "hasNext", "()Z");
276     if (!g_mid_Iterator_hasNext) return JNI_ERR;
277
278     g_mid_Iterator_next = env->GetMethodID(g_cls_Iterator, "next", "()Ljava/lang/Object;");
279     if (!g_mid_Iterator_next) return JNI_ERR;
280
281     //HashMap
282     clazz = env->FindClass("java/util/HashMap");
283     if (!clazz) return JNI_ERR;
284     g_cls_HashMap = (jclass)env->NewGlobalRef(clazz);
285     env->DeleteLocalRef(clazz);
286
287     g_mid_HashMap_ctor = env->GetMethodID(g_cls_HashMap, "<init>", "()V");
288     if (!g_mid_HashMap_ctor) return JNI_ERR;
289
290     g_mid_HashMap_put = env->GetMethodID(g_cls_HashMap, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
291     if (!g_mid_HashMap_put) return JNI_ERR;
292
293     //OcException
294     clazz = env->FindClass("org/iotivity/base/OcException");
295     if (!clazz) return JNI_ERR;
296     g_cls_OcException = (jclass)env->NewGlobalRef(clazz);
297     env->DeleteLocalRef(clazz);
298
299     g_mid_OcException_ctor = env->GetMethodID(g_cls_OcException, "<init>", "(Ljava/lang/String;Ljava/lang/String;)V");
300     if (!g_mid_OcException_ctor) return JNI_ERR;
301
302     g_mid_OcException_setNativeExceptionLocation = env->GetMethodID(g_cls_OcException, "setNativeExceptionLocation",
303         "(Ljava/lang/String;""Ljava/lang/String;""I)V");
304     if (!g_mid_OcException_setNativeExceptionLocation) return JNI_ERR;
305
306     //OcResource
307     clazz = env->FindClass("org/iotivity/base/OcResource");
308     if (!clazz) return JNI_ERR;
309     g_cls_OcResource = (jclass)env->NewGlobalRef(clazz);
310     env->DeleteLocalRef(clazz);
311
312     g_mid_OcResource_ctor = env->GetMethodID(g_cls_OcResource, "<init>", "(J)V");
313     if (!g_mid_OcResource_ctor) return JNI_ERR;
314
315     //OcRepresentation
316     clazz = env->FindClass("org/iotivity/base/OcRepresentation");
317     if (!clazz) return JNI_ERR;
318     g_cls_OcRepresentation = (jclass)env->NewGlobalRef(clazz);
319     env->DeleteLocalRef(clazz);
320
321     g_mid_OcRepresentation_N_ctor = env->GetMethodID(g_cls_OcRepresentation, "<init>", "(J)V");
322     if (!g_mid_OcRepresentation_N_ctor) return JNI_ERR;
323
324     g_mid_OcRepresentation_N_ctor_bool = env->GetMethodID(g_cls_OcRepresentation, "<init>", "(JZ)V");
325     if (!g_mid_OcRepresentation_N_ctor_bool) return JNI_ERR;
326
327     clazz = env->FindClass("[Lorg/iotivity/base/OcRepresentation;");
328     if (!clazz) return JNI_ERR;
329     g_cls_OcRepresentation1DArray = (jclass)env->NewGlobalRef(clazz);
330     env->DeleteLocalRef(clazz);
331
332     clazz = env->FindClass("[[Lorg/iotivity/base/OcRepresentation;");
333     if (!clazz) return JNI_ERR;
334     g_cls_OcRepresentation2DArray = (jclass)env->NewGlobalRef(clazz);
335     env->DeleteLocalRef(clazz);
336
337     //HeaderOptions
338     clazz = env->FindClass("org/iotivity/base/OcHeaderOption");
339     if (!clazz) return JNI_ERR;
340     g_cls_OcHeaderOption = (jclass)env->NewGlobalRef(clazz);
341     env->DeleteLocalRef(clazz);
342     g_mid_OcHeaderOption_ctor = env->GetMethodID(g_cls_OcHeaderOption, "<init>", "(ILjava/lang/String;)V");
343     if (!g_mid_OcHeaderOption_ctor) return JNI_ERR;
344
345     g_mid_OcHeaderOption_get_id = env->GetMethodID(g_cls_OcHeaderOption, "getOptionId", "()I");
346     if (!g_mid_OcHeaderOption_get_id) return JNI_ERR;
347
348     g_mid_OcHeaderOption_get_data = env->GetMethodID(g_cls_OcHeaderOption, "getOptionData", "()Ljava/lang/String;");
349     if (!g_mid_OcHeaderOption_get_data) return JNI_ERR;
350
351     //OcResourceRequest
352     clazz = env->FindClass("org/iotivity/base/OcResourceRequest");
353     if (!clazz) return JNI_ERR;
354     g_cls_OcResourceRequest = (jclass)env->NewGlobalRef(clazz);
355     env->DeleteLocalRef(clazz);
356
357     g_mid_OcResourceRequest_N_ctor = env->GetMethodID(g_cls_OcResourceRequest, "<init>", "(J)V");
358     if (!g_mid_OcResourceRequest_N_ctor) return JNI_ERR;
359
360     //OcResourceResponse
361     clazz = env->FindClass("org/iotivity/base/OcResourceResponse");
362     if (!clazz) return JNI_ERR;
363     g_cls_OcResourceResponse = (jclass)env->NewGlobalRef(clazz);
364     env->DeleteLocalRef(clazz);
365
366     g_mid_OcResourceResponse_N_ctor = env->GetMethodID(g_cls_OcResourceResponse, "<init>", "(J)V");
367     if (!g_mid_OcResourceResponse_N_ctor) return JNI_ERR;
368
369     //OcResourceHandle
370     clazz = env->FindClass("org/iotivity/base/OcResourceHandle");
371     if (!clazz) return JNI_ERR;
372     g_cls_OcResourceHandle = (jclass)env->NewGlobalRef(clazz);
373     env->DeleteLocalRef(clazz);
374     g_mid_OcResourceHandle_N_ctor = env->GetMethodID(g_cls_OcResourceHandle, "<init>", "(J)V");
375     if (!g_mid_OcResourceHandle_N_ctor) return JNI_ERR;
376
377     //OcPresenceHandle
378     clazz = env->FindClass("org/iotivity/base/OcPresenceHandle");
379     if (!clazz) return JNI_ERR;
380     g_cls_OcPresenceHandle = (jclass)env->NewGlobalRef(clazz);
381     env->DeleteLocalRef(clazz);
382     g_mid_OcPresenceHandle_N_ctor = env->GetMethodID(g_cls_OcPresenceHandle, "<init>", "(J)V");
383     if (!g_mid_OcPresenceHandle_N_ctor) return JNI_ERR;
384
385     //OcRequestHandle
386     clazz = env->FindClass("org/iotivity/base/OcRequestHandle");
387     if (!clazz) return JNI_ERR;
388     g_cls_OcRequestHandle = (jclass)env->NewGlobalRef(clazz);
389     env->DeleteLocalRef(clazz);
390     g_mid_OcRequestHandle_N_ctor = env->GetMethodID(g_cls_OcRequestHandle, "<init>", "(J)V");
391     if (!g_mid_OcRequestHandle_N_ctor) return JNI_ERR;
392
393     //OcPresenceStatus
394     clazz = env->FindClass("org/iotivity/base/OcPresenceStatus");
395     if (!clazz) return JNI_ERR;
396     g_cls_OcPresenceStatus = (jclass)env->NewGlobalRef(clazz);
397     env->DeleteLocalRef(clazz);
398     g_mid_OcPresenceStatus_get = env->GetStaticMethodID(g_cls_OcPresenceStatus, "get",
399         "(Ljava/lang/String;)Lorg/iotivity/base/OcPresenceStatus;");
400     if (!g_mid_OcPresenceStatus_get) return JNI_ERR;
401
402     //ObservationInfo
403     clazz = env->FindClass("org/iotivity/base/ObservationInfo");
404     if (!clazz) return JNI_ERR;
405     g_cls_ObservationInfo = (jclass)env->NewGlobalRef(clazz);
406     env->DeleteLocalRef(clazz);
407     g_mid_ObservationInfo_N_ctor = env->GetMethodID(g_cls_ObservationInfo, "<init>", "(IB)V");
408     if (!g_mid_ObservationInfo_N_ctor) return JNI_ERR;
409
410     clazz = env->FindClass("org/iotivity/base/OcResourceIdentifier");
411     if (!clazz) return JNI_ERR;
412     g_cls_OcResourceIdentifier = (jclass)env->NewGlobalRef(clazz);
413     env->DeleteLocalRef(clazz);
414     g_mid_OcResourceIdentifier_N_ctor = env->GetMethodID(g_cls_OcResourceIdentifier, "<init>", "(J)V");
415     if (!g_mid_OcResourceIdentifier_N_ctor) return JNI_ERR;
416
417     //OcSecureResource
418     clazz = env->FindClass("org/iotivity/base/OcSecureResource");
419     if (!clazz) return JNI_ERR;
420     g_cls_OcSecureResource =  (jclass)env->NewGlobalRef(clazz);
421     env->DeleteLocalRef(clazz);
422     g_mid_OcSecureResource_ctor = env->GetMethodID(g_cls_OcSecureResource, "<init>", "(J)V");
423     if (!g_mid_OcSecureResource_ctor) return JNI_ERR;
424
425     //ProvisionResult
426     clazz = env->FindClass("org/iotivity/base/ProvisionResult");
427     if (!clazz) return JNI_ERR;
428     g_cls_OcProvisionResult =  (jclass)env->NewGlobalRef(clazz);
429     env->DeleteLocalRef(clazz);
430     g_mid_OcProvisionResult_ctor = env->GetMethodID(g_cls_OcProvisionResult, "<init>", "(Ljava/lang/String;I)V");
431     if (!g_mid_OcProvisionResult_ctor) return JNI_ERR;
432
433     //OicSecAcl
434     clazz = env->FindClass("org/iotivity/base/OicSecAcl");
435     if (!clazz) return JNI_ERR;
436     g_cls_OcOicSecAcl =  (jclass)env->NewGlobalRef(clazz);
437     env->DeleteLocalRef(clazz);
438
439     g_mid_OcOicSecAcl_get_subject = env->GetMethodID(g_cls_OcOicSecAcl, "getSubject", "()Ljava/lang/String;");
440     if (!g_mid_OcOicSecAcl_get_subject) return JNI_ERR;
441
442     g_mid_OcOicSecAcl_get_resources_cnt = env->GetMethodID(g_cls_OcOicSecAcl, "getResourcesCount", "()I");
443     if (!g_mid_OcOicSecAcl_get_resources_cnt) return JNI_ERR;
444
445     g_mid_OcOicSecAcl_get_resources = env->GetMethodID(g_cls_OcOicSecAcl, "getResources", "(I)Ljava/lang/String;");
446     if (!g_mid_OcOicSecAcl_get_resources) return JNI_ERR;
447
448     g_mid_OcOicSecAcl_get_permission = env->GetMethodID(g_cls_OcOicSecAcl, "getPermission", "()I");
449     if (!g_mid_OcOicSecAcl_get_permission) return JNI_ERR;
450
451     g_mid_OcOicSecAcl_get_periods_cnt = env->GetMethodID(g_cls_OcOicSecAcl, "getPeriodsCount", "()I");
452     if (!g_mid_OcOicSecAcl_get_periods_cnt) return JNI_ERR;
453
454     g_mid_OcOicSecAcl_get_periods = env->GetMethodID(g_cls_OcOicSecAcl, "getPeriods", "(I)Ljava/lang/String;");
455     if (!g_mid_OcOicSecAcl_get_periods) return JNI_ERR;
456
457     g_mid_OcOicSecAcl_get_recurrences = env->GetMethodID(g_cls_OcOicSecAcl, "getRecurrences", "(I)Ljava/lang/String;");
458     if (!g_mid_OcOicSecAcl_get_recurrences) return JNI_ERR;
459
460     g_mid_OcOicSecAcl_get_rownerID = env->GetMethodID(g_cls_OcOicSecAcl, "getRownerID", "()Ljava/lang/String;");
461     if (!g_mid_OcOicSecAcl_get_rownerID) return JNI_ERR;
462
463     return JNI_CURRENT_VERSION;
464 }
465
466 JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved)
467 {
468     LOGI("JNI_OnUnload");
469     JNIEnv* env;
470
471     if (vm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)
472     {
473         LOGE("Failed to get the environment using GetEnv()");
474         return;
475     }
476
477     env->DeleteGlobalRef(g_cls_Integer);
478     env->DeleteGlobalRef(g_cls_int1DArray);
479     env->DeleteGlobalRef(g_cls_int2DArray);
480     env->DeleteGlobalRef(g_cls_Double);
481     env->DeleteGlobalRef(g_cls_double1DArray);
482     env->DeleteGlobalRef(g_cls_double2DArray);
483     env->DeleteGlobalRef(g_cls_Boolean);
484     env->DeleteGlobalRef(g_cls_boolean1DArray);
485     env->DeleteGlobalRef(g_cls_boolean2DArray);
486     env->DeleteGlobalRef(g_cls_String);
487     env->DeleteGlobalRef(g_cls_String1DArray);
488     env->DeleteGlobalRef(g_cls_String2DArray);
489     env->DeleteGlobalRef(g_cls_LinkedList);
490     env->DeleteGlobalRef(g_cls_Map);
491     env->DeleteGlobalRef(g_cls_MapEntry);
492     env->DeleteGlobalRef(g_cls_Set);
493     env->DeleteGlobalRef(g_cls_Iterator);
494     env->DeleteGlobalRef(g_cls_HashMap);
495     env->DeleteGlobalRef(g_cls_OcResource);
496     env->DeleteGlobalRef(g_cls_OcException);
497     env->DeleteGlobalRef(g_cls_OcRepresentation);
498     env->DeleteGlobalRef(g_cls_OcRepresentation1DArray);
499     env->DeleteGlobalRef(g_cls_OcRepresentation2DArray);
500     env->DeleteGlobalRef(g_cls_OcResourceRequest);
501     env->DeleteGlobalRef(g_cls_OcResourceResponse);
502     env->DeleteGlobalRef(g_cls_OcResourceHandle);
503     env->DeleteGlobalRef(g_cls_OcPresenceHandle);
504     env->DeleteGlobalRef(g_cls_OcRequestHandle);
505     env->DeleteGlobalRef(g_cls_OcPresenceStatus);
506     env->DeleteGlobalRef(g_cls_OcHeaderOption);
507     env->DeleteGlobalRef(g_cls_ObservationInfo);
508     env->DeleteGlobalRef(g_cls_OcResourceIdentifier);
509     env->DeleteGlobalRef(g_cls_OcSecureResource);
510     env->DeleteGlobalRef(g_cls_OcProvisionResult);
511     env->DeleteGlobalRef(g_cls_OcOicSecAcl);
512 }