Merge 'security-basecamp' branch into master with CBOR
[platform/upstream/iotivity.git] / android / android_api / base / jni / JniOcPlatform.cpp
index 5dfe78b..2023fa4 100644 (file)
-/*
-* //******************************************************************
-* //
-* // 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 "JniOcPlatform.h"
-#include "OCPlatform.h"
-#include "JniOcResource.h"
-#include "JniOcResourceHandle.h"
-#include "JniOcPresenceHandle.h"
-#include "JniOcResourceResponse.h"
-#include "JniUtils.h"
-
-using namespace OC;
-
-JniOnResourceFoundListener* AddOnResourceFoundListener(JNIEnv* env, jobject jListener)
-{
-    JniOnResourceFoundListener *onResourceFoundListener = NULL;
-
-    resourceFoundMapLock.lock();
-
-    for (auto it = onResourceFoundListenerMap.begin(); it != onResourceFoundListenerMap.end(); ++it)
-    {
-        if (env->IsSameObject(jListener, it->first))
-        {
-            auto refPair = it->second;
-            onResourceFoundListener = refPair.first;
-            refPair.second++;
-            it->second = refPair;
-            onResourceFoundListenerMap.insert(*it);
-            LOGD("OnResourceFoundListener: ref. count incremented");
-            break;
-        }
-    }
-
-    if (!onResourceFoundListener)
-    {
-        onResourceFoundListener = new JniOnResourceFoundListener(env, jListener, RemoveOnResourceFoundListener);
-        jobject jgListener = env->NewGlobalRef(jListener);
-
-        onResourceFoundListenerMap.insert(std::pair < jobject, std::pair < JniOnResourceFoundListener*,
-            int >> (jgListener, std::pair<JniOnResourceFoundListener*, int>(onResourceFoundListener, 1)));
-        LOGD("OnResourceFoundListener: new listener");
-    }
-    resourceFoundMapLock.unlock();
-    return onResourceFoundListener;
-}
-
-void RemoveOnResourceFoundListener(JNIEnv* env, jobject jListener)
-{
-    resourceFoundMapLock.lock();
-
-    for (auto it = onResourceFoundListenerMap.begin(); it != onResourceFoundListenerMap.end(); ++it)
-    {
-        if (env->IsSameObject(jListener, it->first))
-        {
-            auto refPair = it->second;
-            if (refPair.second > 1)
-            {
-                refPair.second--;
-                it->second = refPair;
-                onResourceFoundListenerMap.insert(*it);
-                LOGI("OnResourceFoundListener: ref. count decremented");
-            }
-            else
-            {
-                env->DeleteGlobalRef(it->first);
-                JniOnResourceFoundListener* listener = refPair.first;
-                delete listener;
-                onResourceFoundListenerMap.erase(it);
-                LOGI("OnResourceFoundListener removed");
-            }
-            break;
-        }
-    }
-    resourceFoundMapLock.unlock();
-}
-
-JniOnDeviceInfoListener* AddOnDeviceInfoListener(JNIEnv* env, jobject jListener)
-{
-    JniOnDeviceInfoListener *onDeviceInfoListener = NULL;
-
-    deviceInfoMapLock.lock();
-
-    for (auto it = onDeviceInfoListenerMap.begin(); it != onDeviceInfoListenerMap.end(); ++it)
-    {
-        if (env->IsSameObject(jListener, it->first))
-        {
-            auto refPair = it->second;
-            onDeviceInfoListener = refPair.first;
-            refPair.second++;
-            it->second = refPair;
-            onDeviceInfoListenerMap.insert(*it);
-            LOGD("OnDeviceInfoListener: ref. count incremented");
-            break;
-        }
-    }
-
-    if (!onDeviceInfoListener)
-    {
-        onDeviceInfoListener = new JniOnDeviceInfoListener(env, jListener, RemoveOnDeviceInfoListener);
-        jobject jgListener = env->NewGlobalRef(jListener);
-
-        onDeviceInfoListenerMap.insert(std::pair < jobject, std::pair < JniOnDeviceInfoListener*,
-            int >> (jgListener, std::pair<JniOnDeviceInfoListener*, int>(onDeviceInfoListener, 1)));
-        LOGI("OnDeviceInfoListener: new listener");
-    }
-
-    deviceInfoMapLock.unlock();
-    return onDeviceInfoListener;
-}
-
-void RemoveOnDeviceInfoListener(JNIEnv* env, jobject jListener)
-{
-    deviceInfoMapLock.lock();
-    bool isFound = false;
-    for (auto it = onDeviceInfoListenerMap.begin(); it != onDeviceInfoListenerMap.end(); ++it)
-    {
-        if (env->IsSameObject(jListener, it->first))
-        {
-            auto refPair = it->second;
-            if (refPair.second > 1)
-            {
-                refPair.second--;
-                it->second = refPair;
-                onDeviceInfoListenerMap.insert(*it);
-                LOGI("OnDeviceInfoListener: ref. count decremented");
-            }
-            else
-            {
-                env->DeleteGlobalRef(it->first);
-                JniOnDeviceInfoListener* listener = refPair.first;
-                delete listener;
-                onDeviceInfoListenerMap.erase(it);
-
-                LOGI("OnDeviceInfoListener removed");
-            }
-
-            isFound = true;
-            break;
-        }
-    }
-
-    if (!isFound)
-    {
-        ThrowOcException(JNI_EXCEPTION, "OnDeviceInfoListenet not found");
-    }
-    deviceInfoMapLock.unlock();
+/*\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 "JniOcPlatform.h"\r
+#include "OCPlatform.h"\r
+#include "JniOcResource.h"\r
+#include "JniOcResourceHandle.h"\r
+#include "JniOcPresenceHandle.h"\r
+#include "JniOcResourceResponse.h"\r
+#include "JniOcSecurity.h"
+#include "JniUtils.h"\r
+\r
+using namespace OC;\r
+\r
+JniOnResourceFoundListener* AddOnResourceFoundListener(JNIEnv* env, jobject jListener)\r
+{\r
+    JniOnResourceFoundListener *onResourceFoundListener = NULL;\r
+\r
+    resourceFoundMapLock.lock();\r
+\r
+    for (auto it = onResourceFoundListenerMap.begin(); it != onResourceFoundListenerMap.end(); ++it)\r
+    {\r
+        if (env->IsSameObject(jListener, it->first))\r
+        {\r
+            auto refPair = it->second;\r
+            onResourceFoundListener = refPair.first;\r
+            refPair.second++;\r
+            it->second = refPair;\r
+            onResourceFoundListenerMap.insert(*it);\r
+            LOGD("OnResourceFoundListener: ref. count incremented");\r
+            break;\r
+        }\r
+    }\r
+\r
+    if (!onResourceFoundListener)\r
+    {\r
+        onResourceFoundListener = new JniOnResourceFoundListener(env, jListener, RemoveOnResourceFoundListener);\r
+        jobject jgListener = env->NewGlobalRef(jListener);\r
+\r
+        onResourceFoundListenerMap.insert(std::pair < jobject, std::pair < JniOnResourceFoundListener*,\r
+            int >> (jgListener, std::pair<JniOnResourceFoundListener*, int>(onResourceFoundListener, 1)));\r
+        LOGD("OnResourceFoundListener: new listener");\r
+    }\r
+    resourceFoundMapLock.unlock();\r
+    return onResourceFoundListener;\r
+}\r
+\r
+void RemoveOnResourceFoundListener(JNIEnv* env, jobject jListener)\r
+{\r
+    resourceFoundMapLock.lock();\r
+\r
+    for (auto it = onResourceFoundListenerMap.begin(); it != onResourceFoundListenerMap.end(); ++it)\r
+    {\r
+        if (env->IsSameObject(jListener, it->first))\r
+        {\r
+            auto refPair = it->second;\r
+            if (refPair.second > 1)\r
+            {\r
+                refPair.second--;\r
+                it->second = refPair;\r
+                onResourceFoundListenerMap.insert(*it);\r
+                LOGI("OnResourceFoundListener: ref. count decremented");\r
+            }\r
+            else\r
+            {\r
+                env->DeleteGlobalRef(it->first);\r
+                JniOnResourceFoundListener* listener = refPair.first;\r
+                delete listener;\r
+                onResourceFoundListenerMap.erase(it);\r
+                LOGI("OnResourceFoundListener removed");\r
+            }\r
+            break;\r
+        }\r
+    }\r
+    resourceFoundMapLock.unlock();\r
+}\r
+\r
+JniOnDeviceInfoListener* AddOnDeviceInfoListener(JNIEnv* env, jobject jListener)\r
+{\r
+    JniOnDeviceInfoListener *onDeviceInfoListener = NULL;\r
+\r
+    deviceInfoMapLock.lock();\r
+\r
+    for (auto it = onDeviceInfoListenerMap.begin(); it != onDeviceInfoListenerMap.end(); ++it)\r
+    {\r
+        if (env->IsSameObject(jListener, it->first))\r
+        {\r
+            auto refPair = it->second;\r
+            onDeviceInfoListener = refPair.first;\r
+            refPair.second++;\r
+            it->second = refPair;\r
+            onDeviceInfoListenerMap.insert(*it);\r
+            LOGD("OnDeviceInfoListener: ref. count incremented");\r
+            break;\r
+        }\r
+    }\r
+\r
+    if (!onDeviceInfoListener)\r
+    {\r
+        onDeviceInfoListener = new JniOnDeviceInfoListener(env, jListener, RemoveOnDeviceInfoListener);\r
+        jobject jgListener = env->NewGlobalRef(jListener);\r
+\r
+        onDeviceInfoListenerMap.insert(std::pair < jobject, std::pair < JniOnDeviceInfoListener*,\r
+            int >> (jgListener, std::pair<JniOnDeviceInfoListener*, int>(onDeviceInfoListener, 1)));\r
+        LOGI("OnDeviceInfoListener: new listener");\r
+    }\r
+\r
+    deviceInfoMapLock.unlock();\r
+    return onDeviceInfoListener;\r
+}\r
+\r
+void RemoveOnDeviceInfoListener(JNIEnv* env, jobject jListener)\r
+{\r
+    deviceInfoMapLock.lock();\r
+    bool isFound = false;\r
+    for (auto it = onDeviceInfoListenerMap.begin(); it != onDeviceInfoListenerMap.end(); ++it)\r
+    {\r
+        if (env->IsSameObject(jListener, it->first))\r
+        {\r
+            auto refPair = it->second;\r
+            if (refPair.second > 1)\r
+            {\r
+                refPair.second--;\r
+                it->second = refPair;\r
+                onDeviceInfoListenerMap.insert(*it);\r
+                LOGI("OnDeviceInfoListener: ref. count decremented");\r
+            }\r
+            else\r
+            {\r
+                env->DeleteGlobalRef(it->first);\r
+                JniOnDeviceInfoListener* listener = refPair.first;\r
+                delete listener;\r
+                onDeviceInfoListenerMap.erase(it);\r
+\r
+                LOGI("OnDeviceInfoListener removed");\r
+            }\r
+\r
+            isFound = true;\r
+            break;\r
+        }\r
+    }\r
+\r
+    if (!isFound)\r
+    {\r
+        ThrowOcException(JNI_EXCEPTION, "OnDeviceInfoListenet not found");\r
+    }\r
+    deviceInfoMapLock.unlock();\r
 }
 
 JniOnPlatformInfoListener* AddOnPlatformInfoListener(JNIEnv* env, jobject jListener)
@@ -234,170 +235,512 @@ void RemoveOnPlatformInfoListener(JNIEnv* env, jobject jListener)
         ThrowOcException(JNI_EXCEPTION, "OnPlatformInfoListenet not found");
     }
     platformInfoMapLock.unlock();
-}
-
-JniOnPresenceListener* AddOnPresenceListener(JNIEnv* env, jobject jListener)
-{
-    JniOnPresenceListener *onPresenceListener = NULL;
-
-    presenceMapLock.lock();
-
-    for (auto it = onPresenceListenerMap.begin(); it != onPresenceListenerMap.end(); ++it)
-    {
-        if (env->IsSameObject(jListener, it->first))
-        {
-            auto refPair = it->second;
-            onPresenceListener = refPair.first;
-            refPair.second++;
-            it->second = refPair;
-            onPresenceListenerMap.insert(*it);
-            LOGD("OnPresenceListener: ref. count incremented");
-            break;
-        }
-    }
-    if (!onPresenceListener)
-    {
-        onPresenceListener = new JniOnPresenceListener(env, jListener, RemoveOnPresenceListener);
-        jobject jgListener = env->NewGlobalRef(jListener);
-        onPresenceListenerMap.insert(std::pair < jobject, std::pair < JniOnPresenceListener*,
-            int >> (jgListener, std::pair<JniOnPresenceListener*, int>(onPresenceListener, 1)));
-        LOGI("OnPresenceListener: new listener");
-    }
-    presenceMapLock.unlock();
-    return onPresenceListener;
-}
-
-void RemoveOnPresenceListener(JNIEnv* env, jobject jListener)
-{
-    presenceMapLock.lock();
-    bool isFound = false;
-    for (auto it = onPresenceListenerMap.begin(); it != onPresenceListenerMap.end(); ++it)
-    {
-        if (env->IsSameObject(jListener, it->first))
-        {
-            auto refPair = it->second;
-            if (refPair.second > 1)
-            {
-                refPair.second--;
-                it->second = refPair;
-                onPresenceListenerMap.insert(*it);
-                LOGI("OnPresenceListener: ref. count decremented");
-            }
-            else
-            {
-                env->DeleteGlobalRef(it->first);
-                JniOnPresenceListener* listener = refPair.first;
-                delete listener;
-                onPresenceListenerMap.erase(it);
-                LOGI("OnPresenceListener is removed");
-            }
-            isFound = true;
-            break;
-        }
-    }
-    if (!isFound)
-    {
-        ThrowOcException(JNI_EXCEPTION, "OnPresenceListener not found");
-    }
-    presenceMapLock.unlock();
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    configure
-* Signature: (IILjava/lang/String;II)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_configure
-(JNIEnv *env, jclass clazz, jint jServiceType, jint jModeType, jstring jIpAddress, jint jPort, jint jQOS)
-{
-    LOGI("OcPlatform_configure");
-
-    std::string ipAddress;
-    if (jIpAddress)
-    {
-        ipAddress = env->GetStringUTFChars(jIpAddress, NULL);
-    }
-    uint16_t port;
-    if (jPort > 0)
-    {
-        port = static_cast<uint16_t>(jPort);
-    }
-    PlatformConfig cfg{
-        JniUtils::getServiceType(env, jServiceType),
-        JniUtils::getModeType(env, jModeType),
-        ipAddress,
-        port,
-        JniUtils::getQOS(env, static_cast<int>(jQOS))
-    };
-
-    OCPlatform::Configure(cfg);
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    notifyAllObservers0
-* Signature: (Lorg/iotivity/base/OcResourceHandle;)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyAllObservers0
-(JNIEnv *env, jclass clazz, jobject jResourceHandle)
-{
-    LOGI("OcPlatform_notifyAllObservers");
-    if (!jResourceHandle)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");
-        return;
-    }
-
-    JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-        env, jResourceHandle);
-    if (!jniOcResourceHandle) return;
-
-    try
-    {
-        OCStackResult result = OCPlatform::notifyAllObservers(jniOcResourceHandle->getOCResourceHandle());
-
-        if (OC_STACK_OK != result)
-        {
-            ThrowOcException(result, "Failed to notify all observers");
-            return;
-        }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-    }
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    notifyAllObservers1
-* Signature: (Lorg/iotivity/base/OcResourceHandle;I)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyAllObservers1
-(JNIEnv *env, jclass clazz, jobject jResourceHandle, jint jQoS)
-{
-    LOGI("OcPlatform_notifyAllObservers1");
-
-    if (!jResourceHandle)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");
-        return;
-    }
-
-    JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-        env, jResourceHandle);
-    if (!jniOcResourceHandle) return;
-
-    try{
-        OCStackResult result = OCPlatform::notifyAllObservers(
-            jniOcResourceHandle->getOCResourceHandle(),
-            JniUtils::getQOS(env, static_cast<int>(jQoS)));
-
-        if (OC_STACK_OK != result)
-        {
-            ThrowOcException(result, "Failed to notify all observers");
-            return;
+}\r
+\r
+JniOnPresenceListener* AddOnPresenceListener(JNIEnv* env, jobject jListener)\r
+{\r
+    JniOnPresenceListener *onPresenceListener = NULL;\r
+\r
+    presenceMapLock.lock();\r
+\r
+    for (auto it = onPresenceListenerMap.begin(); it != onPresenceListenerMap.end(); ++it)\r
+    {\r
+        if (env->IsSameObject(jListener, it->first))\r
+        {\r
+            auto refPair = it->second;\r
+            onPresenceListener = refPair.first;\r
+            refPair.second++;\r
+            it->second = refPair;\r
+            onPresenceListenerMap.insert(*it);\r
+            LOGD("OnPresenceListener: ref. count incremented");\r
+            break;\r
+        }\r
+    }\r
+    if (!onPresenceListener)\r
+    {\r
+        onPresenceListener = new JniOnPresenceListener(env, jListener, RemoveOnPresenceListener);\r
+        jobject jgListener = env->NewGlobalRef(jListener);\r
+        onPresenceListenerMap.insert(std::pair < jobject, std::pair < JniOnPresenceListener*,\r
+            int >> (jgListener, std::pair<JniOnPresenceListener*, int>(onPresenceListener, 1)));\r
+        LOGI("OnPresenceListener: new listener");\r
+    }\r
+    presenceMapLock.unlock();\r
+    return onPresenceListener;\r
+}\r
+\r
+void RemoveOnPresenceListener(JNIEnv* env, jobject jListener)\r
+{\r
+    presenceMapLock.lock();\r
+    bool isFound = false;\r
+    for (auto it = onPresenceListenerMap.begin(); it != onPresenceListenerMap.end(); ++it)\r
+    {\r
+        if (env->IsSameObject(jListener, it->first))\r
+        {\r
+            auto refPair = it->second;\r
+            if (refPair.second > 1)\r
+            {\r
+                refPair.second--;\r
+                it->second = refPair;\r
+                onPresenceListenerMap.insert(*it);\r
+                LOGI("OnPresenceListener: ref. count decremented");\r
+            }\r
+            else\r
+            {\r
+                env->DeleteGlobalRef(it->first);\r
+                JniOnPresenceListener* listener = refPair.first;\r
+                delete listener;\r
+                onPresenceListenerMap.erase(it);\r
+                LOGI("OnPresenceListener is removed");\r
+            }\r
+            isFound = true;\r
+            break;\r
+        }\r
+    }\r
+    if (!isFound)\r
+    {\r
+        ThrowOcException(JNI_EXCEPTION, "OnPresenceListener not found");\r
+    }\r
+    presenceMapLock.unlock();\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    configure\r
+* Signature: (IILjava/lang/String;II)V\r
+*/\r
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_configure\r
+(JNIEnv *env, jclass clazz, jint jServiceType, jint jModeType, jstring jIpAddress, jint jPort,
+                                                                 jint jQOS, jstring jDbPath)
+{\r
+    LOGI("OcPlatform_configure");\r
+\r
+    std::string ipAddress;\r
+    std::string dbfile;
+    if (jIpAddress)\r
+    {\r
+        ipAddress = env->GetStringUTFChars(jIpAddress, NULL);\r
+    }\r
+    if (jDbPath)
+    {
+        dbfile = env->GetStringUTFChars(jDbPath, nullptr);
+        JniOcSecurity::StoreDbPath(dbfile);
+    }
+    uint16_t port;\r
+    if (jPort > 0)\r
+    {\r
+        port = static_cast<uint16_t>(jPort);\r
+    }\r
+    PlatformConfig cfg{\r
+        JniUtils::getServiceType(env, jServiceType),\r
+        JniUtils::getModeType(env, jModeType),\r
+        ipAddress,\r
+        port,\r
+        JniUtils::getQOS(env, static_cast<int>(jQOS)),
+        JniOcSecurity::getOCPersistentStorage()
+    };\r
+\r
+    OCPlatform::Configure(cfg);\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    notifyAllObservers0\r
+* Signature: (Lorg/iotivity/base/OcResourceHandle;)V\r
+*/\r
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyAllObservers0\r
+(JNIEnv *env, jclass clazz, jobject jResourceHandle)\r
+{\r
+    LOGI("OcPlatform_notifyAllObservers");\r
+    if (!jResourceHandle)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");\r
+        return;\r
+    }\r
+\r
+    JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+        env, jResourceHandle);\r
+    if (!jniOcResourceHandle) return;\r
+\r
+    try\r
+    {\r
+        OCStackResult result = OCPlatform::notifyAllObservers(jniOcResourceHandle->getOCResourceHandle());\r
+\r
+        if (OC_STACK_OK != result)\r
+        {\r
+            ThrowOcException(result, "Failed to notify all observers");\r
+            return;\r
+        }\r
+    }\r
+    catch (OCException& e)\r
+    {\r
+        LOGE("%s", e.reason().c_str());\r
+        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+    }\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    notifyAllObservers1\r
+* Signature: (Lorg/iotivity/base/OcResourceHandle;I)V\r
+*/\r
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyAllObservers1\r
+(JNIEnv *env, jclass clazz, jobject jResourceHandle, jint jQoS)\r
+{\r
+    LOGI("OcPlatform_notifyAllObservers1");\r
+\r
+    if (!jResourceHandle)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");\r
+        return;\r
+    }\r
+\r
+    JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+        env, jResourceHandle);\r
+    if (!jniOcResourceHandle) return;\r
+\r
+    try{\r
+        OCStackResult result = OCPlatform::notifyAllObservers(\r
+            jniOcResourceHandle->getOCResourceHandle(),\r
+            JniUtils::getQOS(env, static_cast<int>(jQoS)));\r
+\r
+        if (OC_STACK_OK != result)\r
+        {\r
+            ThrowOcException(result, "Failed to notify all observers");\r
+            return;\r
+        }\r
+    }\r
+    catch (OCException& e)\r
+    {\r
+        LOGE("%s", e.reason().c_str());\r
+        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+    }\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    notifyListOfObservers2\r
+* Signature: (Lorg/iotivity/base/OcResourceHandle;[Ljava/lang/Byte;Lorg/iotivity/base/OcResourceResponse;)V\r
+*/\r
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyListOfObservers2\r
+(JNIEnv *env, jclass clazz, jobject jResourceHandle, jbyteArray jObservationIdArr, jobject jResourceResponse)\r
+{\r
+    LOGD("OcPlatform_notifyListOfObservers2");\r
+    if (!jResourceHandle)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");\r
+        return;\r
+    }\r
+    if (!jObservationIdArr)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "observationIdList cannot be null");\r
+        return;\r
+    }\r
+    if (!jResourceResponse)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceResponse cannot be null");\r
+        return;\r
+    }\r
+\r
+    JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+        env, jResourceHandle);\r
+    if (!jniOcResourceHandle) return;\r
+\r
+    JniOcResourceResponse* jniOcResourceResponse = JniOcResourceResponse::getJniOcResourceResponsePtr(\r
+        env, jResourceResponse);\r
+    if (!jniOcResourceResponse) return;\r
+\r
+    int len = env->GetArrayLength(jObservationIdArr);\r
+    uint8_t* bArr = (uint8_t*)env->GetByteArrayElements(jObservationIdArr, 0);\r
+\r
+    ObservationIds observationIds;\r
+    for (int i = 0; i < len; ++i)\r
+    {\r
+        observationIds.push_back(bArr[i]);\r
+    }\r
+\r
+    env->ReleaseByteArrayElements(jObservationIdArr, (jbyte*)bArr, 0);\r
+\r
+    try{\r
+        OCStackResult result = OCPlatform::notifyListOfObservers(\r
+            jniOcResourceHandle->getOCResourceHandle(),\r
+            observationIds,\r
+            jniOcResourceResponse->getOCResourceResponse());\r
+\r
+        if (OC_STACK_OK != result)\r
+        {\r
+            ThrowOcException(result, "Failed to notify all observers");\r
+        }\r
+    }\r
+    catch (OCException& e)\r
+    {\r
+        LOGE("%s", e.reason().c_str());\r
+        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+    }\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    notifyListOfObservers3\r
+* Signature: (Lorg/iotivity/base/OcResourceHandle;[Ljava/lang/Byte;Lorg/iotivity/base/OcResourceResponse;I)V\r
+*/\r
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyListOfObservers3\r
+(JNIEnv *env, jclass clazz, jobject jResourceHandle, jbyteArray jObservationIdArr, jobject jResourceResponse, jint jQoS)\r
+{\r
+    LOGD("OcPlatform_notifyListOfObservers3");\r
+    if (!jResourceHandle)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");\r
+        return;\r
+    }\r
+    if (!jObservationIdArr)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "observationIdList cannot be null");\r
+        return;\r
+    }\r
+    if (!jResourceResponse)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceResponse cannot be null");\r
+        return;\r
+    }\r
+\r
+    JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+        env, jResourceHandle);\r
+    if (!jniOcResourceHandle) return;\r
+\r
+    JniOcResourceResponse* jniOcResourceResponse = JniOcResourceResponse::getJniOcResourceResponsePtr(\r
+        env, jResourceResponse);\r
+    if (!jniOcResourceResponse) return;\r
+\r
+    int len = env->GetArrayLength(jObservationIdArr);\r
+    uint8_t* bArr = (uint8_t*)env->GetByteArrayElements(jObservationIdArr, 0);\r
+\r
+    ObservationIds observationIds;\r
+    for (int i = 0; i < len; ++i)\r
+    {\r
+        observationIds.push_back(bArr[i]);\r
+    }\r
+\r
+    env->ReleaseByteArrayElements(jObservationIdArr, (jbyte*)bArr, 0);\r
+\r
+    try{\r
+        OCStackResult result = OCPlatform::notifyListOfObservers(\r
+            jniOcResourceHandle->getOCResourceHandle(),\r
+            observationIds,\r
+            jniOcResourceResponse->getOCResourceResponse(),\r
+            JniUtils::getQOS(env, static_cast<int>(jQoS)));\r
+\r
+        if (OC_STACK_OK != result)\r
+        {\r
+            ThrowOcException(result, "Failed to notify all observers");\r
+        }\r
+    }\r
+    catch (OCException& e)\r
+    {\r
+        LOGE("%s", e.reason().c_str());\r
+        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+    }\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    findResource0\r
+* Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnResourceFoundListener;)V\r
+*/\r
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findResource0\r
+(JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceUri, jint jConnectivityType, jobject jListener)\r
+{\r
+    LOGD("OcPlatform_findResource");\r
+    std::string host;\r
+    if (jHost)\r
+    {\r
+        host = env->GetStringUTFChars(jHost, NULL);\r
+    }\r
+    std::string resourceUri;\r
+    if (jResourceUri)\r
+    {\r
+        resourceUri = env->GetStringUTFChars(jResourceUri, NULL);\r
+    }\r
+    if (!jListener)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onResourceFoundListener cannot be null");\r
+        return;\r
+    }\r
+\r
+    JniOnResourceFoundListener *onResFoundListener = AddOnResourceFoundListener(env, jListener);\r
+\r
+    FindCallback findCallback = [onResFoundListener](std::shared_ptr<OCResource> resource)\r
+    {\r
+        onResFoundListener->foundResourceCallback(resource);\r
+    };\r
+\r
+    try\r
+    {\r
+        OCStackResult result = OCPlatform::findResource(\r
+            host,\r
+            resourceUri,\r
+            JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),\r
+            findCallback);\r
+\r
+        if (OC_STACK_OK != result)\r
+        {\r
+            ThrowOcException(result, "Find resource has failed");\r
+            return;\r
+        }\r
+    }\r
+    catch (OCException& e)\r
+    {\r
+        LOGE("%s", e.reason().c_str());\r
+        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+    }\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    findResource1\r
+* Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnResourceFoundListener;I)V\r
+*/\r
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findResource1\r
+(JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceUri, jint jConnectivityType, jobject jListener, jint jQoS)\r
+{\r
+    LOGD("OcPlatform_findResource");\r
+    std::string host;\r
+    if (jHost)\r
+    {\r
+        host = env->GetStringUTFChars(jHost, NULL);\r
+    }\r
+    std::string resourceUri;\r
+    if (jResourceUri)\r
+    {\r
+        resourceUri = env->GetStringUTFChars(jResourceUri, NULL);\r
+    }\r
+    if (!jListener)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onResourceFoundListener cannot be null");\r
+        return;\r
+    }\r
+    JniOnResourceFoundListener *onResFoundListener = AddOnResourceFoundListener(env, jListener);\r
+\r
+    FindCallback findCallback = [onResFoundListener](std::shared_ptr<OCResource> resource)\r
+    {\r
+        onResFoundListener->foundResourceCallback(resource);\r
+    };\r
+\r
+    try\r
+    {\r
+        OCStackResult result = OCPlatform::findResource(\r
+            host,\r
+            resourceUri,\r
+            JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),\r
+            findCallback,\r
+            JniUtils::getQOS(env, static_cast<int>(jQoS)));\r
+\r
+        if (OC_STACK_OK != result)\r
+        {\r
+            ThrowOcException(result, "Find resource has failed");\r
+            return;\r
+        }\r
+    }\r
+    catch (OCException& e)\r
+    {\r
+        LOGE("%s", e.reason().c_str());\r
+        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+    }\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    getDeviceInfo0\r
+* Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnDeviceFoundListener;)V\r
+*/\r
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getDeviceInfo0\r
+(JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceUri, jint jConnectivityType, jobject jListener)\r
+{\r
+    LOGD("OcPlatform_getDeviceInfo0");\r
+    std::string host;\r
+    if (jHost)\r
+    {\r
+        host = env->GetStringUTFChars(jHost, NULL);\r
+    }\r
+    std::string resourceUri;\r
+    if (jResourceUri)\r
+    {\r
+        resourceUri = env->GetStringUTFChars(jResourceUri, NULL);\r
+    }\r
+    if (!jListener)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onDeviceFoundListener cannot be null");\r
+        return;\r
+    }\r
+    JniOnDeviceInfoListener *onDeviceInfoListener = AddOnDeviceInfoListener(env, jListener);\r
+\r
+    FindDeviceCallback findDeviceCallback = [onDeviceInfoListener](const OCRepresentation& ocRepresentation)\r
+    {\r
+        onDeviceInfoListener->foundDeviceCallback(ocRepresentation);\r
+    };\r
+\r
+    try\r
+    {\r
+        OCStackResult result = OCPlatform::getDeviceInfo(\r
+            host,\r
+            resourceUri,\r
+            JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),\r
+            findDeviceCallback);\r
+\r
+        if (OC_STACK_OK != result)\r
+        {\r
+            ThrowOcException(result, "Find device has failed");\r
+        }\r
+    }\r
+    catch (OCException& e)\r
+    {\r
+        LOGE("%s", e.reason().c_str());\r
+        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+    }\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    getDeviceInfo1\r
+* Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnDeviceFoundListener;I)V\r
+*/\r
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getDeviceInfo1\r
+(JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceUri, jint jConnectivityType, jobject jListener, jint jQoS)\r
+{\r
+    LOGD("OcPlatform_getDeviceInfo1");\r
+    std::string host;\r
+    if (jHost)\r
+    {\r
+        host = env->GetStringUTFChars(jHost, NULL);\r
+    }\r
+    std::string resourceUri;\r
+    if (jResourceUri)\r
+    {\r
+        resourceUri = env->GetStringUTFChars(jResourceUri, NULL);\r
+    }\r
+    if (!jListener)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onDeviceFoundListener cannot be null");\r
+        return;\r
+    }\r
+    JniOnDeviceInfoListener *onDeviceInfoListener = AddOnDeviceInfoListener(env, jListener);\r
+\r
+    FindDeviceCallback findDeviceCallback = [onDeviceInfoListener](const OCRepresentation& ocRepresentation)\r
+    {\r
+        onDeviceInfoListener->foundDeviceCallback(ocRepresentation);\r
+    };\r
+\r
+    try\r
+    {\r
+        OCStackResult result = OCPlatform::getDeviceInfo(\r
+            host,\r
+            resourceUri,\r
+            JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),\r
+            findDeviceCallback,\r
+            JniUtils::getQOS(env, static_cast<int>(jQoS)));\r
+\r
+        if (OC_STACK_OK != result)\r
+        {\r
+            ThrowOcException(result, "Find device has failed");\r
         }
     }
     catch (OCException& e)
@@ -409,57 +752,46 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyAllObservers1
 
 /*
 * Class:     org_iotivity_base_OcPlatform
-* Method:    notifyListOfObservers2
-* Signature: (Lorg/iotivity/base/OcResourceHandle;[Ljava/lang/Byte;Lorg/iotivity/base/OcResourceResponse;)V
+* Method:    getPlatformInfo0
+* Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnPlatformFoundListener;)V
 */
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyListOfObservers2
-(JNIEnv *env, jclass clazz, jobject jResourceHandle, jbyteArray jObservationIdArr, jobject jResourceResponse)
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getPlatformInfo0
+(JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceUri, jint jConnectivityType, jobject jListener)
 {
-    LOGD("OcPlatform_notifyListOfObservers2");
-    if (!jResourceHandle)
+    LOGD("OcPlatform_getPlatformInfo0");
+    std::string host;
+    if (jHost)
     {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");
-        return;
+        host = env->GetStringUTFChars(jHost, NULL);
     }
-    if (!jObservationIdArr)
+    std::string resourceUri;
+    if (jResourceUri)
     {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "observationIdList cannot be null");
-        return;
+        resourceUri = env->GetStringUTFChars(jResourceUri, NULL);
     }
-    if (!jResourceResponse)
+    if (!jListener)
     {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceResponse cannot be null");
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onPlatformFoundListener cannot be null");
         return;
     }
+    JniOnPlatformInfoListener *onPlatformInfoListener = AddOnPlatformInfoListener(env, jListener);
 
-    JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-        env, jResourceHandle);
-    if (!jniOcResourceHandle) return;
-
-    JniOcResourceResponse* jniOcResourceResponse = JniOcResourceResponse::getJniOcResourceResponsePtr(
-        env, jResourceResponse);
-    if (!jniOcResourceResponse) return;
-
-    int len = env->GetArrayLength(jObservationIdArr);
-    uint8_t* bArr = (uint8_t*)env->GetByteArrayElements(jObservationIdArr, 0);
-
-    ObservationIds observationIds;
-    for (int i = 0; i < len; ++i)
+    FindPlatformCallback findPlatformCallback = [onPlatformInfoListener](const OCRepresentation& ocRepresentation)
     {
-        observationIds.push_back(bArr[i]);
-    }
-
-    env->ReleaseByteArrayElements(jObservationIdArr, (jbyte*)bArr, 0);
+        onPlatformInfoListener->foundPlatformCallback(ocRepresentation);
+    };
 
-    try{
-        OCStackResult result = OCPlatform::notifyListOfObservers(
-            jniOcResourceHandle->getOCResourceHandle(),
-            observationIds,
-            jniOcResourceResponse->getOCResourceResponse());
+    try
+    {
+        OCStackResult result = OCPlatform::getPlatformInfo(
+            host,
+            resourceUri,
+            JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),
+            findPlatformCallback);
 
         if (OC_STACK_OK != result)
         {
-            ThrowOcException(result, "Failed to notify all observers");
+            ThrowOcException(result, "Find platform has failed");
         }
     }
     catch (OCException& e)
@@ -471,553 +803,230 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyListOfObservers2
 
 /*
 * Class:     org_iotivity_base_OcPlatform
-* Method:    notifyListOfObservers3
-* Signature: (Lorg/iotivity/base/OcResourceHandle;[Ljava/lang/Byte;Lorg/iotivity/base/OcResourceResponse;I)V
+* Method:    getPlatformInfo1
+* Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnPlatformFoundListener;I)V
 */
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyListOfObservers3
-(JNIEnv *env, jclass clazz, jobject jResourceHandle, jbyteArray jObservationIdArr, jobject jResourceResponse, jint jQoS)
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getPlatformInfo1
+(JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceUri, jint jConnectivityType, jobject jListener, jint jQoS)
 {
-    LOGD("OcPlatform_notifyListOfObservers3");
-    if (!jResourceHandle)
+    LOGD("OcPlatform_getPlatformInfo1");
+    std::string host;
+    if (jHost)
     {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");
-        return;
+        host = env->GetStringUTFChars(jHost, NULL);
     }
-    if (!jObservationIdArr)
+    std::string resourceUri;
+    if (jResourceUri)
     {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "observationIdList cannot be null");
-        return;
+        resourceUri = env->GetStringUTFChars(jResourceUri, NULL);
     }
-    if (!jResourceResponse)
+    if (!jListener)
     {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceResponse cannot be null");
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onPlatformFoundListener cannot be null");
         return;
     }
+    JniOnDeviceInfoListener *onDeviceInfoListener = AddOnDeviceInfoListener(env, jListener);
 
-    JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-        env, jResourceHandle);
-    if (!jniOcResourceHandle) return;
-
-    JniOcResourceResponse* jniOcResourceResponse = JniOcResourceResponse::getJniOcResourceResponsePtr(
-        env, jResourceResponse);
-    if (!jniOcResourceResponse) return;
-
-    int len = env->GetArrayLength(jObservationIdArr);
-    uint8_t* bArr = (uint8_t*)env->GetByteArrayElements(jObservationIdArr, 0);
-
-    ObservationIds observationIds;
-    for (int i = 0; i < len; ++i)
+    FindDeviceCallback findDeviceCallback = [onDeviceInfoListener](const OCRepresentation& ocRepresentation)
     {
-        observationIds.push_back(bArr[i]);
-    }
-
-    env->ReleaseByteArrayElements(jObservationIdArr, (jbyte*)bArr, 0);
+        onDeviceInfoListener->foundDeviceCallback(ocRepresentation);
+    };
 
-    try{
-        OCStackResult result = OCPlatform::notifyListOfObservers(
-            jniOcResourceHandle->getOCResourceHandle(),
-            observationIds,
-            jniOcResourceResponse->getOCResourceResponse(),
+    try
+    {
+        OCStackResult result = OCPlatform::getPlatformInfo(
+            host,
+            resourceUri,
+            JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),
+            findDeviceCallback,
             JniUtils::getQOS(env, static_cast<int>(jQoS)));
 
         if (OC_STACK_OK != result)
         {
-            ThrowOcException(result, "Failed to notify all observers");
-        }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-    }
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    findResource0
-* Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnResourceFoundListener;)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findResource0
-(JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceUri, jint jConnectivityType, jobject jListener)
-{
-    LOGD("OcPlatform_findResource");
-    std::string host;
-    if (jHost)
-    {
-        host = env->GetStringUTFChars(jHost, NULL);
-    }
-    std::string resourceUri;
-    if (jResourceUri)
-    {
-        resourceUri = env->GetStringUTFChars(jResourceUri, NULL);
-    }
-    if (!jListener)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "onResourceFoundListener cannot be null");
-        return;
-    }
-
-    JniOnResourceFoundListener *onResFoundListener = AddOnResourceFoundListener(env, jListener);
-
-    FindCallback findCallback = [onResFoundListener](std::shared_ptr<OCResource> resource)
-    {
-        onResFoundListener->foundResourceCallback(resource);
-    };
-
-    try
-    {
-        OCStackResult result = OCPlatform::findResource(
-            host,
-            resourceUri,
-            JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),
-            findCallback);
-
-        if (OC_STACK_OK != result)
-        {
-            ThrowOcException(result, "Find resource has failed");
-            return;
-        }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-    }
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    findResource1
-* Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnResourceFoundListener;I)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findResource1
-(JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceUri, jint jConnectivityType, jobject jListener, jint jQoS)
-{
-    LOGD("OcPlatform_findResource");
-    std::string host;
-    if (jHost)
-    {
-        host = env->GetStringUTFChars(jHost, NULL);
-    }
-    std::string resourceUri;
-    if (jResourceUri)
-    {
-        resourceUri = env->GetStringUTFChars(jResourceUri, NULL);
-    }
-    if (!jListener)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "onResourceFoundListener cannot be null");
-        return;
-    }
-    JniOnResourceFoundListener *onResFoundListener = AddOnResourceFoundListener(env, jListener);
-
-    FindCallback findCallback = [onResFoundListener](std::shared_ptr<OCResource> resource)
-    {
-        onResFoundListener->foundResourceCallback(resource);
-    };
-
-    try
-    {
-        OCStackResult result = OCPlatform::findResource(
-            host,
-            resourceUri,
-            JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),
-            findCallback,
-            JniUtils::getQOS(env, static_cast<int>(jQoS)));
-
-        if (OC_STACK_OK != result)
-        {
-            ThrowOcException(result, "Find resource has failed");
-            return;
-        }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-    }
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    getDeviceInfo0
-* Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnDeviceFoundListener;)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getDeviceInfo0
-(JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceUri, jint jConnectivityType, jobject jListener)
-{
-    LOGD("OcPlatform_getDeviceInfo0");
-    std::string host;
-    if (jHost)
-    {
-        host = env->GetStringUTFChars(jHost, NULL);
-    }
-    std::string resourceUri;
-    if (jResourceUri)
-    {
-        resourceUri = env->GetStringUTFChars(jResourceUri, NULL);
-    }
-    if (!jListener)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "onDeviceFoundListener cannot be null");
-        return;
-    }
-    JniOnDeviceInfoListener *onDeviceInfoListener = AddOnDeviceInfoListener(env, jListener);
-
-    FindDeviceCallback findDeviceCallback = [onDeviceInfoListener](const OCRepresentation& ocRepresentation)
-    {
-        onDeviceInfoListener->foundDeviceCallback(ocRepresentation);
-    };
-
-    try
-    {
-        OCStackResult result = OCPlatform::getDeviceInfo(
-            host,
-            resourceUri,
-            JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),
-            findDeviceCallback);
-
-        if (OC_STACK_OK != result)
-        {
-            ThrowOcException(result, "Find device has failed");
-        }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-    }
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    getDeviceInfo1
-* Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnDeviceFoundListener;I)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getDeviceInfo1
-(JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceUri, jint jConnectivityType, jobject jListener, jint jQoS)
-{
-    LOGD("OcPlatform_getDeviceInfo1");
-    std::string host;
-    if (jHost)
-    {
-        host = env->GetStringUTFChars(jHost, NULL);
-    }
-    std::string resourceUri;
-    if (jResourceUri)
-    {
-        resourceUri = env->GetStringUTFChars(jResourceUri, NULL);
-    }
-    if (!jListener)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "onDeviceFoundListener cannot be null");
-        return;
-    }
-    JniOnDeviceInfoListener *onDeviceInfoListener = AddOnDeviceInfoListener(env, jListener);
-
-    FindDeviceCallback findDeviceCallback = [onDeviceInfoListener](const OCRepresentation& ocRepresentation)
-    {
-        onDeviceInfoListener->foundDeviceCallback(ocRepresentation);
-    };
-
-    try
-    {
-        OCStackResult result = OCPlatform::getDeviceInfo(
-            host,
-            resourceUri,
-            JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),
-            findDeviceCallback,
-            JniUtils::getQOS(env, static_cast<int>(jQoS)));
-
-        if (OC_STACK_OK != result)
-        {
-            ThrowOcException(result, "Find device has failed");
-        }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-    }
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    getPlatformInfo0
-* Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnPlatformFoundListener;)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getPlatformInfo0
-(JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceUri, jint jConnectivityType, jobject jListener)
-{
-    LOGD("OcPlatform_getPlatformInfo0");
-    std::string host;
-    if (jHost)
-    {
-        host = env->GetStringUTFChars(jHost, NULL);
-    }
-    std::string resourceUri;
-    if (jResourceUri)
-    {
-        resourceUri = env->GetStringUTFChars(jResourceUri, NULL);
-    }
-    if (!jListener)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "onPlatformFoundListener cannot be null");
-        return;
-    }
-    JniOnPlatformInfoListener *onPlatformInfoListener = AddOnPlatformInfoListener(env, jListener);
-
-    FindPlatformCallback findPlatformCallback = [onPlatformInfoListener](const OCRepresentation& ocRepresentation)
-    {
-        onPlatformInfoListener->foundPlatformCallback(ocRepresentation);
-    };
-
-    try
-    {
-        OCStackResult result = OCPlatform::getPlatformInfo(
-            host,
-            resourceUri,
-            JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),
-            findPlatformCallback);
-
-        if (OC_STACK_OK != result)
-        {
-            ThrowOcException(result, "Find platform has failed");
-        }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-    }
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    getPlatformInfo1
-* Signature: (Ljava/lang/String;Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnPlatformFoundListener;I)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getPlatformInfo1
-(JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceUri, jint jConnectivityType, jobject jListener, jint jQoS)
-{
-    LOGD("OcPlatform_getPlatformInfo1");
-    std::string host;
-    if (jHost)
-    {
-        host = env->GetStringUTFChars(jHost, NULL);
-    }
-    std::string resourceUri;
-    if (jResourceUri)
-    {
-        resourceUri = env->GetStringUTFChars(jResourceUri, NULL);
-    }
-    if (!jListener)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "onPlatformFoundListener cannot be null");
-        return;
-    }
-    JniOnDeviceInfoListener *onDeviceInfoListener = AddOnDeviceInfoListener(env, jListener);
-
-    FindDeviceCallback findDeviceCallback = [onDeviceInfoListener](const OCRepresentation& ocRepresentation)
-    {
-        onDeviceInfoListener->foundDeviceCallback(ocRepresentation);
-    };
-
-    try
-    {
-        OCStackResult result = OCPlatform::getPlatformInfo(
-            host,
-            resourceUri,
-            JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),
-            findDeviceCallback,
-            JniUtils::getQOS(env, static_cast<int>(jQoS)));
-
-        if (OC_STACK_OK != result)
-        {
-            ThrowOcException(result, "Find platform has failed");
-        }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-    }
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    registerResource0
-* Signature: (Lorg/iotivity/base/OcResource;)Lorg/iotivity/base/OcResourceHandle;
-*/
-JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_registerResource0
-(JNIEnv *env, jclass clazz, jobject jResource)
-{
-    LOGD("OcPlatform_registerResource");
-    if (!jResource)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "Resource cannot be null");
-        return nullptr;
-    }
-    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, jResource);
-    if (!resource) return nullptr;
-    LOGD("OcPlatform_registerResource1");
-    OCResourceHandle resourceHandle;
-    try
-    {
-        LOGD("OcPlatform_registerResource2");
-        OCStackResult result = OCPlatform::registerResource(
-            resourceHandle,
-            resource->getOCResource());
-        LOGD("OcPlatform_registerResource3");
-
-        if (OC_STACK_OK != result)
-        {
-            ThrowOcException(result, "register resource");
-        }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-        return nullptr;
-    }
-    LOGD("OcPlatform_registerResource4");
-    JniOcResourceHandle* jniHandle = new JniOcResourceHandle(resourceHandle);
-    jlong handle = reinterpret_cast<jlong>(jniHandle);
-    jobject jResourceHandle = env->NewObject(g_cls_OcResourceHandle, g_mid_OcResourceHandle_N_ctor, handle);
-    LOGD("OcPlatform_registerResource5");
-    if (!jResourceHandle)
-    {
-        LOGE("Failed to create OcResourceHandle");
-        delete jniHandle;
-    }
-    return jResourceHandle;
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    registerResource1
-* Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/iotivity/base/OcPlatform/EntityHandler;I)Lorg/iotivity/base/OcResourceHandle;
-*/
-JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_registerResource1
-(JNIEnv *env, jclass clazz, jstring jResourceUri, jstring jResourceTypeName, jstring jResourceInterface,
-jobject jListener, jint jResourceProperty)
-{
-    LOGI("OcPlatform_registerResource1");
-    std::string resourceUri;
-    if (jResourceUri)
-    {
-        resourceUri = env->GetStringUTFChars(jResourceUri, NULL);
-    }
-    std::string resourceTypeName;
-    if (jResourceTypeName)
-    {
-        resourceTypeName = env->GetStringUTFChars(jResourceTypeName, NULL);
-    }
-    std::string resourceInterface;
-    if (jResourceInterface)
-    {
-        resourceInterface = env->GetStringUTFChars(jResourceInterface, NULL);
-    }
-    if (!jListener)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "entityHandler cannot be null");
-        return nullptr;
-    }
-    JniEntityHandler* entityHandler = new JniEntityHandler(env, jListener);
-    EntityHandler handleEntityCallback = [entityHandler](const std::shared_ptr<OCResourceRequest> request) ->
-        OCEntityHandlerResult{
-        return entityHandler->handleEntity(request);
-    };
-
-    OCResourceHandle resourceHandle;
-    try
-    {
-        OCStackResult result = OCPlatform::registerResource(
-            resourceHandle,
-            resourceUri,
-            resourceTypeName,
-            resourceInterface,
-            handleEntityCallback,
-            static_cast<int>(jResourceProperty));
-
-        if (OC_STACK_OK != result)
-        {
-            delete entityHandler;
-            ThrowOcException(result, "register resource");
-            return nullptr;
-        }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        delete entityHandler;
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-        return nullptr;
-    }
-
-    JniOcResourceHandle* jniHandle = new JniOcResourceHandle(resourceHandle);
-    jlong handle = reinterpret_cast<jlong>(jniHandle);
-    jobject jResourceHandle = env->NewObject(g_cls_OcResourceHandle, g_mid_OcResourceHandle_N_ctor, handle);
-    if (!jResourceHandle)
-    {
-        LOGE("Failed to create OcResourceHandle");
-        delete jniHandle;
-    }
-
-    return jResourceHandle;
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    registerDeviceInfo0
-* Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_registerDeviceInfo0
-(JNIEnv *env,
-jclass clazz,
-jstring jDeviceName)
-{
-    LOGI("OcPlatform_registerDeviceInfo");
-
-    std::string deviceName;
-    if (jDeviceName)
-    {
-        deviceName = env->GetStringUTFChars(jDeviceName, NULL);
-    }
-
-    OCDeviceInfo deviceInfo;
-    try
-    {
-        DuplicateString(&deviceInfo.deviceName, deviceName);
-    }
-    catch (std::exception &e)
-    {
-        ThrowOcException(JNI_EXCEPTION, "Failed to construct device info");
-        return;
-    }
-
-    try
-    {
-        OCStackResult result = OCPlatform::registerDeviceInfo(deviceInfo);
-
-        delete deviceInfo.deviceName;
-
-        if (OC_STACK_OK != result)
-        {
-            ThrowOcException(result, "Failed to register device info");
-            return;
-        }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-    }
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
+            ThrowOcException(result, "Find platform has failed");
+        }\r
+    }\r
+    catch (OCException& e)\r
+    {\r
+        LOGE("%s", e.reason().c_str());\r
+        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+    }\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    registerResource0\r
+* Signature: (Lorg/iotivity/base/OcResource;)Lorg/iotivity/base/OcResourceHandle;\r
+*/\r
+JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_registerResource0\r
+(JNIEnv *env, jclass clazz, jobject jResource)\r
+{\r
+    LOGD("OcPlatform_registerResource");\r
+    if (!jResource)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "Resource cannot be null");\r
+        return nullptr;\r
+    }\r
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, jResource);\r
+    if (!resource) return nullptr;\r
+    LOGD("OcPlatform_registerResource1");
+    OCResourceHandle resourceHandle;\r
+    try\r
+    {\r
+        LOGD("OcPlatform_registerResource2");
+        OCStackResult result = OCPlatform::registerResource(\r
+            resourceHandle,\r
+            resource->getOCResource());\r
+        LOGD("OcPlatform_registerResource3");
+\r
+        if (OC_STACK_OK != result)\r
+        {\r
+            ThrowOcException(result, "register resource");\r
+        }\r
+    }\r
+    catch (OCException& e)\r
+    {\r
+        LOGE("%s", e.reason().c_str());\r
+        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+        return nullptr;\r
+    }\r
+    LOGD("OcPlatform_registerResource4");
+    JniOcResourceHandle* jniHandle = new JniOcResourceHandle(resourceHandle);\r
+    jlong handle = reinterpret_cast<jlong>(jniHandle);\r
+    jobject jResourceHandle = env->NewObject(g_cls_OcResourceHandle, g_mid_OcResourceHandle_N_ctor, handle);\r
+    LOGD("OcPlatform_registerResource5");
+    if (!jResourceHandle)\r
+    {\r
+        LOGE("Failed to create OcResourceHandle");\r
+        delete jniHandle;\r
+    }\r
+    return jResourceHandle;\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    registerResource1\r
+* Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/iotivity/base/OcPlatform/EntityHandler;I)Lorg/iotivity/base/OcResourceHandle;\r
+*/\r
+JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_registerResource1\r
+(JNIEnv *env, jclass clazz, jstring jResourceUri, jstring jResourceTypeName, jstring jResourceInterface,\r
+jobject jListener, jint jResourceProperty)\r
+{\r
+    LOGI("OcPlatform_registerResource1");\r
+    std::string resourceUri;\r
+    if (jResourceUri)\r
+    {\r
+        resourceUri = env->GetStringUTFChars(jResourceUri, NULL);\r
+    }\r
+    std::string resourceTypeName;\r
+    if (jResourceTypeName)\r
+    {\r
+        resourceTypeName = env->GetStringUTFChars(jResourceTypeName, NULL);\r
+    }\r
+    std::string resourceInterface;\r
+    if (jResourceInterface)\r
+    {\r
+        resourceInterface = env->GetStringUTFChars(jResourceInterface, NULL);\r
+    }\r
+    if (!jListener)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "entityHandler cannot be null");\r
+        return nullptr;\r
+    }\r
+    JniEntityHandler* entityHandler = new JniEntityHandler(env, jListener);\r
+    EntityHandler handleEntityCallback = [entityHandler](const std::shared_ptr<OCResourceRequest> request) ->\r
+        OCEntityHandlerResult{\r
+        return entityHandler->handleEntity(request);\r
+    };\r
+\r
+    OCResourceHandle resourceHandle;\r
+    try\r
+    {\r
+        OCStackResult result = OCPlatform::registerResource(\r
+            resourceHandle,\r
+            resourceUri,\r
+            resourceTypeName,\r
+            resourceInterface,\r
+            handleEntityCallback,\r
+            static_cast<int>(jResourceProperty));\r
+\r
+        if (OC_STACK_OK != result)\r
+        {\r
+            delete entityHandler;\r
+            ThrowOcException(result, "register resource");\r
+            return nullptr;\r
+        }\r
+    }\r
+    catch (OCException& e)\r
+    {\r
+        LOGE("%s", e.reason().c_str());\r
+        delete entityHandler;\r
+        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+        return nullptr;\r
+    }\r
+\r
+    JniOcResourceHandle* jniHandle = new JniOcResourceHandle(resourceHandle);\r
+    jlong handle = reinterpret_cast<jlong>(jniHandle);\r
+    jobject jResourceHandle = env->NewObject(g_cls_OcResourceHandle, g_mid_OcResourceHandle_N_ctor, handle);\r
+    if (!jResourceHandle)\r
+    {\r
+        LOGE("Failed to create OcResourceHandle");\r
+        delete jniHandle;\r
+    }\r
+\r
+    return jResourceHandle;\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    registerDeviceInfo0\r
+* Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V\r
+*/\r
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_registerDeviceInfo0\r
+(JNIEnv *env,\r
+jclass clazz,\r
+jstring jDeviceName)\r
+{\r
+    LOGI("OcPlatform_registerDeviceInfo");\r
+\r
+    std::string deviceName;\r
+    if (jDeviceName)\r
+    {\r
+        deviceName = env->GetStringUTFChars(jDeviceName, NULL);\r
+    }\r
+\r
+    OCDeviceInfo deviceInfo;\r
+    try\r
+    {\r
+        DuplicateString(&deviceInfo.deviceName, deviceName);\r
+    }\r
+    catch (std::exception &e)\r
+    {\r
+        ThrowOcException(JNI_EXCEPTION, "Failed to construct device info");\r
+        return;\r
+    }\r
+\r
+    try\r
+    {\r
+        OCStackResult result = OCPlatform::registerDeviceInfo(deviceInfo);\r
+\r
+        delete deviceInfo.deviceName;\r
+\r
+        if (OC_STACK_OK != result)\r
+        {\r
+            ThrowOcException(result, "Failed to register device info");\r
+            return;\r
+        }\r
+    }\r
+    catch (OCException& e)\r
+    {\r
+        LOGE("%s", e.reason().c_str());\r
+        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+    }\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
 * Method:    registerPlatformInfo0
 * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
 */
@@ -1065,750 +1074,750 @@ jstring jSystemTime)
         }
         if (jModelNumber)
         {
-            modelNumber = env->GetStringUTFChars(jModelNumber, NULL);
-        }
-        if (jDateOfManufacture)
-        {
-            dateOfManufacture = env->GetStringUTFChars(jDateOfManufacture, NULL);
-        }
-        if (jPlatformVersion)
-        {
-            platformVersion = env->GetStringUTFChars(jPlatformVersion, NULL);
-        }
-        if (jOperatingSystemVersion)
-        {
-            operatingSystemVersion = env->GetStringUTFChars(jOperatingSystemVersion, NULL);
-        }
-        if (jHardwareVersion)
-        {
-            hardwareVersion = env->GetStringUTFChars(jHardwareVersion, NULL);
-        }
-        if (jFirmwareVersion)
-        {
-            firmwareVersion = env->GetStringUTFChars(jFirmwareVersion, NULL);
-        }
-        if (jSupportUrl)
-        {
-            supportUrl = env->GetStringUTFChars(jSupportUrl, NULL);
-        }
-        if (jSystemTime)
-        {
-            systemTime = env->GetStringUTFChars(jSystemTime, NULL);
-        }
-
-        OCPlatformInfo platformInfo;
-        try
-        {
-            DuplicateString(&platformInfo.platformID, platformID);
-            DuplicateString(&platformInfo.manufacturerName, manufacturerName);
-            DuplicateString(&platformInfo.manufacturerUrl, manufacturerUrl);
-            DuplicateString(&platformInfo.modelNumber, modelNumber);
-            DuplicateString(&platformInfo.dateOfManufacture, dateOfManufacture);
-            DuplicateString(&platformInfo.platformVersion, platformVersion);
-            DuplicateString(&platformInfo.operatingSystemVersion, operatingSystemVersion);
-            DuplicateString(&platformInfo.hardwareVersion, hardwareVersion);
-            DuplicateString(&platformInfo.firmwareVersion, firmwareVersion);
-            DuplicateString(&platformInfo.supportUrl, supportUrl);
-            DuplicateString(&platformInfo.systemTime, systemTime);
-        }
-        catch (std::exception &e)
-        {
-            ThrowOcException(JNI_EXCEPTION, "Failed to construct platform info");
-            return;
-        }
-
-       // __android_log_print(ANDROID_LOG_INFO, "Rahul", "platformID  = %s", platformID);
-        try
-        {
-            OCStackResult result = OCPlatform::registerPlatformInfo(platformInfo);
-
-            delete platformInfo.platformID;
-            delete platformInfo.manufacturerName;
-            delete platformInfo.manufacturerUrl;
-            delete platformInfo.modelNumber;
-            delete platformInfo.dateOfManufacture;
-            delete platformInfo.platformVersion;
-            delete platformInfo.operatingSystemVersion;
-            delete platformInfo.hardwareVersion;
-            delete platformInfo.firmwareVersion;
-            delete platformInfo.supportUrl;
-            delete platformInfo.systemTime;
-
-            if (OC_STACK_OK != result)
-            {
-                ThrowOcException(result, "Failed to register platform info");
-                return;
-            }
-        }
-        catch (OCException& e)
-        {
-            LOGE("Error is due to %s", e.reason().c_str());
-            ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-        }
-
-
-
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    unregisterResource0
-* Signature: (Lorg/iotivity/base/OcResourceHandle;)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unregisterResource0
-(JNIEnv *env, jclass clazz, jobject jResourceHandle)
-{
-    LOGI("OcPlatform_unregisterResource");
-    if (!jResourceHandle)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");
-        return;
-    }
-    JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-        env, jResourceHandle);
-    if (!jniOcResourceHandle) return;
-
-    try
-    {
-        OCResourceHandle resHandle = jniOcResourceHandle->getOCResourceHandle();
-        OCStackResult result = OCPlatform::unregisterResource(resHandle);
-        if (OC_STACK_OK != result)
-        {
-            ThrowOcException(result, "Failed to unregister resource");
-        }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-    }
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    bindResource0
-* Signature: (Lorg/iotivity/base/OcResourceHandle;Lorg/iotivity/base/OcResourceHandle;)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindResource0
-(JNIEnv *env, jclass clazz, jobject jResourceCollectionHandle, jobject jResourceHandle)
-{
-    LOGI("OcPlatform_bindResource");
-    if (!jResourceCollectionHandle)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceCollectionHandle cannot be null");
-        return;
-    }
-    if (!jResourceHandle)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");
-        return;
-    }
-    JniOcResourceHandle* jniOcResourceCollectionHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-        env, jResourceCollectionHandle);
-    if (!jniOcResourceCollectionHandle) return;
-
-    JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-        env, jResourceHandle);
-    if (!jniOcResourceHandle) return;
-
-    try
-    {
-        OCStackResult result = OCPlatform::bindResource(
-            jniOcResourceCollectionHandle->getOCResourceHandle(),
-            jniOcResourceHandle->getOCResourceHandle()
-            );
-
-        if (OC_STACK_OK != result)
-        {
-            ThrowOcException(result, "Failed to bind resource");
-        }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-    }
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    bindResources0
-* Signature: (Lorg/iotivity/base/OcResourceHandle;[Lorg/iotivity/base/OcResourceHandle;)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindResources0
-(JNIEnv *env, jclass clazz, jobject jResourceCollectionHandle, jobjectArray jResourceHandleArray)
-{
-    LOGI("OcPlatform_bindResources");
-
-    if (!jResourceCollectionHandle)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceCollectionHandle cannot be null");
-        return;
-    }
-    if (!jResourceHandleArray)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandleList cannot be null");
-        return;
-    }
-
-    JniOcResourceHandle* jniOcResourceCollectionHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-        env, jResourceCollectionHandle);
-    if (!jniOcResourceCollectionHandle) return;
-
-    std::vector<OCResourceHandle> resourceHandleList;
-    int len = env->GetArrayLength(jResourceHandleArray);
-    for (int i = 0; i < len; ++i)
-    {
-        jobject jResourceHandle = env->GetObjectArrayElement(jResourceHandleArray, i);
-        if (!jResourceHandle)
-        {
-            ThrowOcException(JNI_EXCEPTION, "resource handle cannot be null");
-            return;
-        }
-
-        JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-            env, jResourceHandle);
-        if (!jniOcResourceHandle) return;
-
-        resourceHandleList.push_back(
-            jniOcResourceHandle->getOCResourceHandle());
-    }
-
-    try
-    {
-        OCStackResult result = OCPlatform::bindResources(
-            jniOcResourceCollectionHandle->getOCResourceHandle(),
-            resourceHandleList
-            );
-
-        if (OC_STACK_OK != result)
-        {
-            ThrowOcException(result, "Failed to bind resources");
-        }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-    }
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    unbindResource0
-* Signature: (Lorg/iotivity/base/OcResourceHandle;Lorg/iotivity/base/OcResourceHandle;)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unbindResource0
-(JNIEnv *env, jclass clazz, jobject jResourceCollectionHandle, jobject jResourceHandle)
-{
-    LOGI("OcPlatform_unbindResource");
-    if (!jResourceCollectionHandle)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceCollectionHandle cannot be null");
-        return;
-    }
-    if (!jResourceHandle)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");
-        return;
-    }
-
-    JniOcResourceHandle* jniOcResourceCollectionHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-        env, jResourceCollectionHandle);
-    if (!jniOcResourceCollectionHandle) return;
-
-    JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-        env, jResourceHandle);
-    if (!jniOcResourceHandle) return;
-
-    try
-    {
-        OCStackResult result = OCPlatform::unbindResource(
-            jniOcResourceCollectionHandle->getOCResourceHandle(),
-            jniOcResourceHandle->getOCResourceHandle()
-            );
-
-        if (OC_STACK_OK != result)
-        {
-            ThrowOcException(result, "Failed to unbind resource");
-        }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-    }
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    unbindResources0
-* Signature: (Lorg/iotivity/base/OcResourceHandle;[Lorg/iotivity/base/OcResourceHandle;)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unbindResources0
-(JNIEnv *env, jclass clazz, jobject jResourceCollectionHandle, jobjectArray jResourceHandleArray)
-{
-    LOGI("OcPlatform_unbindResources");
-    if (!jResourceCollectionHandle)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceCollectionHandle cannot be null");
-        return;
-    }
-    if (!jResourceHandleArray)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandleList cannot be null");
-        return;
-    }
-
-    JniOcResourceHandle* jniOcResourceCollectionHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-        env, jResourceCollectionHandle);
-    if (!jniOcResourceCollectionHandle) return;
-
-    std::vector<OCResourceHandle> resourceHandleList;
-    int len = env->GetArrayLength(jResourceHandleArray);
-    for (int i = 0; i < len; ++i)
-    {
-        jobject jResourceHandle = env->GetObjectArrayElement(jResourceHandleArray, i);
-        if (!jResourceHandle)
-        {
-            ThrowOcException(JNI_EXCEPTION, "resource handle cannot be null");
-            return;
-        }
-
-        JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-            env, jResourceHandle);
-        if (!jniOcResourceHandle) return;
-
-        resourceHandleList.push_back(
-            jniOcResourceHandle->getOCResourceHandle());
-    }
-
-    try
-    {
-        OCStackResult result = OCPlatform::unbindResources(
-            jniOcResourceCollectionHandle->getOCResourceHandle(),
-            resourceHandleList
-            );
-
-        if (OC_STACK_OK != result)
-        {
-            ThrowOcException(result, "Failed to unbind resources");
-        }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-    }
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    bindTypeToResource0
-* Signature: (Lorg/iotivity/base/OcResourceHandle;Ljava/lang/String;)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindTypeToResource0
-(JNIEnv *env, jclass clazz, jobject jResourceHandle, jstring jResourceTypeName)
-{
-    LOGI("OcPlatform_bindTypeToResource");
-    if (!jResourceHandle)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");
-        return;
-    }
-    std::string typeName;
-    if (jResourceTypeName)
-    {
-        typeName = env->GetStringUTFChars(jResourceTypeName, NULL);
-    }
-
-    JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-        env, jResourceHandle);
-    if (!jniOcResourceHandle) return;
-
-    try
-    {
-        OCStackResult result = OCPlatform::bindTypeToResource(
-            jniOcResourceHandle->getOCResourceHandle(),
-            typeName
-            );
-
-        if (OC_STACK_OK != result)
+            modelNumber = env->GetStringUTFChars(jModelNumber, NULL);
+        }
+        if (jDateOfManufacture)
         {
-            ThrowOcException(result, "Failed to bind type to resource");
+            dateOfManufacture = env->GetStringUTFChars(jDateOfManufacture, NULL);
         }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-    }
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    bindInterfaceToResource0
-* Signature: (Lorg/iotivity/base/OcResourceHandle;Ljava/lang/String;)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindInterfaceToResource0
-(JNIEnv *env, jclass clazz, jobject jResourceHandle, jstring jResourceInterfaceName)
-{
-    LOGI("OcPlatform_bindInterfaceToResource");
-    if (!jResourceHandle)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");
-        return;
-    }
-    std::string interfaceName;
-    if (jResourceInterfaceName)
-    {
-        interfaceName = env->GetStringUTFChars(jResourceInterfaceName, NULL);
-    }
-
-    JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-        env, jResourceHandle);
-    if (!jniOcResourceHandle) return;
-
-    try
-    {
-        OCStackResult result = OCPlatform::bindInterfaceToResource(
-            jniOcResourceHandle->getOCResourceHandle(),
-            interfaceName
-            );
-
-        if (OC_STACK_OK != result)
+        if (jPlatformVersion)
         {
-            ThrowOcException(result, "Failed to bind interface to resource");
+            platformVersion = env->GetStringUTFChars(jPlatformVersion, NULL);
         }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-    }
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    startPresence0
-* Signature: (I)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_startPresence0
-(JNIEnv *env, jclass clazz, jint ttl)
-{
-    LOGI("OcPlatform_startPresence");
-
-    try
-    {
-        OCStackResult result = OCPlatform::startPresence((unsigned int)ttl);
-
-        if (OC_STACK_OK != result)
+        if (jOperatingSystemVersion)
         {
-            ThrowOcException(result, "Failed to start presence");
+            operatingSystemVersion = env->GetStringUTFChars(jOperatingSystemVersion, NULL);
         }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-    }
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    stopPresence0
-* Signature: ()V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_stopPresence0
-(JNIEnv *env, jclass clazz)
-{
-    LOGI("OcPlatform_stopPresence");
-
-    try
-    {
-        OCStackResult result = OCPlatform::stopPresence();
-
-        if (OC_STACK_OK != result)
+        if (jHardwareVersion)
         {
-            ThrowOcException(result, "Failed to stop presence");
+            hardwareVersion = env->GetStringUTFChars(jHardwareVersion, NULL);
         }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-    }
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    subscribePresence0
-* Signature: (Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnPresenceListener;)Lorg/iotivity/base/OcPresenceHandle;
-*/
-JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_subscribePresence0
-(JNIEnv *env, jclass clazz, jstring jHost, jint jConnectivityType, jobject jListener)
-{
-    LOGD("OcPlatform_subscribePresence");
-    std::string host;
-    if (jHost)
-    {
-        host = env->GetStringUTFChars(jHost, NULL);
-    }
-    if (!jListener)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "onPresenceListener cannot be null");
-        return nullptr;
-    }
-
-    JniOnPresenceListener *onPresenceListener = AddOnPresenceListener(env, jListener);
-
-    SubscribeCallback subscribeCallback = [onPresenceListener](OCStackResult result, const unsigned int nonce,
-        const std::string& hostAddress)
-    {
-        onPresenceListener->onPresenceCallback(result, nonce, hostAddress);
-    };
-
-    OCPlatform::OCPresenceHandle presenceHandle;
-    try
-    {
-        OCStackResult result = OCPlatform::subscribePresence(
-            presenceHandle,
-            host,
-            JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),
-            subscribeCallback);
-
-        if (OC_STACK_OK != result)
+        if (jFirmwareVersion)
         {
-            ThrowOcException(result, "subscribe presence has failed");
+            firmwareVersion = env->GetStringUTFChars(jFirmwareVersion, NULL);
         }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-        return nullptr;
-    }
-
-    JniOcPresenceHandle* jniPresenceHandle = new JniOcPresenceHandle(onPresenceListener, presenceHandle);
-    jlong jhandle = reinterpret_cast<jlong>(jniPresenceHandle);
-    jobject jPresenceHandle = env->NewObject(g_cls_OcPresenceHandle, g_mid_OcPresenceHandle_N_ctor, jhandle);
-    if (!jPresenceHandle)
-    {
-        LOGE("Failed to create OcPresenceHandle");
-        delete jniPresenceHandle;
-    }
-    return jPresenceHandle;
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    subscribePresence1
-* Signature: (Ljava/lang/String;Ljava/lang/String;I
-Lorg/iotivity/base/OcPlatform/OnPresenceListener;)Lorg/iotivity/base/OcPresenceHandle;
-*/
-JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_subscribePresence1
-(JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceType, jint jConnectivityType, jobject jListener)
-{
-    LOGD("OcPlatform_subscribePresence1");
-    std::string host;
-    if (jHost)
-    {
-        host = env->GetStringUTFChars(jHost, NULL);
-    }
-    std::string resourceType;
-    if (jResourceType)
-    {
-        resourceType = env->GetStringUTFChars(jResourceType, NULL);
-    }
-    if (!jListener)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "onPresenceListener cannot be null");
-        return nullptr;
-    }
-
-    JniOnPresenceListener *onPresenceListener = AddOnPresenceListener(env, jListener);
-
-    SubscribeCallback subscribeCallback = [onPresenceListener](OCStackResult result,
-        const unsigned int nonce, const std::string& hostAddress)
-    {
-        onPresenceListener->onPresenceCallback(result, nonce, hostAddress);
-    };
-
-    OCPlatform::OCPresenceHandle presenceHandle;
-    try
-    {
-        OCStackResult result = OCPlatform::subscribePresence(
-            presenceHandle,
-            host,
-            resourceType,
-            JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),
-            subscribeCallback);
-
-        if (OC_STACK_OK != result)
+        if (jSupportUrl)
         {
-            ThrowOcException(result, "subscribe presence has failed");
+            supportUrl = env->GetStringUTFChars(jSupportUrl, NULL);
+        }
+        if (jSystemTime)
+        {
+            systemTime = env->GetStringUTFChars(jSystemTime, NULL);
         }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-        return nullptr;
-    }
-
-    JniOcPresenceHandle* jniPresenceHandle = new JniOcPresenceHandle(onPresenceListener, presenceHandle);
-    jlong jhandle = reinterpret_cast<jlong>(jniPresenceHandle);
-    jobject jPresenceHandle = env->NewObject(g_cls_OcPresenceHandle, g_mid_OcPresenceHandle_N_ctor, jhandle);
-    if (!jPresenceHandle)
-    {
-        LOGE("Failed to create OcPresenceHandle");
-        delete jniPresenceHandle;
-    }
-    return jPresenceHandle;
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    unsubscribePresence0
-* Signature: (Lorg/iotivity/base/OcPresenceHandle;)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unsubscribePresence0
-(JNIEnv *env, jclass clazz, jobject jPresenceHandle)
-{
-    LOGD("OcPlatform_unsubscribePresence");
-    if (!jPresenceHandle)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "presenceHandle cannot be null");
-        return;
-    }
-    JniOcPresenceHandle* jniPresenceHandle = JniOcPresenceHandle::getJniOcPresenceHandlePtr(env, jPresenceHandle);
-    if (!jniPresenceHandle) return;
-
-    OCPresenceHandle presenceHandle = jniPresenceHandle->getOCPresenceHandle();
-
-    try
-    {
-        OCStackResult result = OCPlatform::unsubscribePresence(presenceHandle);
 
-        if (OC_STACK_OK != result)
+        OCPlatformInfo platformInfo;
+        try
         {
-            ThrowOcException(result, "unsubscribe presence has failed");
-            return;
+            DuplicateString(&platformInfo.platformID, platformID);
+            DuplicateString(&platformInfo.manufacturerName, manufacturerName);
+            DuplicateString(&platformInfo.manufacturerUrl, manufacturerUrl);
+            DuplicateString(&platformInfo.modelNumber, modelNumber);
+            DuplicateString(&platformInfo.dateOfManufacture, dateOfManufacture);
+            DuplicateString(&platformInfo.platformVersion, platformVersion);
+            DuplicateString(&platformInfo.operatingSystemVersion, operatingSystemVersion);
+            DuplicateString(&platformInfo.hardwareVersion, hardwareVersion);
+            DuplicateString(&platformInfo.firmwareVersion, firmwareVersion);
+            DuplicateString(&platformInfo.supportUrl, supportUrl);
+            DuplicateString(&platformInfo.systemTime, systemTime);
         }
-        jweak jwOnPresenceListener = jniPresenceHandle->getJniOnPresenceListener()->getJWListener();
-        if (jwOnPresenceListener)
+        catch (std::exception &e)
         {
-            RemoveOnPresenceListener(env, jwOnPresenceListener);
+            ThrowOcException(JNI_EXCEPTION, "Failed to construct platform info");
+            return;
         }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-    }
-}
-
-/*
-* Class:     org_iotivity_base_OcPlatform
-* Method:    constructResourceObject0
-* Signature: (Ljava/lang/String;Ljava/lang/String;IZ[Ljava/lang/String;[Ljava/lang/String;)
-Lorg/iotivity/base/OcResource;
-*/
-JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_constructResourceObject0
-(JNIEnv *env, jclass clazz, jstring jHost, jstring jUri, jint jConnectivityType,
-jboolean jIsObservable, jobjectArray jResourceTypeArray, jobjectArray jInterfaceArray)
-{
-    LOGD("OcPlatform_constructResourceObject");
-    std::string host;
-    if (jHost)
-    {
-        host = env->GetStringUTFChars(jHost, NULL);
-    }
-    std::string uri;
-    if (jUri)
-    {
-        uri = env->GetStringUTFChars(jUri, NULL);
-    }
-    if (!jResourceTypeArray)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceTypeList cannot be null");
-        return nullptr;
-    }
-    if (!jInterfaceArray)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "interfaceList cannot be null");
-        return nullptr;
-    }
 
-    std::vector<std::string> resourceTypes;
-    JniUtils::convertJavaStrArrToStrVector(env, jResourceTypeArray, resourceTypes);
+       // __android_log_print(ANDROID_LOG_INFO, "Rahul", "platformID  = %s", platformID);
+        try
+        {
+            OCStackResult result = OCPlatform::registerPlatformInfo(platformInfo);
 
-    std::vector<std::string> interfaces;
-    JniUtils::convertJavaStrArrToStrVector(env, jInterfaceArray, interfaces);
+            delete platformInfo.platformID;
+            delete platformInfo.manufacturerName;
+            delete platformInfo.manufacturerUrl;
+            delete platformInfo.modelNumber;
+            delete platformInfo.dateOfManufacture;
+            delete platformInfo.platformVersion;
+            delete platformInfo.operatingSystemVersion;
+            delete platformInfo.hardwareVersion;
+            delete platformInfo.firmwareVersion;
+            delete platformInfo.supportUrl;
+            delete platformInfo.systemTime;
 
-    std::shared_ptr<OCResource> resource = OCPlatform::constructResourceObject(
-        host,
-        uri,
-        JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),
-        static_cast<bool>(jIsObservable),
-        resourceTypes,
-        interfaces);
+            if (OC_STACK_OK != result)
+            {
+                ThrowOcException(result, "Failed to register platform info");
+                return;
+            }
+        }
+        catch (OCException& e)
+        {
+            LOGE("Error is due to %s", e.reason().c_str());
+            ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        }
 
-    if (!resource)
-    {
-        ThrowOcException(OC_STACK_ERROR, "Failed to create OCResource");
-        return nullptr;
-    }
 
-    JniOcResource *jniOcResource = new JniOcResource(resource);
-    jlong handle = reinterpret_cast<jlong>(jniOcResource);
 
-    jobject jResource = env->NewObject(g_cls_OcResource, g_mid_OcResource_ctor);
-    if (!jResource)
-    {
-        delete jniOcResource;
-        return nullptr;
-    }
-    SetHandle<JniOcResource>(env, jResource, jniOcResource);
-    if (env->ExceptionCheck())
-    {
-        delete jniOcResource;
-        return nullptr;
-    }
-    return jResource;
 }
 
 /*
 * Class:     org_iotivity_base_OcPlatform
-* Method:    sendResponse0
-* Signature: (Lorg/iotivity/base/OcResourceResponse;)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_sendResponse0
-(JNIEnv *env, jclass clazz, jobject jResourceResponse)
-{
-    LOGD("OcPlatform_sendResponse");
-    if (!jResourceResponse)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceResponse cannot be null");
-        return;
-    }
-
-    JniOcResourceResponse *jniResponse = JniOcResourceResponse::getJniOcResourceResponsePtr(
-        env, jResourceResponse);
-    if (!jniResponse) return;
-
-    try
-    {
-        OCStackResult result = OCPlatform::sendResponse(jniResponse->getOCResourceResponse());
-
-        if (OC_STACK_OK != result)
-        {
-            ThrowOcException(result, "failed to send response");
-        }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
-    }
+* Method:    unregisterResource0\r
+* Signature: (Lorg/iotivity/base/OcResourceHandle;)V\r
+*/\r
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unregisterResource0\r
+(JNIEnv *env, jclass clazz, jobject jResourceHandle)\r
+{\r
+    LOGI("OcPlatform_unregisterResource");\r
+    if (!jResourceHandle)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");\r
+        return;\r
+    }\r
+    JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+        env, jResourceHandle);\r
+    if (!jniOcResourceHandle) return;\r
+\r
+    try\r
+    {\r
+        OCResourceHandle resHandle = jniOcResourceHandle->getOCResourceHandle();\r
+        OCStackResult result = OCPlatform::unregisterResource(resHandle);\r
+        if (OC_STACK_OK != result)\r
+        {\r
+            ThrowOcException(result, "Failed to unregister resource");\r
+        }\r
+    }\r
+    catch (OCException& e)\r
+    {\r
+        LOGE("%s", e.reason().c_str());\r
+        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+    }\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    bindResource0\r
+* Signature: (Lorg/iotivity/base/OcResourceHandle;Lorg/iotivity/base/OcResourceHandle;)V\r
+*/\r
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindResource0\r
+(JNIEnv *env, jclass clazz, jobject jResourceCollectionHandle, jobject jResourceHandle)\r
+{\r
+    LOGI("OcPlatform_bindResource");\r
+    if (!jResourceCollectionHandle)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceCollectionHandle cannot be null");\r
+        return;\r
+    }\r
+    if (!jResourceHandle)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");\r
+        return;\r
+    }\r
+    JniOcResourceHandle* jniOcResourceCollectionHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+        env, jResourceCollectionHandle);\r
+    if (!jniOcResourceCollectionHandle) return;\r
+\r
+    JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+        env, jResourceHandle);\r
+    if (!jniOcResourceHandle) return;\r
+\r
+    try\r
+    {\r
+        OCStackResult result = OCPlatform::bindResource(\r
+            jniOcResourceCollectionHandle->getOCResourceHandle(),\r
+            jniOcResourceHandle->getOCResourceHandle()\r
+            );\r
+\r
+        if (OC_STACK_OK != result)\r
+        {\r
+            ThrowOcException(result, "Failed to bind resource");\r
+        }\r
+    }\r
+    catch (OCException& e)\r
+    {\r
+        LOGE("%s", e.reason().c_str());\r
+        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+    }\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    bindResources0\r
+* Signature: (Lorg/iotivity/base/OcResourceHandle;[Lorg/iotivity/base/OcResourceHandle;)V\r
+*/\r
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindResources0\r
+(JNIEnv *env, jclass clazz, jobject jResourceCollectionHandle, jobjectArray jResourceHandleArray)\r
+{\r
+    LOGI("OcPlatform_bindResources");\r
+\r
+    if (!jResourceCollectionHandle)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceCollectionHandle cannot be null");\r
+        return;\r
+    }\r
+    if (!jResourceHandleArray)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandleList cannot be null");\r
+        return;\r
+    }\r
+\r
+    JniOcResourceHandle* jniOcResourceCollectionHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+        env, jResourceCollectionHandle);\r
+    if (!jniOcResourceCollectionHandle) return;\r
+\r
+    std::vector<OCResourceHandle> resourceHandleList;\r
+    int len = env->GetArrayLength(jResourceHandleArray);\r
+    for (int i = 0; i < len; ++i)\r
+    {\r
+        jobject jResourceHandle = env->GetObjectArrayElement(jResourceHandleArray, i);\r
+        if (!jResourceHandle)\r
+        {\r
+            ThrowOcException(JNI_EXCEPTION, "resource handle cannot be null");\r
+            return;\r
+        }\r
+\r
+        JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+            env, jResourceHandle);\r
+        if (!jniOcResourceHandle) return;\r
+\r
+        resourceHandleList.push_back(\r
+            jniOcResourceHandle->getOCResourceHandle());\r
+    }\r
+\r
+    try\r
+    {\r
+        OCStackResult result = OCPlatform::bindResources(\r
+            jniOcResourceCollectionHandle->getOCResourceHandle(),\r
+            resourceHandleList\r
+            );\r
+\r
+        if (OC_STACK_OK != result)\r
+        {\r
+            ThrowOcException(result, "Failed to bind resources");\r
+        }\r
+    }\r
+    catch (OCException& e)\r
+    {\r
+        LOGE("%s", e.reason().c_str());\r
+        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+    }\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    unbindResource0\r
+* Signature: (Lorg/iotivity/base/OcResourceHandle;Lorg/iotivity/base/OcResourceHandle;)V\r
+*/\r
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unbindResource0\r
+(JNIEnv *env, jclass clazz, jobject jResourceCollectionHandle, jobject jResourceHandle)\r
+{\r
+    LOGI("OcPlatform_unbindResource");\r
+    if (!jResourceCollectionHandle)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceCollectionHandle cannot be null");\r
+        return;\r
+    }\r
+    if (!jResourceHandle)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");\r
+        return;\r
+    }\r
+\r
+    JniOcResourceHandle* jniOcResourceCollectionHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+        env, jResourceCollectionHandle);\r
+    if (!jniOcResourceCollectionHandle) return;\r
+\r
+    JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+        env, jResourceHandle);\r
+    if (!jniOcResourceHandle) return;\r
+\r
+    try\r
+    {\r
+        OCStackResult result = OCPlatform::unbindResource(\r
+            jniOcResourceCollectionHandle->getOCResourceHandle(),\r
+            jniOcResourceHandle->getOCResourceHandle()\r
+            );\r
+\r
+        if (OC_STACK_OK != result)\r
+        {\r
+            ThrowOcException(result, "Failed to unbind resource");\r
+        }\r
+    }\r
+    catch (OCException& e)\r
+    {\r
+        LOGE("%s", e.reason().c_str());\r
+        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+    }\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    unbindResources0\r
+* Signature: (Lorg/iotivity/base/OcResourceHandle;[Lorg/iotivity/base/OcResourceHandle;)V\r
+*/\r
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unbindResources0\r
+(JNIEnv *env, jclass clazz, jobject jResourceCollectionHandle, jobjectArray jResourceHandleArray)\r
+{\r
+    LOGI("OcPlatform_unbindResources");\r
+    if (!jResourceCollectionHandle)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceCollectionHandle cannot be null");\r
+        return;\r
+    }\r
+    if (!jResourceHandleArray)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandleList cannot be null");\r
+        return;\r
+    }\r
+\r
+    JniOcResourceHandle* jniOcResourceCollectionHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+        env, jResourceCollectionHandle);\r
+    if (!jniOcResourceCollectionHandle) return;\r
+\r
+    std::vector<OCResourceHandle> resourceHandleList;\r
+    int len = env->GetArrayLength(jResourceHandleArray);\r
+    for (int i = 0; i < len; ++i)\r
+    {\r
+        jobject jResourceHandle = env->GetObjectArrayElement(jResourceHandleArray, i);\r
+        if (!jResourceHandle)\r
+        {\r
+            ThrowOcException(JNI_EXCEPTION, "resource handle cannot be null");\r
+            return;\r
+        }\r
+\r
+        JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+            env, jResourceHandle);\r
+        if (!jniOcResourceHandle) return;\r
+\r
+        resourceHandleList.push_back(\r
+            jniOcResourceHandle->getOCResourceHandle());\r
+    }\r
+\r
+    try\r
+    {\r
+        OCStackResult result = OCPlatform::unbindResources(\r
+            jniOcResourceCollectionHandle->getOCResourceHandle(),\r
+            resourceHandleList\r
+            );\r
+\r
+        if (OC_STACK_OK != result)\r
+        {\r
+            ThrowOcException(result, "Failed to unbind resources");\r
+        }\r
+    }\r
+    catch (OCException& e)\r
+    {\r
+        LOGE("%s", e.reason().c_str());\r
+        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+    }\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    bindTypeToResource0\r
+* Signature: (Lorg/iotivity/base/OcResourceHandle;Ljava/lang/String;)V\r
+*/\r
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindTypeToResource0\r
+(JNIEnv *env, jclass clazz, jobject jResourceHandle, jstring jResourceTypeName)\r
+{\r
+    LOGI("OcPlatform_bindTypeToResource");\r
+    if (!jResourceHandle)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");\r
+        return;\r
+    }\r
+    std::string typeName;\r
+    if (jResourceTypeName)\r
+    {\r
+        typeName = env->GetStringUTFChars(jResourceTypeName, NULL);\r
+    }\r
+\r
+    JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+        env, jResourceHandle);\r
+    if (!jniOcResourceHandle) return;\r
+\r
+    try\r
+    {\r
+        OCStackResult result = OCPlatform::bindTypeToResource(\r
+            jniOcResourceHandle->getOCResourceHandle(),\r
+            typeName\r
+            );\r
+\r
+        if (OC_STACK_OK != result)\r
+        {\r
+            ThrowOcException(result, "Failed to bind type to resource");\r
+        }\r
+    }\r
+    catch (OCException& e)\r
+    {\r
+        LOGE("%s", e.reason().c_str());\r
+        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+    }\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    bindInterfaceToResource0\r
+* Signature: (Lorg/iotivity/base/OcResourceHandle;Ljava/lang/String;)V\r
+*/\r
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindInterfaceToResource0\r
+(JNIEnv *env, jclass clazz, jobject jResourceHandle, jstring jResourceInterfaceName)\r
+{\r
+    LOGI("OcPlatform_bindInterfaceToResource");\r
+    if (!jResourceHandle)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");\r
+        return;\r
+    }\r
+    std::string interfaceName;\r
+    if (jResourceInterfaceName)\r
+    {\r
+        interfaceName = env->GetStringUTFChars(jResourceInterfaceName, NULL);\r
+    }\r
+\r
+    JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(\r
+        env, jResourceHandle);\r
+    if (!jniOcResourceHandle) return;\r
+\r
+    try\r
+    {\r
+        OCStackResult result = OCPlatform::bindInterfaceToResource(\r
+            jniOcResourceHandle->getOCResourceHandle(),\r
+            interfaceName\r
+            );\r
+\r
+        if (OC_STACK_OK != result)\r
+        {\r
+            ThrowOcException(result, "Failed to bind interface to resource");\r
+        }\r
+    }\r
+    catch (OCException& e)\r
+    {\r
+        LOGE("%s", e.reason().c_str());\r
+        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+    }\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    startPresence0\r
+* Signature: (I)V\r
+*/\r
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_startPresence0\r
+(JNIEnv *env, jclass clazz, jint ttl)\r
+{\r
+    LOGI("OcPlatform_startPresence");\r
+\r
+    try\r
+    {\r
+        OCStackResult result = OCPlatform::startPresence((unsigned int)ttl);\r
+\r
+        if (OC_STACK_OK != result)\r
+        {\r
+            ThrowOcException(result, "Failed to start presence");\r
+        }\r
+    }\r
+    catch (OCException& e)\r
+    {\r
+        LOGE("%s", e.reason().c_str());\r
+        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+    }\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    stopPresence0\r
+* Signature: ()V\r
+*/\r
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_stopPresence0\r
+(JNIEnv *env, jclass clazz)\r
+{\r
+    LOGI("OcPlatform_stopPresence");\r
+\r
+    try\r
+    {\r
+        OCStackResult result = OCPlatform::stopPresence();\r
+\r
+        if (OC_STACK_OK != result)\r
+        {\r
+            ThrowOcException(result, "Failed to stop presence");\r
+        }\r
+    }\r
+    catch (OCException& e)\r
+    {\r
+        LOGE("%s", e.reason().c_str());\r
+        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+    }\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    subscribePresence0\r
+* Signature: (Ljava/lang/String;ILorg/iotivity/base/OcPlatform/OnPresenceListener;)Lorg/iotivity/base/OcPresenceHandle;\r
+*/\r
+JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_subscribePresence0\r
+(JNIEnv *env, jclass clazz, jstring jHost, jint jConnectivityType, jobject jListener)\r
+{\r
+    LOGD("OcPlatform_subscribePresence");\r
+    std::string host;\r
+    if (jHost)\r
+    {\r
+        host = env->GetStringUTFChars(jHost, NULL);\r
+    }\r
+    if (!jListener)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onPresenceListener cannot be null");\r
+        return nullptr;\r
+    }\r
+\r
+    JniOnPresenceListener *onPresenceListener = AddOnPresenceListener(env, jListener);\r
+\r
+    SubscribeCallback subscribeCallback = [onPresenceListener](OCStackResult result, const unsigned int nonce,\r
+        const std::string& hostAddress)\r
+    {\r
+        onPresenceListener->onPresenceCallback(result, nonce, hostAddress);\r
+    };\r
+\r
+    OCPlatform::OCPresenceHandle presenceHandle;\r
+    try\r
+    {\r
+        OCStackResult result = OCPlatform::subscribePresence(\r
+            presenceHandle,\r
+            host,\r
+            JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),\r
+            subscribeCallback);\r
+\r
+        if (OC_STACK_OK != result)\r
+        {\r
+            ThrowOcException(result, "subscribe presence has failed");\r
+        }\r
+    }\r
+    catch (OCException& e)\r
+    {\r
+        LOGE("%s", e.reason().c_str());\r
+        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+        return nullptr;\r
+    }\r
+\r
+    JniOcPresenceHandle* jniPresenceHandle = new JniOcPresenceHandle(onPresenceListener, presenceHandle);\r
+    jlong jhandle = reinterpret_cast<jlong>(jniPresenceHandle);\r
+    jobject jPresenceHandle = env->NewObject(g_cls_OcPresenceHandle, g_mid_OcPresenceHandle_N_ctor, jhandle);\r
+    if (!jPresenceHandle)\r
+    {\r
+        LOGE("Failed to create OcPresenceHandle");\r
+        delete jniPresenceHandle;\r
+    }\r
+    return jPresenceHandle;\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    subscribePresence1\r
+* Signature: (Ljava/lang/String;Ljava/lang/String;I\r
+Lorg/iotivity/base/OcPlatform/OnPresenceListener;)Lorg/iotivity/base/OcPresenceHandle;\r
+*/\r
+JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_subscribePresence1\r
+(JNIEnv *env, jclass clazz, jstring jHost, jstring jResourceType, jint jConnectivityType, jobject jListener)\r
+{\r
+    LOGD("OcPlatform_subscribePresence1");\r
+    std::string host;\r
+    if (jHost)\r
+    {\r
+        host = env->GetStringUTFChars(jHost, NULL);\r
+    }\r
+    std::string resourceType;\r
+    if (jResourceType)\r
+    {\r
+        resourceType = env->GetStringUTFChars(jResourceType, NULL);\r
+    }\r
+    if (!jListener)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onPresenceListener cannot be null");\r
+        return nullptr;\r
+    }\r
+\r
+    JniOnPresenceListener *onPresenceListener = AddOnPresenceListener(env, jListener);\r
+\r
+    SubscribeCallback subscribeCallback = [onPresenceListener](OCStackResult result,\r
+        const unsigned int nonce, const std::string& hostAddress)\r
+    {\r
+        onPresenceListener->onPresenceCallback(result, nonce, hostAddress);\r
+    };\r
+\r
+    OCPlatform::OCPresenceHandle presenceHandle;\r
+    try\r
+    {\r
+        OCStackResult result = OCPlatform::subscribePresence(\r
+            presenceHandle,\r
+            host,\r
+            resourceType,\r
+            JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),\r
+            subscribeCallback);\r
+\r
+        if (OC_STACK_OK != result)\r
+        {\r
+            ThrowOcException(result, "subscribe presence has failed");\r
+        }\r
+    }\r
+    catch (OCException& e)\r
+    {\r
+        LOGE("%s", e.reason().c_str());\r
+        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+        return nullptr;\r
+    }\r
+\r
+    JniOcPresenceHandle* jniPresenceHandle = new JniOcPresenceHandle(onPresenceListener, presenceHandle);\r
+    jlong jhandle = reinterpret_cast<jlong>(jniPresenceHandle);\r
+    jobject jPresenceHandle = env->NewObject(g_cls_OcPresenceHandle, g_mid_OcPresenceHandle_N_ctor, jhandle);\r
+    if (!jPresenceHandle)\r
+    {\r
+        LOGE("Failed to create OcPresenceHandle");\r
+        delete jniPresenceHandle;\r
+    }\r
+    return jPresenceHandle;\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    unsubscribePresence0\r
+* Signature: (Lorg/iotivity/base/OcPresenceHandle;)V\r
+*/\r
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unsubscribePresence0\r
+(JNIEnv *env, jclass clazz, jobject jPresenceHandle)\r
+{\r
+    LOGD("OcPlatform_unsubscribePresence");\r
+    if (!jPresenceHandle)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "presenceHandle cannot be null");\r
+        return;\r
+    }\r
+    JniOcPresenceHandle* jniPresenceHandle = JniOcPresenceHandle::getJniOcPresenceHandlePtr(env, jPresenceHandle);\r
+    if (!jniPresenceHandle) return;\r
+\r
+    OCPresenceHandle presenceHandle = jniPresenceHandle->getOCPresenceHandle();\r
+\r
+    try\r
+    {\r
+        OCStackResult result = OCPlatform::unsubscribePresence(presenceHandle);\r
+\r
+        if (OC_STACK_OK != result)\r
+        {\r
+            ThrowOcException(result, "unsubscribe presence has failed");\r
+            return;\r
+        }\r
+        jweak jwOnPresenceListener = jniPresenceHandle->getJniOnPresenceListener()->getJWListener();\r
+        if (jwOnPresenceListener)\r
+        {\r
+            RemoveOnPresenceListener(env, jwOnPresenceListener);\r
+        }\r
+    }\r
+    catch (OCException& e)\r
+    {\r
+        LOGE("%s", e.reason().c_str());\r
+        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+    }\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    constructResourceObject0\r
+* Signature: (Ljava/lang/String;Ljava/lang/String;IZ[Ljava/lang/String;[Ljava/lang/String;)\r
+Lorg/iotivity/base/OcResource;\r
+*/\r
+JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_constructResourceObject0\r
+(JNIEnv *env, jclass clazz, jstring jHost, jstring jUri, jint jConnectivityType,\r
+jboolean jIsObservable, jobjectArray jResourceTypeArray, jobjectArray jInterfaceArray)\r
+{\r
+    LOGD("OcPlatform_constructResourceObject");\r
+    std::string host;\r
+    if (jHost)\r
+    {\r
+        host = env->GetStringUTFChars(jHost, NULL);\r
+    }\r
+    std::string uri;\r
+    if (jUri)\r
+    {\r
+        uri = env->GetStringUTFChars(jUri, NULL);\r
+    }\r
+    if (!jResourceTypeArray)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceTypeList cannot be null");\r
+        return nullptr;\r
+    }\r
+    if (!jInterfaceArray)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "interfaceList cannot be null");\r
+        return nullptr;\r
+    }\r
+\r
+    std::vector<std::string> resourceTypes;\r
+    JniUtils::convertJavaStrArrToStrVector(env, jResourceTypeArray, resourceTypes);\r
+\r
+    std::vector<std::string> interfaces;\r
+    JniUtils::convertJavaStrArrToStrVector(env, jInterfaceArray, interfaces);\r
+\r
+    std::shared_ptr<OCResource> resource = OCPlatform::constructResourceObject(\r
+        host,\r
+        uri,\r
+        JniUtils::getConnectivityType(env, static_cast<int>(jConnectivityType)),\r
+        static_cast<bool>(jIsObservable),\r
+        resourceTypes,\r
+        interfaces);\r
+\r
+    if (!resource)\r
+    {\r
+        ThrowOcException(OC_STACK_ERROR, "Failed to create OCResource");\r
+        return nullptr;\r
+    }\r
+\r
+    JniOcResource *jniOcResource = new JniOcResource(resource);\r
+    jlong handle = reinterpret_cast<jlong>(jniOcResource);\r
+\r
+    jobject jResource = env->NewObject(g_cls_OcResource, g_mid_OcResource_ctor);\r
+    if (!jResource)\r
+    {\r
+        delete jniOcResource;\r
+        return nullptr;\r
+    }\r
+    SetHandle<JniOcResource>(env, jResource, jniOcResource);\r
+    if (env->ExceptionCheck())\r
+    {\r
+        delete jniOcResource;\r
+        return nullptr;\r
+    }\r
+    return jResource;\r
+}\r
+\r
+/*\r
+* Class:     org_iotivity_base_OcPlatform\r
+* Method:    sendResponse0\r
+* Signature: (Lorg/iotivity/base/OcResourceResponse;)V\r
+*/\r
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_sendResponse0\r
+(JNIEnv *env, jclass clazz, jobject jResourceResponse)\r
+{\r
+    LOGD("OcPlatform_sendResponse");\r
+    if (!jResourceResponse)\r
+    {\r
+        ThrowOcException(OC_STACK_INVALID_PARAM, "resourceResponse cannot be null");\r
+        return;\r
+    }\r
+\r
+    JniOcResourceResponse *jniResponse = JniOcResourceResponse::getJniOcResourceResponsePtr(\r
+        env, jResourceResponse);\r
+    if (!jniResponse) return;\r
+\r
+    try\r
+    {\r
+        OCStackResult result = OCPlatform::sendResponse(jniResponse->getOCResourceResponse());\r
+\r
+        if (OC_STACK_OK != result)\r
+        {\r
+            ThrowOcException(result, "failed to send response");\r
+        }\r
+    }\r
+    catch (OCException& e)\r
+    {\r
+        LOGE("%s", e.reason().c_str());\r
+        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());\r
+    }\r
 }