Imported Upstream version 1.1.1
[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 /**
29  * Macro to verify the validity of input argument.
30  *
31  * @param  arg  log level
32  */
33 #define VERIFY_VARIABLE_NULL(arg) \
34     if (nullptr == (arg)) \
35     { \
36         LOGE("invalid input"); \
37         return JNI_ERR; \
38     } \
39
40 JavaVM* g_jvm = nullptr;
41
42 jclass g_cls_Integer = nullptr;
43 jclass g_cls_int1DArray = nullptr;
44 jclass g_cls_int2DArray = nullptr;
45 jclass g_cls_Double = nullptr;
46 jclass g_cls_double1DArray = nullptr;
47 jclass g_cls_double2DArray = nullptr;
48 jclass g_cls_Boolean = nullptr;
49 jclass g_cls_boolean1DArray = nullptr;
50 jclass g_cls_boolean2DArray = nullptr;
51 jclass g_cls_String = nullptr;
52 jclass g_cls_String1DArray = nullptr;
53 jclass g_cls_String2DArray = nullptr;
54 jclass g_cls_LinkedList = nullptr;
55 jclass g_cls_Map = nullptr;
56 jclass g_cls_MapEntry = nullptr;
57 jclass g_cls_Set = nullptr;
58 jclass g_cls_Iterator = nullptr;
59 jclass g_cls_HashMap = nullptr;
60 jclass g_cls_OcException = nullptr;
61 jclass g_cls_OcResource = nullptr;
62 jclass g_cls_OcRepresentation = nullptr;
63 jclass g_cls_OcRepresentation1DArray = nullptr;
64 jclass g_cls_OcRepresentation2DArray = nullptr;
65 jclass g_cls_OcResourceRequest = nullptr;
66 jclass g_cls_OcResourceResponse = nullptr;
67 jclass g_cls_OcResourceHandle = nullptr;
68 jclass g_cls_OcPresenceHandle = nullptr;
69 jclass g_cls_OcRequestHandle = nullptr;
70 jclass g_cls_OcPresenceStatus = nullptr;
71 jclass g_cls_OcHeaderOption = nullptr;
72 jclass g_cls_ObservationInfo = nullptr;
73 jclass g_cls_OcResourceIdentifier = nullptr;
74 jclass g_cls_OcProvisionResult = nullptr;
75 jclass g_cls_OcSecureResource = nullptr;
76 jclass g_cls_OcOicSecAcl = nullptr;
77 jclass g_cls_OcOicSecAcl_ace = nullptr;
78 jclass g_cls_OcOicSecAcl_resr = nullptr;
79 jclass g_cls_OcOicSecAcl_validity = nullptr;
80 jclass g_cls_OcOicSecPdAcl = nullptr;
81 jclass g_cls_OcDirectPairDevice = nullptr;
82
83 jmethodID g_mid_Integer_ctor = nullptr;
84 jmethodID g_mid_Double_ctor = nullptr;
85 jmethodID g_mid_Boolean_ctor = nullptr;
86 jmethodID g_mid_LinkedList_ctor = nullptr;
87 jmethodID g_mid_LinkedList_add_object = nullptr;
88 jmethodID g_mid_Map_entrySet = nullptr;
89 jmethodID g_mid_MapEntry_getKey = nullptr;
90 jmethodID g_mid_MapEntry_getValue = nullptr;
91 jmethodID g_mid_Set_iterator = nullptr;
92 jmethodID g_mid_Iterator_hasNext = nullptr;
93 jmethodID g_mid_Iterator_next = nullptr;
94 jmethodID g_mid_HashMap_ctor = nullptr;
95 jmethodID g_mid_HashMap_put = nullptr;
96 jmethodID g_mid_OcException_ctor = nullptr;
97 jmethodID g_mid_OcException_setNativeExceptionLocation = nullptr;
98 jmethodID g_mid_OcResource_ctor = nullptr;
99 jmethodID g_mid_OcRepresentation_N_ctor = nullptr;
100 jmethodID g_mid_OcRepresentation_N_ctor_bool = nullptr;
101 jmethodID g_mid_OcResourceRequest_N_ctor = nullptr;
102 jmethodID g_mid_OcResourceResponse_N_ctor = nullptr;
103 jmethodID g_mid_OcResourceHandle_N_ctor = nullptr;
104 jmethodID g_mid_OcPresenceHandle_N_ctor = nullptr;
105 jmethodID g_mid_OcRequestHandle_N_ctor = nullptr;
106 jmethodID g_mid_OcHeaderOption_ctor = nullptr;
107 jmethodID g_mid_OcHeaderOption_get_id = nullptr;
108 jmethodID g_mid_OcHeaderOption_get_data = nullptr;
109 jmethodID g_mid_ObservationInfo_N_ctor = nullptr;
110 jmethodID g_mid_OcPresenceStatus_get = nullptr;
111 jmethodID g_mid_OcResourceIdentifier_N_ctor = nullptr;
112 jmethodID g_mid_OcProvisionResult_ctor = nullptr;
113 jmethodID g_mid_OcSecureResource_ctor = nullptr;
114 jmethodID g_mid_OcDirectPairDevice_ctor = nullptr;
115 jmethodID g_mid_OcDirectPairDevice_dev_ctor = nullptr;
116
117 jmethodID g_mid_OcOicSecPdAcl_get_resources_cnt = nullptr;
118 jmethodID g_mid_OcOicSecPdAcl_get_resources = nullptr;
119 jmethodID g_mid_OcOicSecPdAcl_get_permission = nullptr;
120 jmethodID g_mid_OcOicSecPdAcl_get_periods_cnt = nullptr;
121 jmethodID g_mid_OcOicSecPdAcl_get_periods = nullptr;
122 jmethodID g_mid_OcOicSecPdAcl_get_recurrences = nullptr;
123
124 jmethodID g_mid_OcOicSecAcl_get_aces = nullptr;
125 jmethodID g_mid_OcOicSecAcl_ace_get_subjectID = nullptr;
126 jmethodID g_mid_OcOicSecAcl_ace_get_permissions = nullptr;
127 jmethodID g_mid_OcOicSecAcl_ace_get_resources = nullptr;
128 jmethodID g_mid_OcOicSecAcl_ace_get_validities = nullptr;
129 jmethodID g_mid_OcOicSecAcl_resr_get_href = nullptr;
130 jmethodID g_mid_OcOicSecAcl_resr_get_rel = nullptr;
131 jmethodID g_mid_OcOicSecAcl_resr_get_types = nullptr;
132 jmethodID g_mid_OcOicSecAcl_resr_get_typeLen = nullptr;
133 jmethodID g_mid_OcOicSecAcl_resr_get_interfaces = nullptr;
134 jmethodID g_mid_OcOicSecAcl_validity_get_getPeriod = nullptr;
135 jmethodID g_mid_OcOicSecAcl_validity_get_recurrences = nullptr;
136 jmethodID g_mid_OcOicSecAcl_validity_get_recurrenceLen = nullptr;
137 jmethodID g_mid_OcOicSecAcl_resr_get_interfaceLen = nullptr;
138 jmethodID g_mid_OcOicSecAcl_get_rownerID = nullptr;
139
140 jobject getOcException(JNIEnv* env, const char* file, const char* functionName,
141     const int line, const int code, const char* message)
142 {
143     std::string codeStr = JniUtils::stackResultToStr(code);
144     if (codeStr.empty())
145     {
146         codeStr = JniUtils::stackResultToStr(JNI_INVALID_VALUE);
147     }
148     jobject ex = env->NewObject(g_cls_OcException,
149         g_mid_OcException_ctor,
150         env->NewStringUTF(codeStr.c_str()),
151         env->NewStringUTF(message));
152     if (!ex)
153     {
154         return nullptr;
155     }
156     env->CallVoidMethod(ex,
157         g_mid_OcException_setNativeExceptionLocation,
158         env->NewStringUTF(file),
159         env->NewStringUTF(functionName),
160         line);
161     if (env->ExceptionCheck())
162     {
163         return nullptr;
164     }
165     return ex;
166 }
167
168 void throwOcException(JNIEnv* env, jobject ex)
169 {
170     env->Throw((jthrowable)ex);
171 }
172
173 // JNI OnLoad
174 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)
175 {
176     LOGI("JNI_OnLoad");
177     JNIEnv* env = nullptr;
178     g_jvm = vm;
179
180     if (g_jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)
181     {
182         LOGE("Failed to get the environment using GetEnv()");
183         return JNI_ERR;
184     }
185     VERIFY_VARIABLE_NULL(env);
186
187     jclass clazz = nullptr;
188
189     //Integer
190     clazz = env->FindClass("java/lang/Integer");
191     VERIFY_VARIABLE_NULL(clazz);
192
193     g_cls_Integer = (jclass)env->NewGlobalRef(clazz);
194     env->DeleteLocalRef(clazz);
195
196     g_mid_Integer_ctor = env->GetMethodID(g_cls_Integer, "<init>", "(I)V");
197     VERIFY_VARIABLE_NULL(g_mid_Integer_ctor);
198
199     clazz = env->FindClass("[I");
200     VERIFY_VARIABLE_NULL(clazz);
201     g_cls_int1DArray = (jclass)env->NewGlobalRef(clazz);
202     env->DeleteLocalRef(clazz);
203
204     clazz = env->FindClass("[[I");
205     VERIFY_VARIABLE_NULL(clazz);
206     g_cls_int2DArray = (jclass)env->NewGlobalRef(clazz);
207     env->DeleteLocalRef(clazz);
208
209     //Double
210     clazz = env->FindClass("java/lang/Double");
211     VERIFY_VARIABLE_NULL(clazz);
212     g_cls_Double = (jclass)env->NewGlobalRef(clazz);
213     env->DeleteLocalRef(clazz);
214
215     g_mid_Double_ctor = env->GetMethodID(g_cls_Double, "<init>", "(D)V");
216     VERIFY_VARIABLE_NULL(g_mid_Double_ctor);
217
218     clazz = env->FindClass("[D");
219     VERIFY_VARIABLE_NULL(clazz);
220     g_cls_double1DArray = (jclass)env->NewGlobalRef(clazz);
221     env->DeleteLocalRef(clazz);
222
223     clazz = env->FindClass("[[D");
224     VERIFY_VARIABLE_NULL(clazz);
225     g_cls_double2DArray = (jclass)env->NewGlobalRef(clazz);
226     env->DeleteLocalRef(clazz);
227
228     //Boolean
229     clazz = env->FindClass("java/lang/Boolean");
230     VERIFY_VARIABLE_NULL(clazz);
231     g_cls_Boolean = (jclass)env->NewGlobalRef(clazz);
232     env->DeleteLocalRef(clazz);
233
234     g_mid_Boolean_ctor = env->GetMethodID(g_cls_Boolean, "<init>", "(Z)V");
235     VERIFY_VARIABLE_NULL(g_mid_Boolean_ctor);
236
237     clazz = env->FindClass("[Z");
238     VERIFY_VARIABLE_NULL(clazz);
239     g_cls_boolean1DArray = (jclass)env->NewGlobalRef(clazz);
240     env->DeleteLocalRef(clazz);
241
242     clazz = env->FindClass("[[Z");
243     VERIFY_VARIABLE_NULL(clazz);
244     g_cls_boolean2DArray = (jclass)env->NewGlobalRef(clazz);
245     env->DeleteLocalRef(clazz);
246
247     //String
248     clazz = env->FindClass("java/lang/String");
249     VERIFY_VARIABLE_NULL(clazz);
250     g_cls_String = (jclass)env->NewGlobalRef(clazz);
251     env->DeleteLocalRef(clazz);
252
253     clazz = env->FindClass("[Ljava/lang/String;");
254     VERIFY_VARIABLE_NULL(clazz);
255     g_cls_String1DArray = (jclass)env->NewGlobalRef(clazz);
256     env->DeleteLocalRef(clazz);
257
258     clazz = env->FindClass("[[Ljava/lang/String;");
259     VERIFY_VARIABLE_NULL(clazz);
260     g_cls_String2DArray = (jclass)env->NewGlobalRef(clazz);
261     env->DeleteLocalRef(clazz);
262
263     //LinkedList
264     clazz = env->FindClass("java/util/LinkedList");
265     VERIFY_VARIABLE_NULL(clazz);
266     g_cls_LinkedList = (jclass)env->NewGlobalRef(clazz);
267     env->DeleteLocalRef(clazz);
268
269     g_mid_LinkedList_ctor = env->GetMethodID(g_cls_LinkedList, "<init>", "()V");
270     VERIFY_VARIABLE_NULL(g_mid_LinkedList_ctor);
271
272     g_mid_LinkedList_add_object = env->GetMethodID(g_cls_LinkedList, "add", "(Ljava/lang/Object;)Z");
273     VERIFY_VARIABLE_NULL(g_mid_LinkedList_add_object);
274
275     //Map
276     clazz = env->FindClass("java/util/Map");
277     VERIFY_VARIABLE_NULL(clazz);
278     g_cls_Map = (jclass)env->NewGlobalRef(clazz);
279     env->DeleteLocalRef(clazz);
280
281     g_mid_Map_entrySet = env->GetMethodID(g_cls_Map, "entrySet", "()Ljava/util/Set;");
282     VERIFY_VARIABLE_NULL(g_mid_Map_entrySet);
283
284     //MapEntry
285     clazz = env->FindClass("java/util/Map$Entry");
286     VERIFY_VARIABLE_NULL(clazz);
287     g_cls_MapEntry = (jclass)env->NewGlobalRef(clazz);
288     env->DeleteLocalRef(clazz);
289
290     g_mid_MapEntry_getKey = env->GetMethodID(g_cls_MapEntry, "getKey", "()Ljava/lang/Object;");
291     VERIFY_VARIABLE_NULL(g_mid_MapEntry_getKey);
292     g_mid_MapEntry_getValue = env->GetMethodID(g_cls_MapEntry, "getValue", "()Ljava/lang/Object;");
293     VERIFY_VARIABLE_NULL(g_mid_MapEntry_getValue);
294
295     //Set
296     clazz = env->FindClass("java/util/Set");
297     VERIFY_VARIABLE_NULL(clazz);
298     g_cls_Set = (jclass)env->NewGlobalRef(clazz);
299     env->DeleteLocalRef(clazz);
300
301     g_mid_Set_iterator = env->GetMethodID(g_cls_Set, "iterator", "()Ljava/util/Iterator;");
302     VERIFY_VARIABLE_NULL(g_mid_Set_iterator);
303
304     //Iterator
305     clazz = env->FindClass("java/util/Iterator");
306     VERIFY_VARIABLE_NULL(clazz);
307     g_cls_Iterator = (jclass)env->NewGlobalRef(clazz);
308     env->DeleteLocalRef(clazz);
309
310     g_mid_Iterator_hasNext = env->GetMethodID(g_cls_Iterator, "hasNext", "()Z");
311     VERIFY_VARIABLE_NULL(g_mid_Iterator_hasNext);
312
313     g_mid_Iterator_next = env->GetMethodID(g_cls_Iterator, "next", "()Ljava/lang/Object;");
314     VERIFY_VARIABLE_NULL(g_mid_Iterator_next);
315
316     //HashMap
317     clazz = env->FindClass("java/util/HashMap");
318     VERIFY_VARIABLE_NULL(clazz);
319     g_cls_HashMap = (jclass)env->NewGlobalRef(clazz);
320     env->DeleteLocalRef(clazz);
321
322     g_mid_HashMap_ctor = env->GetMethodID(g_cls_HashMap, "<init>", "()V");
323     VERIFY_VARIABLE_NULL(g_mid_HashMap_ctor);
324
325     g_mid_HashMap_put = env->GetMethodID(g_cls_HashMap, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
326     VERIFY_VARIABLE_NULL(g_mid_HashMap_put);
327
328     //OcException
329     clazz = env->FindClass("org/iotivity/base/OcException");
330     VERIFY_VARIABLE_NULL(clazz);
331     g_cls_OcException = (jclass)env->NewGlobalRef(clazz);
332     env->DeleteLocalRef(clazz);
333
334     g_mid_OcException_ctor = env->GetMethodID(g_cls_OcException, "<init>", "(Ljava/lang/String;Ljava/lang/String;)V");
335     VERIFY_VARIABLE_NULL(g_mid_OcException_ctor);
336
337     g_mid_OcException_setNativeExceptionLocation = env->GetMethodID(g_cls_OcException, "setNativeExceptionLocation",
338         "(Ljava/lang/String;""Ljava/lang/String;""I)V");
339     VERIFY_VARIABLE_NULL(g_mid_OcException_setNativeExceptionLocation);
340
341     //OcResource
342     clazz = env->FindClass("org/iotivity/base/OcResource");
343     VERIFY_VARIABLE_NULL(clazz);
344     g_cls_OcResource = (jclass)env->NewGlobalRef(clazz);
345     env->DeleteLocalRef(clazz);
346
347     g_mid_OcResource_ctor = env->GetMethodID(g_cls_OcResource, "<init>", "(J)V");
348     VERIFY_VARIABLE_NULL(g_mid_OcResource_ctor);
349
350     //OcRepresentation
351     clazz = env->FindClass("org/iotivity/base/OcRepresentation");
352     VERIFY_VARIABLE_NULL(clazz);
353     g_cls_OcRepresentation = (jclass)env->NewGlobalRef(clazz);
354     env->DeleteLocalRef(clazz);
355
356     g_mid_OcRepresentation_N_ctor = env->GetMethodID(g_cls_OcRepresentation, "<init>", "(J)V");
357     VERIFY_VARIABLE_NULL(g_mid_OcRepresentation_N_ctor);
358
359     g_mid_OcRepresentation_N_ctor_bool = env->GetMethodID(g_cls_OcRepresentation, "<init>", "(JZ)V");
360     VERIFY_VARIABLE_NULL(g_mid_OcRepresentation_N_ctor_bool);
361
362     clazz = env->FindClass("[Lorg/iotivity/base/OcRepresentation;");
363     VERIFY_VARIABLE_NULL(clazz);
364     g_cls_OcRepresentation1DArray = (jclass)env->NewGlobalRef(clazz);
365     env->DeleteLocalRef(clazz);
366
367     clazz = env->FindClass("[[Lorg/iotivity/base/OcRepresentation;");
368     VERIFY_VARIABLE_NULL(clazz);
369     g_cls_OcRepresentation2DArray = (jclass)env->NewGlobalRef(clazz);
370     env->DeleteLocalRef(clazz);
371
372     //HeaderOptions
373     clazz = env->FindClass("org/iotivity/base/OcHeaderOption");
374     VERIFY_VARIABLE_NULL(clazz);
375     g_cls_OcHeaderOption = (jclass)env->NewGlobalRef(clazz);
376     env->DeleteLocalRef(clazz);
377     g_mid_OcHeaderOption_ctor = env->GetMethodID(g_cls_OcHeaderOption, "<init>", "(ILjava/lang/String;)V");
378     VERIFY_VARIABLE_NULL(g_mid_OcHeaderOption_ctor);
379
380     g_mid_OcHeaderOption_get_id = env->GetMethodID(g_cls_OcHeaderOption, "getOptionId", "()I");
381     VERIFY_VARIABLE_NULL(g_mid_OcHeaderOption_get_id);
382
383     g_mid_OcHeaderOption_get_data = env->GetMethodID(g_cls_OcHeaderOption, "getOptionData", "()Ljava/lang/String;");
384     VERIFY_VARIABLE_NULL(g_mid_OcHeaderOption_get_data);
385
386     //OcResourceRequest
387     clazz = env->FindClass("org/iotivity/base/OcResourceRequest");
388     VERIFY_VARIABLE_NULL(clazz);
389     g_cls_OcResourceRequest = (jclass)env->NewGlobalRef(clazz);
390     env->DeleteLocalRef(clazz);
391
392     g_mid_OcResourceRequest_N_ctor = env->GetMethodID(g_cls_OcResourceRequest, "<init>", "(J)V");
393     VERIFY_VARIABLE_NULL(g_mid_OcResourceRequest_N_ctor);
394
395     //OcResourceResponse
396     clazz = env->FindClass("org/iotivity/base/OcResourceResponse");
397     VERIFY_VARIABLE_NULL(clazz);
398     g_cls_OcResourceResponse = (jclass)env->NewGlobalRef(clazz);
399     env->DeleteLocalRef(clazz);
400
401     g_mid_OcResourceResponse_N_ctor = env->GetMethodID(g_cls_OcResourceResponse, "<init>", "(J)V");
402     VERIFY_VARIABLE_NULL(g_mid_OcResourceResponse_N_ctor);
403
404     //OcResourceHandle
405     clazz = env->FindClass("org/iotivity/base/OcResourceHandle");
406     VERIFY_VARIABLE_NULL(clazz);
407     g_cls_OcResourceHandle = (jclass)env->NewGlobalRef(clazz);
408     env->DeleteLocalRef(clazz);
409     g_mid_OcResourceHandle_N_ctor = env->GetMethodID(g_cls_OcResourceHandle, "<init>", "(J)V");
410     VERIFY_VARIABLE_NULL(g_mid_OcResourceHandle_N_ctor);
411
412     //OcPresenceHandle
413     clazz = env->FindClass("org/iotivity/base/OcPresenceHandle");
414     VERIFY_VARIABLE_NULL(clazz);
415     g_cls_OcPresenceHandle = (jclass)env->NewGlobalRef(clazz);
416     env->DeleteLocalRef(clazz);
417     g_mid_OcPresenceHandle_N_ctor = env->GetMethodID(g_cls_OcPresenceHandle, "<init>", "(J)V");
418     VERIFY_VARIABLE_NULL(g_mid_OcPresenceHandle_N_ctor);
419
420     //OcRequestHandle
421     clazz = env->FindClass("org/iotivity/base/OcRequestHandle");
422     VERIFY_VARIABLE_NULL(clazz);
423     g_cls_OcRequestHandle = (jclass)env->NewGlobalRef(clazz);
424     env->DeleteLocalRef(clazz);
425     g_mid_OcRequestHandle_N_ctor = env->GetMethodID(g_cls_OcRequestHandle, "<init>", "(J)V");
426     VERIFY_VARIABLE_NULL(g_mid_OcRequestHandle_N_ctor);
427
428     //OcPresenceStatus
429     clazz = env->FindClass("org/iotivity/base/OcPresenceStatus");
430     VERIFY_VARIABLE_NULL(clazz);
431     g_cls_OcPresenceStatus = (jclass)env->NewGlobalRef(clazz);
432     env->DeleteLocalRef(clazz);
433     g_mid_OcPresenceStatus_get = env->GetStaticMethodID(g_cls_OcPresenceStatus, "get",
434         "(Ljava/lang/String;)Lorg/iotivity/base/OcPresenceStatus;");
435     VERIFY_VARIABLE_NULL(g_mid_OcPresenceStatus_get);
436
437     //ObservationInfo
438     clazz = env->FindClass("org/iotivity/base/ObservationInfo");
439     VERIFY_VARIABLE_NULL(clazz);
440     g_cls_ObservationInfo = (jclass)env->NewGlobalRef(clazz);
441     env->DeleteLocalRef(clazz);
442     g_mid_ObservationInfo_N_ctor = env->GetMethodID(g_cls_ObservationInfo, "<init>", "(IB)V");
443     VERIFY_VARIABLE_NULL(g_mid_ObservationInfo_N_ctor);
444
445     clazz = env->FindClass("org/iotivity/base/OcResourceIdentifier");
446     VERIFY_VARIABLE_NULL(clazz);
447     g_cls_OcResourceIdentifier = (jclass)env->NewGlobalRef(clazz);
448     env->DeleteLocalRef(clazz);
449     g_mid_OcResourceIdentifier_N_ctor = env->GetMethodID(g_cls_OcResourceIdentifier, "<init>", "(J)V");
450     VERIFY_VARIABLE_NULL(g_mid_OcResourceIdentifier_N_ctor);
451
452     //OcSecureResource
453     clazz = env->FindClass("org/iotivity/base/OcSecureResource");
454     VERIFY_VARIABLE_NULL(clazz);
455     g_cls_OcSecureResource =  (jclass)env->NewGlobalRef(clazz);
456     env->DeleteLocalRef(clazz);
457     g_mid_OcSecureResource_ctor = env->GetMethodID(g_cls_OcSecureResource, "<init>", "(J)V");
458     VERIFY_VARIABLE_NULL(g_mid_OcSecureResource_ctor);
459
460     //ProvisionResult
461     clazz = env->FindClass("org/iotivity/base/ProvisionResult");
462     VERIFY_VARIABLE_NULL(clazz);
463     g_cls_OcProvisionResult =  (jclass)env->NewGlobalRef(clazz);
464     env->DeleteLocalRef(clazz);
465     g_mid_OcProvisionResult_ctor = env->GetMethodID(g_cls_OcProvisionResult, "<init>", "(Ljava/lang/String;I)V");
466     VERIFY_VARIABLE_NULL(g_mid_OcProvisionResult_ctor);
467
468     //OcDirectPairDevice
469     clazz = env->FindClass("org/iotivity/base/OcDirectPairDevice");
470     VERIFY_VARIABLE_NULL(clazz);
471     g_cls_OcDirectPairDevice =  (jclass)env->NewGlobalRef(clazz);
472     g_mid_OcDirectPairDevice_ctor = env->GetMethodID(g_cls_OcDirectPairDevice, "<init>", "(J)V");
473     VERIFY_VARIABLE_NULL(g_mid_OcDirectPairDevice_ctor);
474
475     g_mid_OcDirectPairDevice_dev_ctor = env->GetMethodID(g_cls_OcDirectPairDevice, "<init>", "(Ljava/lang/String;)V");
476     VERIFY_VARIABLE_NULL(g_mid_OcDirectPairDevice_dev_ctor);
477     env->DeleteLocalRef(clazz);
478
479     //OicSecAcl
480     clazz = env->FindClass("org/iotivity/base/OicSecAcl");
481     VERIFY_VARIABLE_NULL(clazz);
482     g_cls_OcOicSecAcl =  (jclass)env->NewGlobalRef(clazz);
483     env->DeleteLocalRef(clazz);
484
485     g_mid_OcOicSecAcl_get_rownerID = env->GetMethodID(g_cls_OcOicSecAcl, "getRownerID", "()Ljava/lang/String;");
486     VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_get_rownerID);
487
488     g_mid_OcOicSecAcl_get_aces = env->GetMethodID(g_cls_OcOicSecAcl, "getOicSecAces", "()[Lorg/iotivity/base/OicSecAce;");
489     VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_get_aces);
490
491     //OicSecAce
492     clazz = env->FindClass("org/iotivity/base/OicSecAce");
493     VERIFY_VARIABLE_NULL(clazz);
494     g_cls_OcOicSecAcl_ace =  (jclass)env->NewGlobalRef(clazz);
495     env->DeleteLocalRef(clazz);
496
497     g_mid_OcOicSecAcl_ace_get_subjectID = env->GetMethodID(g_cls_OcOicSecAcl_ace, "getSubjectID","()Ljava/lang/String;");
498     VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_ace_get_subjectID);
499
500     g_mid_OcOicSecAcl_ace_get_permissions = env->GetMethodID(g_cls_OcOicSecAcl_ace, "getPermission","()I");
501     VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_ace_get_permissions);
502
503     g_mid_OcOicSecAcl_ace_get_resources = env->GetMethodID(g_cls_OcOicSecAcl_ace, "getResources","()[Lorg/iotivity/base/OicSecResr;");
504     VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_ace_get_resources);
505
506     g_mid_OcOicSecAcl_ace_get_validities = env->GetMethodID(g_cls_OcOicSecAcl_ace, "getValidities","()[Lorg/iotivity/base/OicSecValidity;");
507     VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_ace_get_validities);
508
509     //OicSecResr
510     clazz = env->FindClass("org/iotivity/base/OicSecResr");
511     VERIFY_VARIABLE_NULL(clazz);
512     g_cls_OcOicSecAcl_resr =  (jclass)env->NewGlobalRef(clazz);
513     env->DeleteLocalRef(clazz);
514
515     g_mid_OcOicSecAcl_resr_get_href = env->GetMethodID(g_cls_OcOicSecAcl_resr, "getHref","()Ljava/lang/String;");
516     VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_resr_get_href);
517
518     g_mid_OcOicSecAcl_resr_get_rel = env->GetMethodID(g_cls_OcOicSecAcl_resr, "getRel","()Ljava/lang/String;");
519     VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_resr_get_rel);
520
521     g_mid_OcOicSecAcl_resr_get_types = env->GetMethodID(g_cls_OcOicSecAcl_resr, "getTypes","(I)Ljava/lang/String;");
522     VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_resr_get_types);
523
524     g_mid_OcOicSecAcl_resr_get_typeLen = env->GetMethodID(g_cls_OcOicSecAcl_resr, "getTypeLen","()I");
525     VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_resr_get_typeLen);
526
527     g_mid_OcOicSecAcl_resr_get_interfaces = env->GetMethodID(g_cls_OcOicSecAcl_resr, "getInterfaces","(I)Ljava/lang/String;");
528     VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_resr_get_interfaces);
529
530     g_mid_OcOicSecAcl_resr_get_interfaceLen = env->GetMethodID(g_cls_OcOicSecAcl_resr, "getInterfaceLen","()I");
531     VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_resr_get_interfaceLen);
532
533     //OicSecAcl$OicSecValidity
534     clazz = env->FindClass("org/iotivity/base/OicSecValidity");
535     VERIFY_VARIABLE_NULL(clazz);
536     g_cls_OcOicSecAcl_validity =  (jclass)env->NewGlobalRef(clazz);
537     env->DeleteLocalRef(clazz);
538
539     g_mid_OcOicSecAcl_validity_get_getPeriod = env->GetMethodID(g_cls_OcOicSecAcl_validity, "getPeriod","()Ljava/lang/String;");
540     VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_validity_get_getPeriod);
541
542     g_mid_OcOicSecAcl_validity_get_recurrences = env->GetMethodID(g_cls_OcOicSecAcl_validity, "getRecurrences","(I)Ljava/lang/String;");
543     VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_validity_get_recurrences);
544
545     g_mid_OcOicSecAcl_validity_get_recurrenceLen = env->GetMethodID(g_cls_OcOicSecAcl_validity, "getRecurrenceLen","()I");
546     VERIFY_VARIABLE_NULL(g_mid_OcOicSecAcl_validity_get_recurrenceLen);
547
548     //OicSecPdAcl
549     clazz = env->FindClass("org/iotivity/base/OicSecPdAcl");
550     VERIFY_VARIABLE_NULL(clazz);
551     g_cls_OcOicSecPdAcl =  (jclass)env->NewGlobalRef(clazz);
552     env->DeleteLocalRef(clazz);
553
554     g_mid_OcOicSecPdAcl_get_resources_cnt = env->GetMethodID(g_cls_OcOicSecPdAcl, "getResourcesCount", "()I");
555     VERIFY_VARIABLE_NULL(g_mid_OcOicSecPdAcl_get_resources_cnt);
556
557     g_mid_OcOicSecPdAcl_get_resources = env->GetMethodID(g_cls_OcOicSecPdAcl, "getResources", "(I)Ljava/lang/String;");
558     VERIFY_VARIABLE_NULL(g_mid_OcOicSecPdAcl_get_resources);
559
560     g_mid_OcOicSecPdAcl_get_permission = env->GetMethodID(g_cls_OcOicSecPdAcl, "getPermission", "()I");
561     VERIFY_VARIABLE_NULL(g_mid_OcOicSecPdAcl_get_permission);
562
563     g_mid_OcOicSecPdAcl_get_periods_cnt = env->GetMethodID(g_cls_OcOicSecPdAcl, "getPeriodsCount", "()I");
564     VERIFY_VARIABLE_NULL(g_mid_OcOicSecPdAcl_get_periods_cnt);
565
566     g_mid_OcOicSecPdAcl_get_periods = env->GetMethodID(g_cls_OcOicSecPdAcl, "getPeriods", "(I)Ljava/lang/String;");
567     VERIFY_VARIABLE_NULL(g_mid_OcOicSecPdAcl_get_periods);
568
569     g_mid_OcOicSecPdAcl_get_recurrences = env->GetMethodID(g_cls_OcOicSecPdAcl, "getRecurrences", "(I)Ljava/lang/String;");
570     VERIFY_VARIABLE_NULL(g_mid_OcOicSecPdAcl_get_recurrences);
571
572     return JNI_CURRENT_VERSION;
573 }
574
575 JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved)
576 {
577     LOGI("JNI_OnUnload");
578     JNIEnv* env;
579
580     if (vm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)
581     {
582         LOGE("Failed to get the environment using GetEnv()");
583         return;
584     }
585
586     env->DeleteGlobalRef(g_cls_Integer);
587     env->DeleteGlobalRef(g_cls_int1DArray);
588     env->DeleteGlobalRef(g_cls_int2DArray);
589     env->DeleteGlobalRef(g_cls_Double);
590     env->DeleteGlobalRef(g_cls_double1DArray);
591     env->DeleteGlobalRef(g_cls_double2DArray);
592     env->DeleteGlobalRef(g_cls_Boolean);
593     env->DeleteGlobalRef(g_cls_boolean1DArray);
594     env->DeleteGlobalRef(g_cls_boolean2DArray);
595     env->DeleteGlobalRef(g_cls_String);
596     env->DeleteGlobalRef(g_cls_String1DArray);
597     env->DeleteGlobalRef(g_cls_String2DArray);
598     env->DeleteGlobalRef(g_cls_LinkedList);
599     env->DeleteGlobalRef(g_cls_Map);
600     env->DeleteGlobalRef(g_cls_MapEntry);
601     env->DeleteGlobalRef(g_cls_Set);
602     env->DeleteGlobalRef(g_cls_Iterator);
603     env->DeleteGlobalRef(g_cls_HashMap);
604     env->DeleteGlobalRef(g_cls_OcResource);
605     env->DeleteGlobalRef(g_cls_OcException);
606     env->DeleteGlobalRef(g_cls_OcRepresentation);
607     env->DeleteGlobalRef(g_cls_OcRepresentation1DArray);
608     env->DeleteGlobalRef(g_cls_OcRepresentation2DArray);
609     env->DeleteGlobalRef(g_cls_OcResourceRequest);
610     env->DeleteGlobalRef(g_cls_OcResourceResponse);
611     env->DeleteGlobalRef(g_cls_OcResourceHandle);
612     env->DeleteGlobalRef(g_cls_OcPresenceHandle);
613     env->DeleteGlobalRef(g_cls_OcRequestHandle);
614     env->DeleteGlobalRef(g_cls_OcPresenceStatus);
615     env->DeleteGlobalRef(g_cls_OcHeaderOption);
616     env->DeleteGlobalRef(g_cls_ObservationInfo);
617     env->DeleteGlobalRef(g_cls_OcResourceIdentifier);
618     env->DeleteGlobalRef(g_cls_OcSecureResource);
619     env->DeleteGlobalRef(g_cls_OcProvisionResult);
620     env->DeleteGlobalRef(g_cls_OcOicSecAcl);
621     env->DeleteGlobalRef(g_cls_OcOicSecAcl_ace);
622     env->DeleteGlobalRef(g_cls_OcOicSecAcl_resr);
623     env->DeleteGlobalRef(g_cls_OcOicSecAcl_validity);
624 }