Imported Upstream version 1.0.0
[platform/upstream/iotivity.git] / android / android_api / base / jni / JniOcStack.cpp
index 5f6c1d4..affc4dd 100644 (file)
-/*\r
-* //******************************************************************\r
-* //\r
-* // Copyright 2015 Intel Corporation.\r
-* //\r
-* //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
-* //\r
-* // Licensed under the Apache License, Version 2.0 (the "License");\r
-* // you may not use this file except in compliance with the License.\r
-* // You may obtain a copy of the License at\r
-* //\r
-* //      http://www.apache.org/licenses/LICENSE-2.0\r
-* //\r
-* // Unless required by applicable law or agreed to in writing, software\r
-* // distributed under the License is distributed on an "AS IS" BASIS,\r
-* // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-* // See the License for the specific language governing permissions and\r
-* // limitations under the License.\r
-* //\r
-* //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
-*/\r
-#include "JniOcStack.h"\r
-#include "OCApi.h"\r
-#include "OCPlatform.h"\r
-#include "OCRepresentation.h"\r
-#include "JniUtils.h"\r
-\r
-JavaVM* g_jvm = NULL;\r
-\r
-jclass g_cls_Integer = NULL;\r
-jclass g_cls_int1DArray = NULL;\r
-jclass g_cls_int2DArray = NULL;\r
-jclass g_cls_Double = NULL;\r
-jclass g_cls_double1DArray = NULL;\r
-jclass g_cls_double2DArray = NULL;\r
-jclass g_cls_Boolean = NULL;\r
-jclass g_cls_boolean1DArray = NULL;\r
-jclass g_cls_boolean2DArray = NULL;\r
-jclass g_cls_String = NULL;\r
-jclass g_cls_String1DArray = NULL;\r
-jclass g_cls_String2DArray = NULL;\r
-jclass g_cls_LinkedList = NULL;\r
-jclass g_cls_Map = NULL;\r
-jclass g_cls_MapEntry = NULL;\r
-jclass g_cls_Set = NULL;\r
-jclass g_cls_Iterator = NULL;\r
-jclass g_cls_HashMap = NULL;\r
-jclass g_cls_OcException = NULL;\r
-jclass g_cls_OcResource = NULL;\r
-jclass g_cls_OcRepresentation = NULL;\r
-jclass g_cls_OcRepresentation1DArray = NULL;\r
-jclass g_cls_OcRepresentation2DArray = NULL;\r
-jclass g_cls_OcResourceRequest = NULL;\r
-jclass g_cls_OcResourceResponse = NULL;\r
-jclass g_cls_OcResourceHandle = NULL;\r
-jclass g_cls_OcPresenceHandle = NULL;\r
-jclass g_cls_OcRequestHandle = NULL;\r
-jclass g_cls_OcPresenceStatus = NULL;\r
-jclass g_cls_OcHeaderOption = NULL;\r
-jclass g_cls_ObservationInfo = NULL;\r
-jclass g_cls_OcResourceIdentifier = NULL;\r
-\r
-jmethodID g_mid_Integer_ctor = NULL;\r
-jmethodID g_mid_Double_ctor = NULL;\r
-jmethodID g_mid_Boolean_ctor = NULL;\r
-jmethodID g_mid_LinkedList_ctor = NULL;\r
-jmethodID g_mid_LinkedList_add_object = NULL;\r
-jmethodID g_mid_Map_entrySet = NULL;\r
-jmethodID g_mid_MapEntry_getKey = NULL;\r
-jmethodID g_mid_MapEntry_getValue = NULL;\r
-jmethodID g_mid_Set_iterator = NULL;\r
-jmethodID g_mid_Iterator_hasNext = NULL;\r
-jmethodID g_mid_Iterator_next = NULL;\r
-jmethodID g_mid_HashMap_ctor = NULL;\r
-jmethodID g_mid_HashMap_put = NULL;\r
-jmethodID g_mid_OcException_ctor = NULL;\r
-jmethodID g_mid_OcException_setNativeExceptionLocation = NULL;\r
-jmethodID g_mid_OcResource_ctor = NULL;\r
-jmethodID g_mid_OcRepresentation_N_ctor = NULL;\r
-jmethodID g_mid_OcRepresentation_N_ctor_bool = NULL;\r
-jmethodID g_mid_OcResourceRequest_N_ctor = NULL;\r
-jmethodID g_mid_OcResourceResponse_N_ctor = NULL;\r
-jmethodID g_mid_OcResourceHandle_N_ctor = NULL;\r
-jmethodID g_mid_OcPresenceHandle_N_ctor = NULL;\r
-jmethodID g_mid_OcRequestHandle_N_ctor = NULL;\r
-jmethodID g_mid_OcHeaderOption_ctor = NULL;\r
-jmethodID g_mid_OcHeaderOption_get_id = NULL;\r
-jmethodID g_mid_OcHeaderOption_get_data = NULL;\r
-jmethodID g_mid_ObservationInfo_N_ctor = NULL;\r
-jmethodID g_mid_OcPresenceStatus_get = NULL;\r
-jmethodID g_mid_OcResourceIdentifier_N_ctor = NULL;\r
-\r
-jobject getOcException(JNIEnv* env, const char* file, const char* functionName,\r
-    const int line, const int code, const char* message)\r
-{\r
-    std::string codeStr = JniUtils::stackResultToStr(code);\r
-    if (codeStr.empty())\r
-    {\r
-        codeStr = JniUtils::stackResultToStr(JNI_INVALID_VALUE);\r
-    }\r
-    jobject ex = env->NewObject(g_cls_OcException,\r
-        g_mid_OcException_ctor,\r
-        env->NewStringUTF(codeStr.c_str()),\r
-        env->NewStringUTF(message));\r
-    if (!ex)\r
-    {\r
-        return nullptr;\r
-    }\r
-    env->CallVoidMethod(ex,\r
-        g_mid_OcException_setNativeExceptionLocation,\r
-        env->NewStringUTF(file),\r
-        env->NewStringUTF(functionName),\r
-        line);\r
-    if (env->ExceptionCheck())\r
-    {\r
-        return nullptr;\r
-    }\r
-    return ex;\r
-}\r
-\r
-void throwOcException(JNIEnv* env, jobject ex)\r
-{\r
-    env->Throw((jthrowable)ex);\r
-}\r
-\r
-// JNI OnLoad\r
-JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)\r
-{\r
-    LOGI("JNI_OnLoad");\r
-    JNIEnv* env;\r
-    g_jvm = vm;\r
-\r
-    if (g_jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)\r
-    {\r
-        LOGE("Failed to get the environment using GetEnv()");\r
-        return JNI_ERR;\r
-    }\r
-\r
-    jclass clazz = nullptr;\r
-\r
-    //Integer\r
-    clazz = env->FindClass("java/lang/Integer");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_Integer = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    g_mid_Integer_ctor = env->GetMethodID(g_cls_Integer, "<init>", "(I)V");\r
-    if (!g_mid_Integer_ctor) return JNI_ERR;\r
-\r
-    clazz = env->FindClass("[I");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_int1DArray = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    clazz = env->FindClass("[[I");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_int2DArray = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    //Double\r
-    clazz = env->FindClass("java/lang/Double");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_Double = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    g_mid_Double_ctor = env->GetMethodID(g_cls_Double, "<init>", "(D)V");\r
-    if (!g_mid_Double_ctor) return JNI_ERR;\r
-\r
-    clazz = env->FindClass("[D");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_double1DArray = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    clazz = env->FindClass("[[D");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_double2DArray = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    //Boolean\r
-    clazz = env->FindClass("java/lang/Boolean");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_Boolean = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    g_mid_Boolean_ctor = env->GetMethodID(g_cls_Boolean, "<init>", "(Z)V");\r
-    if (!g_mid_Boolean_ctor) return JNI_ERR;\r
-\r
-    clazz = env->FindClass("[Z");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_boolean1DArray = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    clazz = env->FindClass("[[Z");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_boolean2DArray = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    //String\r
-    clazz = env->FindClass("java/lang/String");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_String = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    clazz = env->FindClass("[Ljava/lang/String;");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_String1DArray = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    clazz = env->FindClass("[[Ljava/lang/String;");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_String2DArray = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    //LinkedList\r
-    clazz = env->FindClass("java/util/LinkedList");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_LinkedList = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    g_mid_LinkedList_ctor = env->GetMethodID(g_cls_LinkedList, "<init>", "()V");\r
-    if (!g_mid_LinkedList_ctor) return JNI_ERR;\r
-\r
-    g_mid_LinkedList_add_object = env->GetMethodID(g_cls_LinkedList, "add", "(Ljava/lang/Object;)Z");\r
-    if (!g_mid_LinkedList_add_object) return JNI_ERR;\r
-\r
-    //Map\r
-    clazz = env->FindClass("java/util/Map");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_Map = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    g_mid_Map_entrySet = env->GetMethodID(g_cls_Map, "entrySet", "()Ljava/util/Set;");\r
-    if (!g_mid_Map_entrySet) return JNI_ERR;\r
-\r
-    //MapEntry\r
-    clazz = env->FindClass("java/util/Map$Entry");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_MapEntry = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    g_mid_MapEntry_getKey = env->GetMethodID(g_cls_MapEntry, "getKey", "()Ljava/lang/Object;");\r
-    if (!g_mid_MapEntry_getKey) return JNI_ERR;\r
-    g_mid_MapEntry_getValue = env->GetMethodID(g_cls_MapEntry, "getValue", "()Ljava/lang/Object;");\r
-    if (!g_mid_MapEntry_getValue) return JNI_ERR;\r
-\r
-    //Set\r
-    clazz = env->FindClass("java/util/Set");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_Set = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    g_mid_Set_iterator = env->GetMethodID(g_cls_Set, "iterator", "()Ljava/util/Iterator;");\r
-    if (!g_mid_Set_iterator) return JNI_ERR;\r
-\r
-    //Iterator\r
-    clazz = env->FindClass("java/util/Iterator");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_Iterator = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    g_mid_Iterator_hasNext = env->GetMethodID(g_cls_Iterator, "hasNext", "()Z");\r
-    if (!g_mid_Iterator_hasNext) return JNI_ERR;\r
-\r
-    g_mid_Iterator_next = env->GetMethodID(g_cls_Iterator, "next", "()Ljava/lang/Object;");\r
-    if (!g_mid_Iterator_next) return JNI_ERR;\r
-\r
-    //HashMap\r
-    clazz = env->FindClass("java/util/HashMap");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_HashMap = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    g_mid_HashMap_ctor = env->GetMethodID(g_cls_HashMap, "<init>", "()V");\r
-    if (!g_mid_HashMap_ctor) return JNI_ERR;\r
-\r
-    g_mid_HashMap_put = env->GetMethodID(g_cls_HashMap, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");\r
-    if (!g_mid_HashMap_put) return JNI_ERR;\r
-\r
-    //OcException\r
-    clazz = env->FindClass("org/iotivity/base/OcException");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_OcException = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    g_mid_OcException_ctor = env->GetMethodID(g_cls_OcException, "<init>", "(Ljava/lang/String;Ljava/lang/String;)V");\r
-    if (!g_mid_OcException_ctor) return JNI_ERR;\r
-\r
-    g_mid_OcException_setNativeExceptionLocation = env->GetMethodID(g_cls_OcException, "setNativeExceptionLocation",\r
-        "(Ljava/lang/String;""Ljava/lang/String;""I)V");\r
-    if (!g_mid_OcException_setNativeExceptionLocation) return JNI_ERR;\r
-\r
-    //OcResource\r
-    clazz = env->FindClass("org/iotivity/base/OcResource");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_OcResource = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    g_mid_OcResource_ctor = env->GetMethodID(g_cls_OcResource, "<init>", "(J)V");\r
-    if (!g_mid_OcResource_ctor) return JNI_ERR;\r
-\r
-    //OcRepresentation\r
-    clazz = env->FindClass("org/iotivity/base/OcRepresentation");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_OcRepresentation = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    g_mid_OcRepresentation_N_ctor = env->GetMethodID(g_cls_OcRepresentation, "<init>", "(J)V");\r
-    if (!g_mid_OcRepresentation_N_ctor) return JNI_ERR;\r
-\r
-    g_mid_OcRepresentation_N_ctor_bool = env->GetMethodID(g_cls_OcRepresentation, "<init>", "(JZ)V");\r
-    if (!g_mid_OcRepresentation_N_ctor_bool) return JNI_ERR;\r
-\r
-    clazz = env->FindClass("[Lorg/iotivity/base/OcRepresentation;");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_OcRepresentation1DArray = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    clazz = env->FindClass("[[Lorg/iotivity/base/OcRepresentation;");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_OcRepresentation2DArray = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    //HeaderOptions\r
-    clazz = env->FindClass("org/iotivity/base/OcHeaderOption");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_OcHeaderOption = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-    g_mid_OcHeaderOption_ctor = env->GetMethodID(g_cls_OcHeaderOption, "<init>", "(ILjava/lang/String;)V");\r
-    if (!g_mid_OcHeaderOption_ctor) return JNI_ERR;\r
-\r
-    g_mid_OcHeaderOption_get_id = env->GetMethodID(g_cls_OcHeaderOption, "getOptionId", "()I");\r
-    if (!g_mid_OcHeaderOption_get_id) return JNI_ERR;\r
-\r
-    g_mid_OcHeaderOption_get_data = env->GetMethodID(g_cls_OcHeaderOption, "getOptionData", "()Ljava/lang/String;");\r
-    if (!g_mid_OcHeaderOption_get_data) return JNI_ERR;\r
-\r
-    //OcResourceRequest\r
-    clazz = env->FindClass("org/iotivity/base/OcResourceRequest");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_OcResourceRequest = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    g_mid_OcResourceRequest_N_ctor = env->GetMethodID(g_cls_OcResourceRequest, "<init>", "(J)V");\r
-    if (!g_mid_OcResourceRequest_N_ctor) return JNI_ERR;\r
-\r
-    //OcResourceResponse\r
-    clazz = env->FindClass("org/iotivity/base/OcResourceResponse");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_OcResourceResponse = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-\r
-    g_mid_OcResourceResponse_N_ctor = env->GetMethodID(g_cls_OcResourceResponse, "<init>", "(J)V");\r
-    if (!g_mid_OcResourceResponse_N_ctor) return JNI_ERR;\r
-\r
-    //OcResourceHandle\r
-    clazz = env->FindClass("org/iotivity/base/OcResourceHandle");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_OcResourceHandle = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-    g_mid_OcResourceHandle_N_ctor = env->GetMethodID(g_cls_OcResourceHandle, "<init>", "(J)V");\r
-    if (!g_mid_OcResourceHandle_N_ctor) return JNI_ERR;\r
-\r
-    //OcPresenceHandle\r
-    clazz = env->FindClass("org/iotivity/base/OcPresenceHandle");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_OcPresenceHandle = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-    g_mid_OcPresenceHandle_N_ctor = env->GetMethodID(g_cls_OcPresenceHandle, "<init>", "(J)V");\r
-    if (!g_mid_OcPresenceHandle_N_ctor) return JNI_ERR;\r
-\r
-    //OcRequestHandle\r
-    clazz = env->FindClass("org/iotivity/base/OcRequestHandle");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_OcRequestHandle = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-    g_mid_OcRequestHandle_N_ctor = env->GetMethodID(g_cls_OcRequestHandle, "<init>", "(J)V");\r
-    if (!g_mid_OcRequestHandle_N_ctor) return JNI_ERR;\r
-\r
-    //OcPresenceStatus\r
-    clazz = env->FindClass("org/iotivity/base/OcPresenceStatus");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_OcPresenceStatus = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-    g_mid_OcPresenceStatus_get = env->GetStaticMethodID(g_cls_OcPresenceStatus, "get",\r
-        "(Ljava/lang/String;)Lorg/iotivity/base/OcPresenceStatus;");\r
-    if (!g_mid_OcPresenceStatus_get) return JNI_ERR;\r
-\r
-    //ObservationInfo\r
-    clazz = env->FindClass("org/iotivity/base/ObservationInfo");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_ObservationInfo = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-    g_mid_ObservationInfo_N_ctor = env->GetMethodID(g_cls_ObservationInfo, "<init>", "(IB)V");\r
-    if (!g_mid_ObservationInfo_N_ctor) return JNI_ERR;\r
-\r
-    clazz = env->FindClass("org/iotivity/base/OcResourceIdentifier");\r
-    if (!clazz) return JNI_ERR;\r
-    g_cls_OcResourceIdentifier = (jclass)env->NewGlobalRef(clazz);\r
-    env->DeleteLocalRef(clazz);\r
-    g_mid_OcResourceIdentifier_N_ctor = env->GetMethodID(g_cls_OcResourceIdentifier, "<init>", "(J)V");\r
-    if (!g_mid_OcResourceIdentifier_N_ctor) return JNI_ERR;\r
-\r
-    return JNI_CURRENT_VERSION;\r
-}\r
-\r
-JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved)\r
-{\r
-    LOGI("JNI_OnUnload");\r
-    JNIEnv* env;\r
-\r
-    if (g_jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)\r
-    {\r
-        LOGE("Failed to get the environment using GetEnv()");\r
-        return;\r
-    }\r
-\r
-    env->DeleteGlobalRef(g_cls_Integer);\r
-    env->DeleteGlobalRef(g_cls_int1DArray);\r
-    env->DeleteGlobalRef(g_cls_int2DArray);\r
-    env->DeleteGlobalRef(g_cls_Double);\r
-    env->DeleteGlobalRef(g_cls_double1DArray);\r
-    env->DeleteGlobalRef(g_cls_double2DArray);\r
-    env->DeleteGlobalRef(g_cls_Boolean);\r
-    env->DeleteGlobalRef(g_cls_boolean1DArray);\r
-    env->DeleteGlobalRef(g_cls_boolean2DArray);\r
-    env->DeleteGlobalRef(g_cls_String);\r
-    env->DeleteGlobalRef(g_cls_String1DArray);\r
-    env->DeleteGlobalRef(g_cls_String2DArray);\r
-    env->DeleteGlobalRef(g_cls_LinkedList);\r
-    env->DeleteGlobalRef(g_cls_Map);\r
-    env->DeleteGlobalRef(g_cls_MapEntry);\r
-    env->DeleteGlobalRef(g_cls_Set);\r
-    env->DeleteGlobalRef(g_cls_Iterator);\r
-    env->DeleteGlobalRef(g_cls_HashMap);\r
-    env->DeleteGlobalRef(g_cls_OcResource);\r
-    env->DeleteGlobalRef(g_cls_OcException);\r
-    env->DeleteGlobalRef(g_cls_OcRepresentation);\r
-    env->DeleteGlobalRef(g_cls_OcRepresentation1DArray);\r
-    env->DeleteGlobalRef(g_cls_OcRepresentation2DArray);\r
-    env->DeleteGlobalRef(g_cls_OcResourceRequest);\r
-    env->DeleteGlobalRef(g_cls_OcResourceResponse);\r
-    env->DeleteGlobalRef(g_cls_OcResourceHandle);\r
-    env->DeleteGlobalRef(g_cls_OcPresenceHandle);\r
-    env->DeleteGlobalRef(g_cls_OcRequestHandle);\r
-    env->DeleteGlobalRef(g_cls_OcPresenceStatus);\r
-    env->DeleteGlobalRef(g_cls_OcHeaderOption);\r
-    env->DeleteGlobalRef(g_cls_ObservationInfo);\r
-    env->DeleteGlobalRef(g_cls_OcResourceIdentifier);\r
+/*
+* //******************************************************************
+* //
+* // Copyright 2015 Intel Corporation.
+* //
+* //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+* //
+* // Licensed under the Apache License, Version 2.0 (the "License");
+* // you may not use this file except in compliance with the License.
+* // You may obtain a copy of the License at
+* //
+* //      http://www.apache.org/licenses/LICENSE-2.0
+* //
+* // Unless required by applicable law or agreed to in writing, software
+* // distributed under the License is distributed on an "AS IS" BASIS,
+* // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* // See the License for the specific language governing permissions and
+* // limitations under the License.
+* //
+* //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+*/
+#include "JniOcStack.h"
+#include "OCApi.h"
+#include "OCPlatform.h"
+#include "OCRepresentation.h"
+#include "JniUtils.h"
+
+JavaVM* g_jvm = nullptr;
+
+jclass g_cls_Integer = nullptr;
+jclass g_cls_int1DArray = nullptr;
+jclass g_cls_int2DArray = nullptr;
+jclass g_cls_Double = nullptr;
+jclass g_cls_double1DArray = nullptr;
+jclass g_cls_double2DArray = nullptr;
+jclass g_cls_Boolean = nullptr;
+jclass g_cls_boolean1DArray = nullptr;
+jclass g_cls_boolean2DArray = nullptr;
+jclass g_cls_String = nullptr;
+jclass g_cls_String1DArray = nullptr;
+jclass g_cls_String2DArray = nullptr;
+jclass g_cls_LinkedList = nullptr;
+jclass g_cls_Map = nullptr;
+jclass g_cls_MapEntry = nullptr;
+jclass g_cls_Set = nullptr;
+jclass g_cls_Iterator = nullptr;
+jclass g_cls_HashMap = nullptr;
+jclass g_cls_OcException = nullptr;
+jclass g_cls_OcResource = nullptr;
+jclass g_cls_OcRepresentation = nullptr;
+jclass g_cls_OcRepresentation1DArray = nullptr;
+jclass g_cls_OcRepresentation2DArray = nullptr;
+jclass g_cls_OcResourceRequest = nullptr;
+jclass g_cls_OcResourceResponse = nullptr;
+jclass g_cls_OcResourceHandle = nullptr;
+jclass g_cls_OcPresenceHandle = nullptr;
+jclass g_cls_OcRequestHandle = nullptr;
+jclass g_cls_OcPresenceStatus = nullptr;
+jclass g_cls_OcHeaderOption = nullptr;
+jclass g_cls_ObservationInfo = nullptr;
+jclass g_cls_OcResourceIdentifier = nullptr;
+jclass g_cls_OcProvisionResult = nullptr;
+jclass g_cls_OcSecureResource = nullptr;
+jclass g_cls_OcOicSecAcl = nullptr;
+
+jmethodID g_mid_Integer_ctor = nullptr;
+jmethodID g_mid_Double_ctor = nullptr;
+jmethodID g_mid_Boolean_ctor = nullptr;
+jmethodID g_mid_LinkedList_ctor = nullptr;
+jmethodID g_mid_LinkedList_add_object = nullptr;
+jmethodID g_mid_Map_entrySet = nullptr;
+jmethodID g_mid_MapEntry_getKey = nullptr;
+jmethodID g_mid_MapEntry_getValue = nullptr;
+jmethodID g_mid_Set_iterator = nullptr;
+jmethodID g_mid_Iterator_hasNext = nullptr;
+jmethodID g_mid_Iterator_next = nullptr;
+jmethodID g_mid_HashMap_ctor = nullptr;
+jmethodID g_mid_HashMap_put = nullptr;
+jmethodID g_mid_OcException_ctor = nullptr;
+jmethodID g_mid_OcException_setNativeExceptionLocation = nullptr;
+jmethodID g_mid_OcResource_ctor = nullptr;
+jmethodID g_mid_OcRepresentation_N_ctor = nullptr;
+jmethodID g_mid_OcRepresentation_N_ctor_bool = nullptr;
+jmethodID g_mid_OcResourceRequest_N_ctor = nullptr;
+jmethodID g_mid_OcResourceResponse_N_ctor = nullptr;
+jmethodID g_mid_OcResourceHandle_N_ctor = nullptr;
+jmethodID g_mid_OcPresenceHandle_N_ctor = nullptr;
+jmethodID g_mid_OcRequestHandle_N_ctor = nullptr;
+jmethodID g_mid_OcHeaderOption_ctor = nullptr;
+jmethodID g_mid_OcHeaderOption_get_id = nullptr;
+jmethodID g_mid_OcHeaderOption_get_data = nullptr;
+jmethodID g_mid_ObservationInfo_N_ctor = nullptr;
+jmethodID g_mid_OcPresenceStatus_get = nullptr;
+jmethodID g_mid_OcResourceIdentifier_N_ctor = nullptr;
+jmethodID g_mid_OcProvisionResult_ctor = nullptr;
+jmethodID g_mid_OcSecureResource_ctor = nullptr;
+
+jmethodID g_mid_OcOicSecAcl_get_subject = nullptr;
+jmethodID g_mid_OcOicSecAcl_get_resources_cnt = nullptr;
+jmethodID g_mid_OcOicSecAcl_get_resources = nullptr;
+jmethodID g_mid_OcOicSecAcl_get_permission = nullptr;
+jmethodID g_mid_OcOicSecAcl_get_periods_cnt = nullptr;
+jmethodID g_mid_OcOicSecAcl_get_periods = nullptr;
+jmethodID g_mid_OcOicSecAcl_get_recurrences = nullptr;
+jmethodID g_mid_OcOicSecAcl_get_owners_cnt = nullptr;
+jmethodID g_mid_OcOicSecAcl_get_owners = nullptr;
+
+jobject getOcException(JNIEnv* env, const char* file, const char* functionName,
+    const int line, const int code, const char* message)
+{
+    std::string codeStr = JniUtils::stackResultToStr(code);
+    if (codeStr.empty())
+    {
+        codeStr = JniUtils::stackResultToStr(JNI_INVALID_VALUE);
+    }
+    jobject ex = env->NewObject(g_cls_OcException,
+        g_mid_OcException_ctor,
+        env->NewStringUTF(codeStr.c_str()),
+        env->NewStringUTF(message));
+    if (!ex)
+    {
+        return nullptr;
+    }
+    env->CallVoidMethod(ex,
+        g_mid_OcException_setNativeExceptionLocation,
+        env->NewStringUTF(file),
+        env->NewStringUTF(functionName),
+        line);
+    if (env->ExceptionCheck())
+    {
+        return nullptr;
+    }
+    return ex;
+}
+
+void throwOcException(JNIEnv* env, jobject ex)
+{
+    env->Throw((jthrowable)ex);
+}
+
+// JNI OnLoad
+JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)
+{
+    LOGI("JNI_OnLoad");
+    JNIEnv* env;
+    g_jvm = vm;
+
+    if (g_jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)
+    {
+        LOGE("Failed to get the environment using GetEnv()");
+        return JNI_ERR;
+    }
+
+    jclass clazz = nullptr;
+
+    //Integer
+    clazz = env->FindClass("java/lang/Integer");
+    if (!clazz) return JNI_ERR;
+    g_cls_Integer = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    g_mid_Integer_ctor = env->GetMethodID(g_cls_Integer, "<init>", "(I)V");
+    if (!g_mid_Integer_ctor) return JNI_ERR;
+
+    clazz = env->FindClass("[I");
+    if (!clazz) return JNI_ERR;
+    g_cls_int1DArray = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    clazz = env->FindClass("[[I");
+    if (!clazz) return JNI_ERR;
+    g_cls_int2DArray = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    //Double
+    clazz = env->FindClass("java/lang/Double");
+    if (!clazz) return JNI_ERR;
+    g_cls_Double = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    g_mid_Double_ctor = env->GetMethodID(g_cls_Double, "<init>", "(D)V");
+    if (!g_mid_Double_ctor) return JNI_ERR;
+
+    clazz = env->FindClass("[D");
+    if (!clazz) return JNI_ERR;
+    g_cls_double1DArray = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    clazz = env->FindClass("[[D");
+    if (!clazz) return JNI_ERR;
+    g_cls_double2DArray = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    //Boolean
+    clazz = env->FindClass("java/lang/Boolean");
+    if (!clazz) return JNI_ERR;
+    g_cls_Boolean = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    g_mid_Boolean_ctor = env->GetMethodID(g_cls_Boolean, "<init>", "(Z)V");
+    if (!g_mid_Boolean_ctor) return JNI_ERR;
+
+    clazz = env->FindClass("[Z");
+    if (!clazz) return JNI_ERR;
+    g_cls_boolean1DArray = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    clazz = env->FindClass("[[Z");
+    if (!clazz) return JNI_ERR;
+    g_cls_boolean2DArray = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    //String
+    clazz = env->FindClass("java/lang/String");
+    if (!clazz) return JNI_ERR;
+    g_cls_String = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    clazz = env->FindClass("[Ljava/lang/String;");
+    if (!clazz) return JNI_ERR;
+    g_cls_String1DArray = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    clazz = env->FindClass("[[Ljava/lang/String;");
+    if (!clazz) return JNI_ERR;
+    g_cls_String2DArray = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    //LinkedList
+    clazz = env->FindClass("java/util/LinkedList");
+    if (!clazz) return JNI_ERR;
+    g_cls_LinkedList = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    g_mid_LinkedList_ctor = env->GetMethodID(g_cls_LinkedList, "<init>", "()V");
+    if (!g_mid_LinkedList_ctor) return JNI_ERR;
+
+    g_mid_LinkedList_add_object = env->GetMethodID(g_cls_LinkedList, "add", "(Ljava/lang/Object;)Z");
+    if (!g_mid_LinkedList_add_object) return JNI_ERR;
+
+    //Map
+    clazz = env->FindClass("java/util/Map");
+    if (!clazz) return JNI_ERR;
+    g_cls_Map = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    g_mid_Map_entrySet = env->GetMethodID(g_cls_Map, "entrySet", "()Ljava/util/Set;");
+    if (!g_mid_Map_entrySet) return JNI_ERR;
+
+    //MapEntry
+    clazz = env->FindClass("java/util/Map$Entry");
+    if (!clazz) return JNI_ERR;
+    g_cls_MapEntry = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    g_mid_MapEntry_getKey = env->GetMethodID(g_cls_MapEntry, "getKey", "()Ljava/lang/Object;");
+    if (!g_mid_MapEntry_getKey) return JNI_ERR;
+    g_mid_MapEntry_getValue = env->GetMethodID(g_cls_MapEntry, "getValue", "()Ljava/lang/Object;");
+    if (!g_mid_MapEntry_getValue) return JNI_ERR;
+
+    //Set
+    clazz = env->FindClass("java/util/Set");
+    if (!clazz) return JNI_ERR;
+    g_cls_Set = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    g_mid_Set_iterator = env->GetMethodID(g_cls_Set, "iterator", "()Ljava/util/Iterator;");
+    if (!g_mid_Set_iterator) return JNI_ERR;
+
+    //Iterator
+    clazz = env->FindClass("java/util/Iterator");
+    if (!clazz) return JNI_ERR;
+    g_cls_Iterator = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    g_mid_Iterator_hasNext = env->GetMethodID(g_cls_Iterator, "hasNext", "()Z");
+    if (!g_mid_Iterator_hasNext) return JNI_ERR;
+
+    g_mid_Iterator_next = env->GetMethodID(g_cls_Iterator, "next", "()Ljava/lang/Object;");
+    if (!g_mid_Iterator_next) return JNI_ERR;
+
+    //HashMap
+    clazz = env->FindClass("java/util/HashMap");
+    if (!clazz) return JNI_ERR;
+    g_cls_HashMap = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    g_mid_HashMap_ctor = env->GetMethodID(g_cls_HashMap, "<init>", "()V");
+    if (!g_mid_HashMap_ctor) return JNI_ERR;
+
+    g_mid_HashMap_put = env->GetMethodID(g_cls_HashMap, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
+    if (!g_mid_HashMap_put) return JNI_ERR;
+
+    //OcException
+    clazz = env->FindClass("org/iotivity/base/OcException");
+    if (!clazz) return JNI_ERR;
+    g_cls_OcException = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    g_mid_OcException_ctor = env->GetMethodID(g_cls_OcException, "<init>", "(Ljava/lang/String;Ljava/lang/String;)V");
+    if (!g_mid_OcException_ctor) return JNI_ERR;
+
+    g_mid_OcException_setNativeExceptionLocation = env->GetMethodID(g_cls_OcException, "setNativeExceptionLocation",
+        "(Ljava/lang/String;""Ljava/lang/String;""I)V");
+    if (!g_mid_OcException_setNativeExceptionLocation) return JNI_ERR;
+
+    //OcResource
+    clazz = env->FindClass("org/iotivity/base/OcResource");
+    if (!clazz) return JNI_ERR;
+    g_cls_OcResource = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    g_mid_OcResource_ctor = env->GetMethodID(g_cls_OcResource, "<init>", "(J)V");
+    if (!g_mid_OcResource_ctor) return JNI_ERR;
+
+    //OcRepresentation
+    clazz = env->FindClass("org/iotivity/base/OcRepresentation");
+    if (!clazz) return JNI_ERR;
+    g_cls_OcRepresentation = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    g_mid_OcRepresentation_N_ctor = env->GetMethodID(g_cls_OcRepresentation, "<init>", "(J)V");
+    if (!g_mid_OcRepresentation_N_ctor) return JNI_ERR;
+
+    g_mid_OcRepresentation_N_ctor_bool = env->GetMethodID(g_cls_OcRepresentation, "<init>", "(JZ)V");
+    if (!g_mid_OcRepresentation_N_ctor_bool) return JNI_ERR;
+
+    clazz = env->FindClass("[Lorg/iotivity/base/OcRepresentation;");
+    if (!clazz) return JNI_ERR;
+    g_cls_OcRepresentation1DArray = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    clazz = env->FindClass("[[Lorg/iotivity/base/OcRepresentation;");
+    if (!clazz) return JNI_ERR;
+    g_cls_OcRepresentation2DArray = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    //HeaderOptions
+    clazz = env->FindClass("org/iotivity/base/OcHeaderOption");
+    if (!clazz) return JNI_ERR;
+    g_cls_OcHeaderOption = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+    g_mid_OcHeaderOption_ctor = env->GetMethodID(g_cls_OcHeaderOption, "<init>", "(ILjava/lang/String;)V");
+    if (!g_mid_OcHeaderOption_ctor) return JNI_ERR;
+
+    g_mid_OcHeaderOption_get_id = env->GetMethodID(g_cls_OcHeaderOption, "getOptionId", "()I");
+    if (!g_mid_OcHeaderOption_get_id) return JNI_ERR;
+
+    g_mid_OcHeaderOption_get_data = env->GetMethodID(g_cls_OcHeaderOption, "getOptionData", "()Ljava/lang/String;");
+    if (!g_mid_OcHeaderOption_get_data) return JNI_ERR;
+
+    //OcResourceRequest
+    clazz = env->FindClass("org/iotivity/base/OcResourceRequest");
+    if (!clazz) return JNI_ERR;
+    g_cls_OcResourceRequest = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    g_mid_OcResourceRequest_N_ctor = env->GetMethodID(g_cls_OcResourceRequest, "<init>", "(J)V");
+    if (!g_mid_OcResourceRequest_N_ctor) return JNI_ERR;
+
+    //OcResourceResponse
+    clazz = env->FindClass("org/iotivity/base/OcResourceResponse");
+    if (!clazz) return JNI_ERR;
+    g_cls_OcResourceResponse = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    g_mid_OcResourceResponse_N_ctor = env->GetMethodID(g_cls_OcResourceResponse, "<init>", "(J)V");
+    if (!g_mid_OcResourceResponse_N_ctor) return JNI_ERR;
+
+    //OcResourceHandle
+    clazz = env->FindClass("org/iotivity/base/OcResourceHandle");
+    if (!clazz) return JNI_ERR;
+    g_cls_OcResourceHandle = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+    g_mid_OcResourceHandle_N_ctor = env->GetMethodID(g_cls_OcResourceHandle, "<init>", "(J)V");
+    if (!g_mid_OcResourceHandle_N_ctor) return JNI_ERR;
+
+    //OcPresenceHandle
+    clazz = env->FindClass("org/iotivity/base/OcPresenceHandle");
+    if (!clazz) return JNI_ERR;
+    g_cls_OcPresenceHandle = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+    g_mid_OcPresenceHandle_N_ctor = env->GetMethodID(g_cls_OcPresenceHandle, "<init>", "(J)V");
+    if (!g_mid_OcPresenceHandle_N_ctor) return JNI_ERR;
+
+    //OcRequestHandle
+    clazz = env->FindClass("org/iotivity/base/OcRequestHandle");
+    if (!clazz) return JNI_ERR;
+    g_cls_OcRequestHandle = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+    g_mid_OcRequestHandle_N_ctor = env->GetMethodID(g_cls_OcRequestHandle, "<init>", "(J)V");
+    if (!g_mid_OcRequestHandle_N_ctor) return JNI_ERR;
+
+    //OcPresenceStatus
+    clazz = env->FindClass("org/iotivity/base/OcPresenceStatus");
+    if (!clazz) return JNI_ERR;
+    g_cls_OcPresenceStatus = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+    g_mid_OcPresenceStatus_get = env->GetStaticMethodID(g_cls_OcPresenceStatus, "get",
+        "(Ljava/lang/String;)Lorg/iotivity/base/OcPresenceStatus;");
+    if (!g_mid_OcPresenceStatus_get) return JNI_ERR;
+
+    //ObservationInfo
+    clazz = env->FindClass("org/iotivity/base/ObservationInfo");
+    if (!clazz) return JNI_ERR;
+    g_cls_ObservationInfo = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+    g_mid_ObservationInfo_N_ctor = env->GetMethodID(g_cls_ObservationInfo, "<init>", "(IB)V");
+    if (!g_mid_ObservationInfo_N_ctor) return JNI_ERR;
+
+    clazz = env->FindClass("org/iotivity/base/OcResourceIdentifier");
+    if (!clazz) return JNI_ERR;
+    g_cls_OcResourceIdentifier = (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+    g_mid_OcResourceIdentifier_N_ctor = env->GetMethodID(g_cls_OcResourceIdentifier, "<init>", "(J)V");
+    if (!g_mid_OcResourceIdentifier_N_ctor) return JNI_ERR;
+
+    //OcSecureResource
+    clazz = env->FindClass("org/iotivity/base/OcSecureResource");
+    if (!clazz) return JNI_ERR;
+    g_cls_OcSecureResource =  (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+    g_mid_OcSecureResource_ctor = env->GetMethodID(g_cls_OcSecureResource, "<init>", "(J)V");
+    if (!g_mid_OcSecureResource_ctor) return JNI_ERR;
+
+    //ProvisionResult
+    clazz = env->FindClass("org/iotivity/base/ProvisionResult");
+    if (!clazz) return JNI_ERR;
+    g_cls_OcProvisionResult =  (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+    g_mid_OcProvisionResult_ctor = env->GetMethodID(g_cls_OcProvisionResult, "<init>", "(Ljava/lang/String;I)V");
+    if (!g_mid_OcProvisionResult_ctor) return JNI_ERR;
+
+    //OicSecAcl
+    clazz = env->FindClass("org/iotivity/base/OicSecAcl");
+    if (!clazz) return JNI_ERR;
+    g_cls_OcOicSecAcl =  (jclass)env->NewGlobalRef(clazz);
+    env->DeleteLocalRef(clazz);
+
+    g_mid_OcOicSecAcl_get_subject = env->GetMethodID(g_cls_OcOicSecAcl, "getSubject", "()Ljava/lang/String;");
+    if (!g_mid_OcOicSecAcl_get_subject) return JNI_ERR;
+
+    g_mid_OcOicSecAcl_get_resources_cnt = env->GetMethodID(g_cls_OcOicSecAcl, "getResourcesCount", "()I");
+    if (!g_mid_OcOicSecAcl_get_resources_cnt) return JNI_ERR;
+
+    g_mid_OcOicSecAcl_get_resources = env->GetMethodID(g_cls_OcOicSecAcl, "getResources", "(I)Ljava/lang/String;");
+    if (!g_mid_OcOicSecAcl_get_resources) return JNI_ERR;
+
+    g_mid_OcOicSecAcl_get_permission = env->GetMethodID(g_cls_OcOicSecAcl, "getPermission", "()I");
+    if (!g_mid_OcOicSecAcl_get_permission) return JNI_ERR;
+
+    g_mid_OcOicSecAcl_get_periods_cnt = env->GetMethodID(g_cls_OcOicSecAcl, "getPeriodsCount", "()I");
+    if (!g_mid_OcOicSecAcl_get_periods_cnt) return JNI_ERR;
+
+    g_mid_OcOicSecAcl_get_periods = env->GetMethodID(g_cls_OcOicSecAcl, "getPeriods", "(I)Ljava/lang/String;");
+    if (!g_mid_OcOicSecAcl_get_periods) return JNI_ERR;
+
+    g_mid_OcOicSecAcl_get_recurrences = env->GetMethodID(g_cls_OcOicSecAcl, "getRecurrences", "(I)Ljava/lang/String;");
+    if (!g_mid_OcOicSecAcl_get_recurrences) return JNI_ERR;
+
+    g_mid_OcOicSecAcl_get_owners_cnt = env->GetMethodID(g_cls_OcOicSecAcl, "getOwnersCount", "()I");
+    if (!g_mid_OcOicSecAcl_get_owners_cnt) return JNI_ERR;
+
+    g_mid_OcOicSecAcl_get_owners = env->GetMethodID(g_cls_OcOicSecAcl, "getOwners", "(I)Ljava/lang/String;");
+    if (!g_mid_OcOicSecAcl_get_owners) return JNI_ERR;
+
+    return JNI_CURRENT_VERSION;
+}
+
+JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved)
+{
+    LOGI("JNI_OnUnload");
+    JNIEnv* env;
+
+    if (vm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)
+    {
+        LOGE("Failed to get the environment using GetEnv()");
+        return;
+    }
+
+    env->DeleteGlobalRef(g_cls_Integer);
+    env->DeleteGlobalRef(g_cls_int1DArray);
+    env->DeleteGlobalRef(g_cls_int2DArray);
+    env->DeleteGlobalRef(g_cls_Double);
+    env->DeleteGlobalRef(g_cls_double1DArray);
+    env->DeleteGlobalRef(g_cls_double2DArray);
+    env->DeleteGlobalRef(g_cls_Boolean);
+    env->DeleteGlobalRef(g_cls_boolean1DArray);
+    env->DeleteGlobalRef(g_cls_boolean2DArray);
+    env->DeleteGlobalRef(g_cls_String);
+    env->DeleteGlobalRef(g_cls_String1DArray);
+    env->DeleteGlobalRef(g_cls_String2DArray);
+    env->DeleteGlobalRef(g_cls_LinkedList);
+    env->DeleteGlobalRef(g_cls_Map);
+    env->DeleteGlobalRef(g_cls_MapEntry);
+    env->DeleteGlobalRef(g_cls_Set);
+    env->DeleteGlobalRef(g_cls_Iterator);
+    env->DeleteGlobalRef(g_cls_HashMap);
+    env->DeleteGlobalRef(g_cls_OcResource);
+    env->DeleteGlobalRef(g_cls_OcException);
+    env->DeleteGlobalRef(g_cls_OcRepresentation);
+    env->DeleteGlobalRef(g_cls_OcRepresentation1DArray);
+    env->DeleteGlobalRef(g_cls_OcRepresentation2DArray);
+    env->DeleteGlobalRef(g_cls_OcResourceRequest);
+    env->DeleteGlobalRef(g_cls_OcResourceResponse);
+    env->DeleteGlobalRef(g_cls_OcResourceHandle);
+    env->DeleteGlobalRef(g_cls_OcPresenceHandle);
+    env->DeleteGlobalRef(g_cls_OcRequestHandle);
+    env->DeleteGlobalRef(g_cls_OcPresenceStatus);
+    env->DeleteGlobalRef(g_cls_OcHeaderOption);
+    env->DeleteGlobalRef(g_cls_ObservationInfo);
+    env->DeleteGlobalRef(g_cls_OcResourceIdentifier);
+    env->DeleteGlobalRef(g_cls_OcSecureResource);
+    env->DeleteGlobalRef(g_cls_OcProvisionResult);
+    env->DeleteGlobalRef(g_cls_OcOicSecAcl);
 }
\ No newline at end of file