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