replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / android / android_api / base / jni / JniOcPlatform.cpp
index 3b67b6c..87d08a2 100644 (file)
@@ -1,42 +1,53 @@
-/*
-* //******************************************************************
-* //
-* // 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.
-* //
-* //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-*/
+//******************************************************************
+//
+// 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 "JniOcRepresentation.h"
 #include "JniOcSecurity.h"
+#include "JniOcDirectPairDevice.h"
 #include "JniUtils.h"
+#include "ocpayload.h"
+#include "RDClient.h"
+
+#ifdef WITH_CLOUD
+#include "JniOcAccountManager.h"
+#endif
+
+#define AES_KEY_SIZE 32
 
 using namespace OC;
 
 JniOnResourceFoundListener* AddOnResourceFoundListener(JNIEnv* env, jobject jListener)
 {
-    JniOnResourceFoundListener *onResourceFoundListener = NULL;
+    JniOnResourceFoundListener *onResourceFoundListener = nullptr;
 
     resourceFoundMapLock.lock();
 
-    for (auto it = onResourceFoundListenerMap.begin(); it != onResourceFoundListenerMap.end(); ++it)
+    for (auto it = onResourceFoundListenerMap.begin();
+         it != onResourceFoundListenerMap.end();
+         ++it)
     {
         if (env->IsSameObject(jListener, it->first))
         {
@@ -52,11 +63,16 @@ JniOnResourceFoundListener* AddOnResourceFoundListener(JNIEnv* env, jobject jLis
 
     if (!onResourceFoundListener)
     {
-        onResourceFoundListener = new JniOnResourceFoundListener(env, jListener, RemoveOnResourceFoundListener);
+        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)));
+        onResourceFoundListenerMap.insert(
+            std::pair<jobject,
+                      std::pair<JniOnResourceFoundListener*, int >>(
+                          jgListener,
+                          std::pair<JniOnResourceFoundListener*, int>(onResourceFoundListener,
+                                                                      1)));
         LOGD("OnResourceFoundListener: new listener");
     }
     resourceFoundMapLock.unlock();
@@ -67,7 +83,9 @@ void RemoveOnResourceFoundListener(JNIEnv* env, jobject jListener)
 {
     resourceFoundMapLock.lock();
 
-    for (auto it = onResourceFoundListenerMap.begin(); it != onResourceFoundListenerMap.end(); ++it)
+    for (auto it = onResourceFoundListenerMap.begin();
+         it != onResourceFoundListenerMap.end();
+         ++it)
     {
         if (env->IsSameObject(jListener, it->first))
         {
@@ -95,7 +113,7 @@ void RemoveOnResourceFoundListener(JNIEnv* env, jobject jListener)
 
 JniOnDeviceInfoListener* AddOnDeviceInfoListener(JNIEnv* env, jobject jListener)
 {
-    JniOnDeviceInfoListener *onDeviceInfoListener = NULL;
+    JniOnDeviceInfoListener *onDeviceInfoListener = nullptr;
 
     deviceInfoMapLock.lock();
 
@@ -115,11 +133,15 @@ JniOnDeviceInfoListener* AddOnDeviceInfoListener(JNIEnv* env, jobject jListener)
 
     if (!onDeviceInfoListener)
     {
-        onDeviceInfoListener = new JniOnDeviceInfoListener(env, jListener, RemoveOnDeviceInfoListener);
+        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)));
+        onDeviceInfoListenerMap.insert(
+            std::pair<jobject,
+                      std::pair<JniOnDeviceInfoListener*, int>>(
+                          jgListener,
+                          std::pair<JniOnDeviceInfoListener*, int>(onDeviceInfoListener, 1)));
         LOGI("OnDeviceInfoListener: new listener");
     }
 
@@ -167,7 +189,7 @@ void RemoveOnDeviceInfoListener(JNIEnv* env, jobject jListener)
 
 JniOnPlatformInfoListener* AddOnPlatformInfoListener(JNIEnv* env, jobject jListener)
 {
-    JniOnPlatformInfoListener *onPlatformInfoListener = NULL;
+    JniOnPlatformInfoListener *onPlatformInfoListener = nullptr;
 
     platformInfoMapLock.lock();
 
@@ -187,11 +209,14 @@ JniOnPlatformInfoListener* AddOnPlatformInfoListener(JNIEnv* env, jobject jListe
 
     if (!onPlatformInfoListener)
     {
-        onPlatformInfoListener = new JniOnPlatformInfoListener(env, jListener, RemoveOnPlatformInfoListener);
+        onPlatformInfoListener =
+            new JniOnPlatformInfoListener(env, jListener, RemoveOnPlatformInfoListener);
         jobject jgListener = env->NewGlobalRef(jListener);
 
-        onPlatformInfoListenerMap.insert(std::pair < jobject, std::pair < JniOnPlatformInfoListener*,
-            int >> (jgListener, std::pair<JniOnPlatformInfoListener*, int>(onPlatformInfoListener, 1)));
+        onPlatformInfoListenerMap.insert(
+            std::pair<jobject, std::pair<JniOnPlatformInfoListener*, int>>(
+                jgListener,
+                std::pair<JniOnPlatformInfoListener*, int>(onPlatformInfoListener, 1)));
         LOGI("OnPlatformInfoListener: new listener");
     }
 
@@ -239,7 +264,7 @@ void RemoveOnPlatformInfoListener(JNIEnv* env, jobject jListener)
 
 JniOnPresenceListener* AddOnPresenceListener(JNIEnv* env, jobject jListener)
 {
-    JniOnPresenceListener *onPresenceListener = NULL;
+    JniOnPresenceListener *onPresenceListener = nullptr;
 
     presenceMapLock.lock();
 
@@ -260,8 +285,10 @@ JniOnPresenceListener* AddOnPresenceListener(JNIEnv* env, jobject jListener)
     {
         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)));
+        onPresenceListenerMap.insert(
+            std::pair<jobject, std::pair<JniOnPresenceListener*, int>>(
+                jgListener,
+                std::pair<JniOnPresenceListener*, int>(onPresenceListener, 1)));
         LOGI("OnPresenceListener: new listener");
     }
     presenceMapLock.unlock();
@@ -303,43 +330,415 @@ void RemoveOnPresenceListener(JNIEnv* env, jobject jListener)
     presenceMapLock.unlock();
 }
 
+JniOnObserveListener* AddOnObserveListener(JNIEnv* env, jobject jListener)
+{
+    JniOnObserveListener *onObserveListener = nullptr;
+
+    observeMapLock.lock();
+
+    for (auto it = onObserveListenerMap.begin(); it != onObserveListenerMap.end(); ++it)
+    {
+        if (env->IsSameObject(jListener, it->first))
+        {
+            auto refPair = it->second;
+            onObserveListener = refPair.first;
+            refPair.second++;
+            it->second = refPair;
+            onObserveListenerMap.insert(*it);
+            LOGD("OnObserveListener: ref. count incremented");
+            break;
+        }
+    }
+    if (!onObserveListener)
+    {
+        onObserveListener = new JniOnObserveListener(env, jListener, (JniOcResource*)nullptr);
+        jobject jgListener = env->NewGlobalRef(jListener);
+        onObserveListenerMap.insert(
+            std::pair<jobject, std::pair<JniOnObserveListener*, int>>(
+                jgListener,
+                std::pair<JniOnObserveListener*, int>(onObserveListener, 1)));
+        LOGI("OnObserveListener: new listener");
+    }
+    observeMapLock.unlock();
+    return onObserveListener;
+}
+
+void RemoveOnObserveListener(JNIEnv* env, jobject jListener)
+{
+    observeMapLock.lock();
+    bool isFound = false;
+    for (auto it = onObserveListenerMap.begin(); it != onObserveListenerMap.end(); ++it)
+    {
+        if (env->IsSameObject(jListener, it->first))
+        {
+            auto refPair = it->second;
+            if (refPair.second > 1)
+            {
+                refPair.second--;
+                it->second = refPair;
+                onObserveListenerMap.insert(*it);
+                LOGI("OnObserveListener: ref. count decremented");
+            }
+            else
+            {
+                env->DeleteGlobalRef(it->first);
+                JniOnObserveListener* listener = refPair.first;
+                delete listener;
+                onObserveListenerMap.erase(it);
+                LOGI("OnObserveListener is removed");
+            }
+            isFound = true;
+            break;
+        }
+    }
+    if (!isFound)
+    {
+        ThrowOcException(JNI_EXCEPTION, "OnObserveListener not found");
+    }
+    observeMapLock.unlock();
+}
+
+JniOnDPDevicesFoundListener* AddOnDPDevicesFoundListener(JNIEnv* env, jobject jListener)
+{
+    JniOnDPDevicesFoundListener *onDPDeviceListener = nullptr;
+
+    dpDevicesFoundListenerMapLock.lock();
+
+    for (auto it = onDPDevicesFoundListenerMap.begin(); it !=
+            onDPDevicesFoundListenerMap.end(); ++it)
+    {
+        if (env->IsSameObject(jListener, it->first))
+        {
+            auto refPair = it->second;
+            onDPDeviceListener = refPair.first;
+            refPair.second++;
+            it->second = refPair;
+            onDPDevicesFoundListenerMap.insert(*it);
+            LOGD("onDPDeviceListener: ref. count incremented");
+            break;
+        }
+    }
+    if (!onDPDeviceListener)
+    {
+        onDPDeviceListener = new JniOnDPDevicesFoundListener(env, jListener,
+                RemoveOnDPDevicesFoundListener);
+        jobject jgListener = env->NewGlobalRef(jListener);
+        onDPDevicesFoundListenerMap.insert(
+                std::pair<jobject, std::pair<JniOnDPDevicesFoundListener*, int>>(
+                    jgListener,
+                    std::pair<JniOnDPDevicesFoundListener*, int>(onDPDeviceListener, 1)));
+        LOGI("onDPDeviceListener: new listener");
+    }
+    dpDevicesFoundListenerMapLock.unlock();
+    return onDPDeviceListener;
+}
+
+void RemoveOnDPDevicesFoundListener(JNIEnv* env, jobject jListener)
+{
+    dpDevicesFoundListenerMapLock.lock();
+    bool isFound = false;
+    for (auto it = onDPDevicesFoundListenerMap.begin(); it !=
+            onDPDevicesFoundListenerMap.end(); ++it)
+    {
+        if (env->IsSameObject(jListener, it->first))
+        {
+            auto refPair = it->second;
+            if (refPair.second > 1)
+            {
+                refPair.second--;
+                it->second = refPair;
+                onDPDevicesFoundListenerMap.insert(*it);
+                LOGI("onDPDeviceListener: ref. count decremented");
+            }
+            else
+            {
+                env->DeleteGlobalRef(it->first);
+                JniOnDPDevicesFoundListener* listener = refPair.first;
+                delete listener;
+                onDPDevicesFoundListenerMap.erase(it);
+                LOGI("onDPDeviceListener is removed");
+            }
+            isFound = true;
+            break;
+        }
+    }
+    if (!isFound)
+    {
+        ThrowOcException(JNI_EXCEPTION, "onDPDeviceListener not found");
+    }
+    dpDevicesFoundListenerMapLock.unlock();
+}
+
+JniOnDirectPairingListener* AddOnDirectPairingListener(JNIEnv* env, jobject jListener)
+{
+    JniOnDirectPairingListener *onDirectPairingListener = nullptr;
+
+    directPairingListenerMapLock.lock();
+
+    for (auto it = directPairingListenerMap.begin(); it !=
+            directPairingListenerMap.end(); ++it)
+    {
+        if (env->IsSameObject(jListener, it->first))
+        {
+            auto refPair = it->second;
+            onDirectPairingListener = refPair.first;
+            refPair.second++;
+            it->second = refPair;
+            directPairingListenerMap.insert(*it);
+            LOGD("onDirectPairingListener: ref. count incremented");
+            break;
+        }
+    }
+    if (!onDirectPairingListener)
+    {
+        onDirectPairingListener = new JniOnDirectPairingListener(env, jListener,
+                RemoveOnDirectPairingListener);
+        jobject jgListener = env->NewGlobalRef(jListener);
+        directPairingListenerMap.insert(
+                std::pair<jobject, std::pair<JniOnDirectPairingListener*, int>>(
+                    jgListener,
+                    std::pair<JniOnDirectPairingListener*, int>(onDirectPairingListener, 1)));
+        LOGI("onDirectPairingListener: new listener");
+    }
+    directPairingListenerMapLock.unlock();
+    return onDirectPairingListener;
+}
+
+void RemoveOnDirectPairingListener(JNIEnv* env, jobject jListener)
+{
+    directPairingListenerMapLock.lock();
+    bool isFound = false;
+    for (auto it = directPairingListenerMap.begin(); it !=
+            directPairingListenerMap.end(); ++it)
+    {
+        if (env->IsSameObject(jListener, it->first))
+        {
+            auto refPair = it->second;
+            if (refPair.second > 1)
+            {
+                refPair.second--;
+                it->second = refPair;
+                directPairingListenerMap.insert(*it);
+                LOGI("onDirectPairingListener: ref. count decremented");
+            }
+            else
+            {
+                env->DeleteGlobalRef(it->first);
+                JniOnDirectPairingListener* listener = refPair.first;
+                delete listener;
+                directPairingListenerMap.erase(it);
+                LOGI("onDirectPairingListener is removed");
+            }
+            isFound = true;
+            break;
+        }
+    }
+    if (!isFound)
+    {
+        ThrowOcException(JNI_EXCEPTION, "onDirectPairingListener not found");
+    }
+    directPairingListenerMapLock.unlock();
+}
+
+#ifdef TCP_ADAPTER
+JniKeepAliveListener* AddKeepAliveListener(JNIEnv* env, jobject jListener)
+{
+    JniKeepAliveListener *KeepAliveListener = nullptr;
+
+    KeepAliveListenerMapLock.lock();
+
+    for (auto it = KeepAliveListenerMap.begin(); it !=
+        KeepAliveListenerMap.end(); ++it)
+    {
+        if (env->IsSameObject(jListener, it->first))
+        {
+            auto refPair = it->second;
+            KeepAliveListener = refPair.first;
+            refPair.second++;
+            it->second = refPair;
+            KeepAliveListenerMap.insert(*it);
+            LOGD("KeepAliveListener: ref. count incremented");
+            break;
+        }
+    }
+    if (!KeepAliveListener)
+    {
+         KeepAliveListener = new JniKeepAliveListener(env, jListener, RemoveKeepAliveListener);
+         jobject jgListener = env->NewGlobalRef(jListener);
+         KeepAliveListenerMap.insert(std::pair<jobject, std::pair<JniKeepAliveListener*, int>>(
+            jgListener,
+            std::pair<JniKeepAliveListener*, int>(KeepAliveListener, 1)));
+         LOGI("KeepAliveListener: new listener");
+    }
+    KeepAliveListenerMapLock.unlock();
+    return KeepAliveListener;
+}
+#endif
+#ifdef TCP_ADAPTER
+void RemoveKeepAliveListener(JNIEnv* env, jobject jListener)
+{
+    KeepAliveListenerMapLock.lock();
+    bool isFound = false;
+    for (auto it = KeepAliveListenerMap.begin(); it !=
+        KeepAliveListenerMap.end(); ++it)
+    {
+        if (env->IsSameObject(jListener, it->first))
+        {
+            auto refPair = it->second;
+            if (refPair.second > 1)
+            {
+                refPair.second--;
+                it->second = refPair;
+                KeepAliveListenerMap.insert(*it);
+                LOGI("KeepAliveListener: ref.count decremented");
+            }
+            else
+            {
+                env->DeleteGlobalRef(it->first);
+                JniKeepAliveListener* listener = refPair.first;
+                delete listener;
+                KeepAliveListenerMap.erase(it);
+                LOGI("KeepAliveListener is removed");
+            }
+            isFound = true;
+            break;
+        }
+    }
+    if (!isFound)
+    {
+        ThrowOcException(JNI_EXCEPTION, "KeepAliveListener not found");
+    }
+    KeepAliveListenerMapLock.unlock();
+}
+#endif
 /*
 * Class:     org_iotivity_base_OcPlatform
 * Method:    configure
-* Signature: (IILjava/lang/String;II)V
+* Signature: (IILjava/lang/String;IILjava/lang/String;I)V
 */
 JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_configure
 (JNIEnv *env, jclass clazz, jint jServiceType, jint jModeType, jstring jIpAddress, jint jPort,
-                                                                 jint jQOS, jstring jDbPath)
+ jint jQOS, jstring jDbPath, jstring jDbPathDefault , jstring jRescueDBPath, jint jkeySize,
+jbyteArray data, jint jTransport)
 {
     LOGI("OcPlatform_configure");
 
     std::string ipAddress;
-    std::string dbfile;
+    std::string dbfile, defaultPath, rescuePath;
+    static unsigned char *aesKey = NULL;
     if (jIpAddress)
     {
-        ipAddress = env->GetStringUTFChars(jIpAddress, NULL);
+        ipAddress = env->GetStringUTFChars(jIpAddress, nullptr);
     }
     if (jDbPath)
     {
         dbfile = env->GetStringUTFChars(jDbPath, nullptr);
         JniOcSecurity::StoreDbPath(dbfile);
     }
+    //Either we have both paths or neither of them.
+    if ((jDbPathDefault && !jRescueDBPath) || (!jDbPathDefault && jRescueDBPath))
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "path cannot be null");
+        return;
+    }
+
+    if (!jDbPathDefault && !jRescueDBPath)
+    {
+        LOGI("Secure SVR DB feature not enable!!");
+    }
+    else
+    {
+        aesKey = (unsigned char*)calloc(1, sizeof(unsigned char) * AES_KEY_SIZE);
+        defaultPath = env->GetStringUTFChars(jDbPathDefault, nullptr);
+        rescuePath = env->GetStringUTFChars(jRescueDBPath, nullptr);
+        OC::JniOcSecurity::StoreDefault_DbPath(defaultPath, rescuePath, (int)jkeySize);
+
+        jbyte* key = env->GetByteArrayElements(data, 0);
+        jsize arrayLength = env->GetArrayLength(data);
+        if(arrayLength != AES_KEY_SIZE)
+        {
+            ThrowOcException(OC_STACK_INVALID_PARAM, "key size mismatch");
+        }
+        else
+        {
+            for(int i=0;i < AES_KEY_SIZE; i++)
+            {
+                aesKey[i]=(jbyte)key[i];
+            }
+        }
+
+    }
     uint16_t port = 0;
     if (jPort > 0)
     {
         port = static_cast<uint16_t>(jPort);
     }
+
     PlatformConfig cfg{
         JniUtils::getServiceType(env, jServiceType),
         JniUtils::getModeType(env, jModeType),
         ipAddress,
         port,
+        JniUtils::getOCTransportAdapter(jTransport),
         JniUtils::getQOS(env, static_cast<int>(jQOS)),
-        JniOcSecurity::getOCPersistentStorage()
+        aesKey,
+        JniOcSecurity::getOCPersistentStorage(),
+        JniOcSecurity::getOCPersistentStorageEnc(),
+        JniOcSecurity::getOCPersistentStorageRescue()
     };
 
     OCPlatform::Configure(cfg);
+
+}
+
+/*
+* Class:     org_iotivity_base_OcPlatform
+* Method:    stop
+* Signature: ()V
+*/
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_stop
+(JNIEnv *env, jclass clazz)
+{
+    LOGI("OcPlatform.stop");
+
+    try {
+        OCStackResult result = OCPlatform::stop();
+        if (OC_STACK_OK != result)
+        {
+            ThrowOcException(result, "Failed to stop ocplatform");
+            return;
+        }
+    }
+    catch (OCException& e)
+    {
+        LOGE("%s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+    }
+}
+
+/*
+* Class:     org_iotivity_base_OcPlatform
+* Method:    start
+* Signature: ()V
+*/
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_start
+(JNIEnv *env, jclass clazz)
+{
+    LOGI("OcPlatform.start");
+
+    try {
+        OCStackResult result = OCPlatform::start();
+        if (OC_STACK_OK != result)
+        {
+            ThrowOcException(result, "Failed to start ocplatform");
+            return;
+        }
+    }
+    catch (OCException& e)
+    {
+        LOGE("%s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+    }
 }
 
 /*
@@ -359,11 +758,15 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyAllObservers0
 
     JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
         env, jResourceHandle);
-    if (!jniOcResourceHandle) return;
+    if (!jniOcResourceHandle)
+    {
+        return;
+    }
 
     try
     {
-        OCStackResult result = OCPlatform::notifyAllObservers(jniOcResourceHandle->getOCResourceHandle());
+        OCStackResult result =
+            OCPlatform::notifyAllObservers(jniOcResourceHandle->getOCResourceHandle());
 
         if (OC_STACK_OK != result)
         {
@@ -374,7 +777,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyAllObservers0
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
     }
 }
 
@@ -394,11 +797,14 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyAllObservers1
         return;
     }
 
-    JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-        env, jResourceHandle);
-    if (!jniOcResourceHandle) return;
+    JniOcResourceHandle* jniOcResourceHandle =
+        JniOcResourceHandle::getJniOcResourceHandlePtr(env, jResourceHandle);
+    if (!jniOcResourceHandle)
+    {
+        return;
+    }
 
-    try{
+    try {
         OCStackResult result = OCPlatform::notifyAllObservers(
             jniOcResourceHandle->getOCResourceHandle(),
             JniUtils::getQOS(env, static_cast<int>(jQoS)));
@@ -412,7 +818,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyAllObservers1
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
     }
 }
 
@@ -421,8 +827,12 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyAllObservers1
 * Method:    notifyListOfObservers2
 * Signature: (Lorg/iotivity/base/OcResourceHandle;[Ljava/lang/Byte;Lorg/iotivity/base/OcResourceResponse;)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_notifyListOfObservers2(
+    JNIEnv *env,
+    jclass clazz,
+    jobject jResourceHandle,
+    jbyteArray jObservationIdArr,
+    jobject jResourceResponse)
 {
     LOGD("OcPlatform_notifyListOfObservers2");
     if (!jResourceHandle)
@@ -441,13 +851,19 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyListOfObservers2
         return;
     }
 
-    JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-        env, jResourceHandle);
-    if (!jniOcResourceHandle) return;
+    JniOcResourceHandle* jniOcResourceHandle =
+        JniOcResourceHandle::getJniOcResourceHandlePtr(env, jResourceHandle);
+    if (!jniOcResourceHandle)
+    {
+        return;
+    }
 
-    JniOcResourceResponse* jniOcResourceResponse = JniOcResourceResponse::getJniOcResourceResponsePtr(
-        env, jResourceResponse);
-    if (!jniOcResourceResponse) return;
+    JniOcResourceResponse* jniOcResourceResponse =
+        JniOcResourceResponse::getJniOcResourceResponsePtr(env, jResourceResponse);
+    if (!jniOcResourceResponse)
+    {
+        return;
+    }
 
     int len = env->GetArrayLength(jObservationIdArr);
     uint8_t* bArr = (uint8_t*)env->GetByteArrayElements(jObservationIdArr, 0);
@@ -460,7 +876,8 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyListOfObservers2
 
     env->ReleaseByteArrayElements(jObservationIdArr, (jbyte*)bArr, 0);
 
-    try{
+    try
+    {
         OCStackResult result = OCPlatform::notifyListOfObservers(
             jniOcResourceHandle->getOCResourceHandle(),
             observationIds,
@@ -474,7 +891,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyListOfObservers2
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
     }
 }
 
@@ -483,8 +900,13 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyListOfObservers2
 * Method:    notifyListOfObservers3
 * Signature: (Lorg/iotivity/base/OcResourceHandle;[Ljava/lang/Byte;Lorg/iotivity/base/OcResourceResponse;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_notifyListOfObservers3(
+    JNIEnv *env,
+    jclass clazz,
+    jobject jResourceHandle,
+    jbyteArray jObservationIdArr,
+    jobject jResourceResponse,
+    jint jQoS)
 {
     LOGD("OcPlatform_notifyListOfObservers3");
     if (!jResourceHandle)
@@ -503,13 +925,19 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyListOfObservers3
         return;
     }
 
-    JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-        env, jResourceHandle);
-    if (!jniOcResourceHandle) return;
+    JniOcResourceHandle* jniOcResourceHandle =
+        JniOcResourceHandle::getJniOcResourceHandlePtr(env, jResourceHandle);
+    if (!jniOcResourceHandle)
+    {
+        return;
+    }
 
-    JniOcResourceResponse* jniOcResourceResponse = JniOcResourceResponse::getJniOcResourceResponsePtr(
-        env, jResourceResponse);
-    if (!jniOcResourceResponse) return;
+    JniOcResourceResponse* jniOcResourceResponse =
+        JniOcResourceResponse::getJniOcResourceResponsePtr(env, jResourceResponse);
+    if (!jniOcResourceResponse)
+    {
+        return;
+    }
 
     int len = env->GetArrayLength(jObservationIdArr);
     uint8_t* bArr = (uint8_t*)env->GetByteArrayElements(jObservationIdArr, 0);
@@ -522,7 +950,8 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyListOfObservers3
 
     env->ReleaseByteArrayElements(jObservationIdArr, (jbyte*)bArr, 0);
 
-    try{
+    try
+    {
         OCStackResult result = OCPlatform::notifyListOfObservers(
             jniOcResourceHandle->getOCResourceHandle(),
             observationIds,
@@ -537,7 +966,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyListOfObservers3
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
     }
 }
 
@@ -546,19 +975,24 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_notifyListOfObservers3
 * 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)
+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);
+        host = env->GetStringUTFChars(jHost, nullptr);
     }
     std::string resourceUri;
     if (jResourceUri)
     {
-        resourceUri = env->GetStringUTFChars(jResourceUri, NULL);
+        resourceUri = env->GetStringUTFChars(jResourceUri, nullptr);
     }
     if (!jListener)
     {
@@ -573,13 +1007,19 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findResource0
         onResFoundListener->foundResourceCallback(resource);
     };
 
+    FindErrorCallback findErrorCallback = [onResFoundListener](const std::string& uri, const int eCode)
+    {
+        onResFoundListener->findResourceErrorCallback(uri, eCode);
+    };
+
     try
     {
         OCStackResult result = OCPlatform::findResource(
             host,
             resourceUri,
             static_cast<OCConnectivityType>(jConnectivityType),
-            findCallback);
+            findCallback,
+            findErrorCallback);
 
         if (OC_STACK_OK != result)
         {
@@ -590,7 +1030,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findResource0
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
     }
 }
 
@@ -599,19 +1039,25 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findResource0
 * 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)
+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);
+        host = env->GetStringUTFChars(jHost, nullptr);
     }
     std::string resourceUri;
     if (jResourceUri)
     {
-        resourceUri = env->GetStringUTFChars(jResourceUri, NULL);
+        resourceUri = env->GetStringUTFChars(jResourceUri, nullptr);
     }
     if (!jListener)
     {
@@ -625,6 +1071,11 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findResource1
         onResFoundListener->foundResourceCallback(resource);
     };
 
+    FindErrorCallback findErrorCallback = [onResFoundListener](const std::string& uri, const int eCode)
+    {
+        onResFoundListener->findResourceErrorCallback(uri, eCode);
+    };
+
     try
     {
         OCStackResult result = OCPlatform::findResource(
@@ -632,6 +1083,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findResource1
             resourceUri,
             static_cast<OCConnectivityType>(jConnectivityType),
             findCallback,
+            findErrorCallback,
             JniUtils::getQOS(env, static_cast<int>(jQoS)));
 
         if (OC_STACK_OK != result)
@@ -643,7 +1095,146 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findResource1
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+    }
+}
+
+/*
+ * Class:     org_iotivity_base_OcPlatform
+ * Method:    findDirectPairingDevices
+ * Signature: (ILorg/iotivity/base/OcPlatform/FindDirectPairingListener;)V
+ */
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findDirectPairingDevices
+  (JNIEnv * env, jclass clazz, jint jTimeout, jobject jListener)
+{
+    LOGD("OcPlatform_findDirectPairingDevices");
+
+    if (!jListener)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onDPDevicesFoundListener cannot be null");
+        return;
+    }
+    JniOnDPDevicesFoundListener *onDPDevsFoundListener = AddOnDPDevicesFoundListener(env,
+            jListener);
+
+    GetDirectPairedCallback getDirectPairedCallback =
+        [onDPDevsFoundListener](PairedDevices pairingDevList)
+        {
+            onDPDevsFoundListener->directPairingDevicesCallback(pairingDevList,
+                    DPFunc::FIND_DIRECT_PAIRED_DEV_LIST);
+        };
+
+    try
+    {
+        OCStackResult result = OCPlatform::findDirectPairingDevices(jTimeout,
+                getDirectPairedCallback);
+        if (OC_STACK_OK != result)
+        {
+            ThrowOcException(result, "OCPlatform::findDirectPairingDevices has failed");
+            return;
+        }
+    }
+    catch (OCException& e)
+    {
+        LOGE("%s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+    }
+}
+
+/*
+ * Class:     org_iotivity_base_OcPlatform
+ * Method:    getDirectPairedDevices
+ * Signature: (Lorg/iotivity/base/OcDirectPairDevice/GetDirectPairedListener;)V
+ */
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getDirectPairedDevices
+(JNIEnv *env, jclass jclazz, jobject jListener)
+{
+    LOGD("OcPlatform_getDirectPairedDevices");
+
+    if (!jListener)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "getPairedDevList Callback cannot be null");
+        return;
+    }
+    JniOnDPDevicesFoundListener *onGetPairedDevicesListener = AddOnDPDevicesFoundListener(env,
+            jListener);
+
+    GetDirectPairedCallback getDirectPairedCallback =
+        [onGetPairedDevicesListener](PairedDevices pairedDevList)
+        {
+            onGetPairedDevicesListener->directPairingDevicesCallback(pairedDevList,
+                    DPFunc::GET_PAIRED_DEV_LIST);
+        };
+
+    try
+    {
+        OCStackResult result = OCPlatform::getDirectPairedDevices(getDirectPairedCallback);
+        if (OC_STACK_OK != result)
+        {
+            ThrowOcException(result, "OcDirectPairDevice_getDirectPairedDevices");
+            return;
+        }
+    }
+    catch (OCException& e)
+    {
+        LOGE("%s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+    }
+}
+
+/*
+ * Class:     org_iotivity_base_OcPlatform
+ * Method:    doDirectPairing
+ * Signature: (Lorg/iotivity/base/OcDirectPairDevice;Lorg/iotivity/base/OcPrmType;
+ *           Ljava/lang/String;Lorg/iotivity/base/OcDirectPairDevice/DirectPairingListener;)V
+ */
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_doDirectPairing0
+(JNIEnv *env, jclass clazz, jobject jpeer, jint jprmType, jstring jpin, jobject jListener)
+{
+    LOGD("OcPlatform_doDirectPairing");
+
+    if (!jListener)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "doDirectPairing Callback cannot be null");
+        return;
+    }
+    if (!jpeer)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "Peer cannot be null");
+        return;
+    }
+
+    JniOnDirectPairingListener *onDirectPairingListener = AddOnDirectPairingListener(env,
+            jListener);
+
+    DirectPairingCallback DirectPairingCB =
+        [onDirectPairingListener](std::shared_ptr<OCDirectPairing> dpDev, OCStackResult result)
+        {
+            onDirectPairingListener->doDirectPairingCB(dpDev, result);
+        };
+
+    JniOcDirectPairDevice *dev = JniOcDirectPairDevice::getJniOcDirectPairDevicePtr(env, jpeer);
+
+    if (!dev)
+    {
+        return ;
+    }
+    std::string pin = env->GetStringUTFChars(jpin, 0);
+
+    try
+    {
+        OCStackResult result = OCPlatform::doDirectPairing(dev->getPtr(), (OCPrm_t)jprmType,
+                pin, DirectPairingCB);
+        if (OC_STACK_OK != result)
+        {
+            ThrowOcException(result, "OcPlatform_oDirectPairing");
+            return;
+        }
+    }
+    catch (OCException& e)
+    {
+        LOGE("%s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
     }
 }
 
@@ -652,19 +1243,24 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findResource1
 * 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)
+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);
+        host = env->GetStringUTFChars(jHost, nullptr);
     }
     std::string resourceUri;
     if (jResourceUri)
     {
-        resourceUri = env->GetStringUTFChars(jResourceUri, NULL);
+        resourceUri = env->GetStringUTFChars(jResourceUri, nullptr);
     }
     if (!jListener)
     {
@@ -673,10 +1269,11 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getDeviceInfo0
     }
     JniOnDeviceInfoListener *onDeviceInfoListener = AddOnDeviceInfoListener(env, jListener);
 
-    FindDeviceCallback findDeviceCallback = [onDeviceInfoListener](const OCRepresentation& ocRepresentation)
-    {
-        onDeviceInfoListener->foundDeviceCallback(ocRepresentation);
-    };
+    FindDeviceCallback findDeviceCallback =
+        [onDeviceInfoListener](const OCRepresentation& ocRepresentation)
+        {
+            onDeviceInfoListener->foundDeviceCallback(ocRepresentation);
+        };
 
     try
     {
@@ -694,7 +1291,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getDeviceInfo0
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
     }
 }
 
@@ -703,19 +1300,25 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getDeviceInfo0
 * 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)
+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);
+        host = env->GetStringUTFChars(jHost, nullptr);
     }
     std::string resourceUri;
     if (jResourceUri)
     {
-        resourceUri = env->GetStringUTFChars(jResourceUri, NULL);
+        resourceUri = env->GetStringUTFChars(jResourceUri, nullptr);
     }
     if (!jListener)
     {
@@ -724,10 +1327,11 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getDeviceInfo1
     }
     JniOnDeviceInfoListener *onDeviceInfoListener = AddOnDeviceInfoListener(env, jListener);
 
-    FindDeviceCallback findDeviceCallback = [onDeviceInfoListener](const OCRepresentation& ocRepresentation)
-    {
-        onDeviceInfoListener->foundDeviceCallback(ocRepresentation);
-    };
+    FindDeviceCallback findDeviceCallback =
+        [onDeviceInfoListener](const OCRepresentation& ocRepresentation)
+        {
+            onDeviceInfoListener->foundDeviceCallback(ocRepresentation);
+        };
 
     try
     {
@@ -746,7 +1350,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getDeviceInfo1
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
     }
 }
 
@@ -755,19 +1359,24 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getDeviceInfo1
 * 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)
+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);
+        host = env->GetStringUTFChars(jHost, nullptr);
     }
     std::string resourceUri;
     if (jResourceUri)
     {
-        resourceUri = env->GetStringUTFChars(jResourceUri, NULL);
+        resourceUri = env->GetStringUTFChars(jResourceUri, nullptr);
     }
     if (!jListener)
     {
@@ -776,10 +1385,11 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getPlatformInfo0
     }
     JniOnPlatformInfoListener *onPlatformInfoListener = AddOnPlatformInfoListener(env, jListener);
 
-    FindPlatformCallback findPlatformCallback = [onPlatformInfoListener](const OCRepresentation& ocRepresentation)
-    {
-        onPlatformInfoListener->foundPlatformCallback(ocRepresentation);
-    };
+    FindPlatformCallback findPlatformCallback =
+        [onPlatformInfoListener](const OCRepresentation& ocRepresentation)
+        {
+            onPlatformInfoListener->foundPlatformCallback(ocRepresentation);
+        };
 
     try
     {
@@ -797,7 +1407,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getPlatformInfo0
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
     }
 }
 
@@ -806,31 +1416,38 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getPlatformInfo0
 * 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)
+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);
+        host = env->GetStringUTFChars(jHost, nullptr);
     }
     std::string resourceUri;
     if (jResourceUri)
     {
-        resourceUri = env->GetStringUTFChars(jResourceUri, NULL);
+        resourceUri = env->GetStringUTFChars(jResourceUri, nullptr);
     }
     if (!jListener)
     {
         ThrowOcException(OC_STACK_INVALID_PARAM, "onPlatformFoundListener cannot be null");
         return;
     }
-    JniOnDeviceInfoListener *onDeviceInfoListener = AddOnDeviceInfoListener(env, jListener);
+    JniOnPlatformInfoListener *onPlatformInfoListener = AddOnPlatformInfoListener(env, jListener);
 
-    FindDeviceCallback findDeviceCallback = [onDeviceInfoListener](const OCRepresentation& ocRepresentation)
-    {
-        onDeviceInfoListener->foundDeviceCallback(ocRepresentation);
-    };
+    FindPlatformCallback findPlatformCallback =
+        [onPlatformInfoListener](const OCRepresentation& ocRepresentation)
+        {
+            onPlatformInfoListener->foundPlatformCallback(ocRepresentation);
+        };
 
     try
     {
@@ -838,7 +1455,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getPlatformInfo1
             host,
             resourceUri,
             static_cast<OCConnectivityType>(jConnectivityType),
-            findDeviceCallback,
+            findPlatformCallback,
             JniUtils::getQOS(env, static_cast<int>(jQoS)));
 
         if (OC_STACK_OK != result)
@@ -849,7 +1466,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getPlatformInfo1
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
     }
 }
 
@@ -858,8 +1475,8 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getPlatformInfo1
 * 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)
+JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_registerResource0(
+    JNIEnv *env, jclass clazz, jobject jResource)
 {
     LOGD("OcPlatform_registerResource");
     if (!jResource)
@@ -868,7 +1485,10 @@ JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_registerResource0
         return nullptr;
     }
     JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, jResource);
-    if (!resource) return nullptr;
+    if (!resource)
+    {
+        return nullptr;
+    }
 
     OCResourceHandle resourceHandle;
     try
@@ -885,12 +1505,13 @@ JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_registerResource0
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), 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);
+    jobject jResourceHandle =
+        env->NewObject(g_cls_OcResourceHandle, g_mid_OcResourceHandle_N_ctor, handle);
 
     if (!jResourceHandle)
     {
@@ -905,36 +1526,41 @@ JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_registerResource0
 * 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,
+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);
+        resourceUri = env->GetStringUTFChars(jResourceUri, nullptr);
     }
     std::string resourceTypeName;
     if (jResourceTypeName)
     {
-        resourceTypeName = env->GetStringUTFChars(jResourceTypeName, NULL);
+        resourceTypeName = env->GetStringUTFChars(jResourceTypeName, nullptr);
     }
     std::string resourceInterface;
     if (jResourceInterface)
     {
-        resourceInterface = env->GetStringUTFChars(jResourceInterface, NULL);
+        resourceInterface = env->GetStringUTFChars(jResourceInterface, nullptr);
     }
-    if (!jListener)
+    JniEntityHandler* entityHandler = NULL;
+    EntityHandler handleEntityCallback = NULL;
+    if (jListener)
     {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "entityHandler cannot be null");
-        return nullptr;
+        entityHandler = new JniEntityHandler(env, jListener);
+        handleEntityCallback =
+            [entityHandler](const std::shared_ptr<OCResourceRequest> request) -> OCEntityHandlerResult
+            {
+                return entityHandler->handleEntity(request);
+            };
     }
-    JniEntityHandler* entityHandler = new JniEntityHandler(env, jListener);
-    EntityHandler handleEntityCallback = [entityHandler](const std::shared_ptr<OCResourceRequest> request) ->
-        OCEntityHandlerResult{
-        return entityHandler->handleEntity(request);
-    };
 
     OCResourceHandle resourceHandle;
     try
@@ -958,13 +1584,14 @@ jobject jListener, jint jResourceProperty)
     {
         LOGE("%s", e.reason().c_str());
         delete entityHandler;
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), 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);
+    jobject jResourceHandle =
+        env->NewObject(g_cls_OcResourceHandle, g_mid_OcResourceHandle_N_ctor, handle);
     if (!jResourceHandle)
     {
         LOGE("Failed to create OcResourceHandle");
@@ -979,23 +1606,52 @@ jobject jListener, jint jResourceProperty)
 * 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)
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_registerDeviceInfo0(
+    JNIEnv *env,
+    jclass clazz,
+    jstring jDeviceName,
+    jobjectArray jDeviceTypes)
 {
     LOGI("OcPlatform_registerDeviceInfo");
 
-    std::string deviceName;
-    if (jDeviceName)
+    if (!jDeviceName)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "deviceName cannot be null");
+        return;
+    }
+
+    if (!jDeviceTypes)
     {
-        deviceName = env->GetStringUTFChars(jDeviceName, NULL);
+        ThrowOcException(OC_STACK_INVALID_PARAM, "deviceTypes cannot be null");
+        return;
     }
 
     OCDeviceInfo deviceInfo;
+    memset(&deviceInfo, 0, sizeof(deviceInfo));
     try
     {
-        DuplicateString(&deviceInfo.deviceName, deviceName);
+        DuplicateString(&deviceInfo.deviceName, env->GetStringUTFChars(jDeviceName, nullptr));
+
+        jsize len = env->GetArrayLength(jDeviceTypes);
+        for (jsize i = 0; i < len; ++i)
+        {
+            jstring jStr = (jstring)env->GetObjectArrayElement(jDeviceTypes, i);
+            if (!jStr)
+            {
+                delete[] deviceInfo.deviceName;
+                ThrowOcException(OC_STACK_INVALID_PARAM, "device type cannot be null");
+                return;
+            }
+
+            OCResourcePayloadAddStringLL(&deviceInfo.types, env->GetStringUTFChars(jStr, nullptr));
+            if (env->ExceptionCheck())
+            {
+                delete[] deviceInfo.deviceName;
+                return;
+            }
+
+            env->DeleteLocalRef(jStr);
+        }
     }
     catch (std::exception &e)
     {
@@ -1007,7 +1663,7 @@ jstring jDeviceName)
     {
         OCStackResult result = OCPlatform::registerDeviceInfo(deviceInfo);
 
-        delete deviceInfo.deviceName;
+        delete[] deviceInfo.deviceName;
 
         if (OC_STACK_OK != result)
         {
@@ -1018,7 +1674,7 @@ jstring jDeviceName)
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
     }
 }
 
@@ -1027,20 +1683,20 @@ jstring jDeviceName)
 * 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
 */
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_registerPlatformInfo0
-(JNIEnv *env,
-jclass clazz,
-jstring jPlatformID,
-jstring jManufacturerName,
-jstring jManufacturerUrl,
-jstring jModelNumber,
-jstring jDateOfManufacture,
-jstring jPlatformVersion,
-jstring jOperatingSystemVersion,
-jstring jHardwareVersion,
-jstring jFirmwareVersion,
-jstring jSupportUrl,
-jstring jSystemTime)
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_registerPlatformInfo0(
+    JNIEnv *env,
+    jclass clazz,
+    jstring jPlatformID,
+    jstring jManufacturerName,
+    jstring jManufacturerUrl,
+    jstring jModelNumber,
+    jstring jDateOfManufacture,
+    jstring jPlatformVersion,
+    jstring jOperatingSystemVersion,
+    jstring jHardwareVersion,
+    jstring jFirmwareVersion,
+    jstring jSupportUrl,
+    jstring jSystemTime)
 {
     LOGI("OcPlatform_registerPlatformInfo");
 
@@ -1059,47 +1715,47 @@ jstring jSystemTime)
 
         if (jPlatformID)
         {
-            platformID = env->GetStringUTFChars(jPlatformID, NULL);
+            platformID = env->GetStringUTFChars(jPlatformID, nullptr);
         }
         if (jManufacturerName)
         {
-            manufacturerName = env->GetStringUTFChars(jManufacturerName, NULL);
+            manufacturerName = env->GetStringUTFChars(jManufacturerName, nullptr);
         }
         if (jManufacturerUrl)
         {
-            manufacturerUrl = env->GetStringUTFChars(jManufacturerUrl, NULL);
+            manufacturerUrl = env->GetStringUTFChars(jManufacturerUrl, nullptr);
         }
         if (jModelNumber)
         {
-            modelNumber = env->GetStringUTFChars(jModelNumber, NULL);
+            modelNumber = env->GetStringUTFChars(jModelNumber, nullptr);
         }
         if (jDateOfManufacture)
         {
-            dateOfManufacture = env->GetStringUTFChars(jDateOfManufacture, NULL);
+            dateOfManufacture = env->GetStringUTFChars(jDateOfManufacture, nullptr);
         }
         if (jPlatformVersion)
         {
-            platformVersion = env->GetStringUTFChars(jPlatformVersion, NULL);
+            platformVersion = env->GetStringUTFChars(jPlatformVersion, nullptr);
         }
         if (jOperatingSystemVersion)
         {
-            operatingSystemVersion = env->GetStringUTFChars(jOperatingSystemVersion, NULL);
+            operatingSystemVersion = env->GetStringUTFChars(jOperatingSystemVersion, nullptr);
         }
         if (jHardwareVersion)
         {
-            hardwareVersion = env->GetStringUTFChars(jHardwareVersion, NULL);
+            hardwareVersion = env->GetStringUTFChars(jHardwareVersion, nullptr);
         }
         if (jFirmwareVersion)
         {
-            firmwareVersion = env->GetStringUTFChars(jFirmwareVersion, NULL);
+            firmwareVersion = env->GetStringUTFChars(jFirmwareVersion, nullptr);
         }
         if (jSupportUrl)
         {
-            supportUrl = env->GetStringUTFChars(jSupportUrl, NULL);
+            supportUrl = env->GetStringUTFChars(jSupportUrl, nullptr);
         }
         if (jSystemTime)
         {
-            systemTime = env->GetStringUTFChars(jSystemTime, NULL);
+            systemTime = env->GetStringUTFChars(jSystemTime, nullptr);
         }
 
         OCPlatformInfo platformInfo;
@@ -1128,17 +1784,17 @@ jstring jSystemTime)
         {
             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;
+            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)
             {
@@ -1148,12 +1804,107 @@ jstring jSystemTime)
         }
         catch (OCException& e)
         {
-            LOGE("Error is due to %s", e.reason().c_str());
-            ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+            LOGE("Error is due to %s", e.reason().c_str());
+            ThrowOcException(e.code(), e.reason().c_str());
+        }
+}
+
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_setPropertyValue0
+    (JNIEnv *env, jclass clazz, jint jType, jstring jPropName, jobjectArray jPropValue)
+{
+    try
+    {
+        OCPayloadType type = (OCPayloadType)jType;
+        std::string propName;
+        std::vector<std::string> propValue;
+        if (jPropName)
+        {
+            propName = env->GetStringUTFChars(jPropName, nullptr);
+        }
+        if (jPropValue)
+        {
+            JniUtils::convertJavaStrArrToStrVector(env, jPropValue, propValue);
+        }
+        OCStackResult result = OCPlatform::setPropertyValue(type, propName, propValue);
+        if (OC_STACK_OK != result)
+        {
+            ThrowOcException(result, "Failed to set property");
+            return;
+        }
+    }
+    catch (OCException& e)
+    {
+        LOGE("Error is due to %s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+    }
+
+}
+
+/*
+* Class:     org_iotivity_base_OcPlatform
+* Method:    setPropertyValue0
+* Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+*/
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_setPropertyValue1
+    (JNIEnv *env, jclass clazz, jint jType, jstring jPropName, jstring jPropValue)
+{
+    try
+    {
+        OCPayloadType type = (OCPayloadType)jType;
+        std::string propName;
+        std::string propValue;
+        if (jPropName)
+        {
+            propName = env->GetStringUTFChars(jPropName, nullptr);
+        }
+        if (jPropValue)
+        {
+            propValue = env->GetStringUTFChars(jPropValue, nullptr);
+        }
+        OCStackResult result = OCPlatform::setPropertyValue(type, propName, propValue);
+        if (OC_STACK_OK != result)
+        {
+            ThrowOcException(result, "Failed to set property");
+            return;
+        }
+    }
+    catch (OCException& e)
+    {
+        LOGE("Error is due to %s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+    }
+}
+
+/*
+* Class:     org_iotivity_base_OcPlatform
+* Method:    getPropertyValue
+* Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+*/
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_getPropertyValue0
+    (JNIEnv *env, jclass clazz, jint jType, jstring jPropName, jstring jPropValue)
+{
+    try
+    {
+        OCPayloadType type = (OCPayloadType) jType;
+        std::string propName;
+        std::string propValue;
+
+        if (jPropName)
+        {
+            propName = env->GetStringUTFChars(jPropName, nullptr);
+        }
+        OCStackResult result = OCPlatform::getPropertyValue(type, propName, propValue);
+        if (OC_STACK_OK != result)
+        {
+            ThrowOcException(result, "Failed to get property value.");
+            return;
         }
-
-
-
+    }
+    catch (OCException& e)
+    {
+        LOGE("Error is due to %s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+    }
 }
 
 /*
@@ -1161,8 +1912,8 @@ jstring jSystemTime)
 * Method:    unregisterResource0
 * Signature: (Lorg/iotivity/base/OcResourceHandle;)V
 */
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unregisterResource0
-(JNIEnv *env, jclass clazz, jobject jResourceHandle)
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unregisterResource0(
+    JNIEnv *env, jclass clazz, jobject jResourceHandle)
 {
     LOGI("OcPlatform_unregisterResource");
     if (!jResourceHandle)
@@ -1172,7 +1923,10 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unregisterResource0
     }
     JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
         env, jResourceHandle);
-    if (!jniOcResourceHandle) return;
+    if (!jniOcResourceHandle)
+    {
+        return;
+    }
 
     try
     {
@@ -1186,7 +1940,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unregisterResource0
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
     }
 }
 
@@ -1209,13 +1963,19 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindResource0
         ThrowOcException(OC_STACK_INVALID_PARAM, "resourceHandle cannot be null");
         return;
     }
-    JniOcResourceHandle* jniOcResourceCollectionHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-        env, jResourceCollectionHandle);
-    if (!jniOcResourceCollectionHandle) return;
+    JniOcResourceHandle* jniOcResourceCollectionHandle =
+        JniOcResourceHandle::getJniOcResourceHandlePtr(env, jResourceCollectionHandle);
+    if (!jniOcResourceCollectionHandle)
+    {
+        return;
+    }
 
     JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
         env, jResourceHandle);
-    if (!jniOcResourceHandle) return;
+    if (!jniOcResourceHandle)
+    {
+        return;
+    }
 
     try
     {
@@ -1232,7 +1992,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindResource0
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
     }
 }
 
@@ -1241,8 +2001,11 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindResource0
 * 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)
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindResources0(
+    JNIEnv *env,
+    jclass clazz,
+    jobject jResourceCollectionHandle,
+    jobjectArray jResourceHandleArray)
 {
     LOGI("OcPlatform_bindResources");
 
@@ -1257,9 +2020,12 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindResources0
         return;
     }
 
-    JniOcResourceHandle* jniOcResourceCollectionHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-        env, jResourceCollectionHandle);
-    if (!jniOcResourceCollectionHandle) return;
+    JniOcResourceHandle* jniOcResourceCollectionHandle =
+        JniOcResourceHandle::getJniOcResourceHandlePtr(env, jResourceCollectionHandle);
+    if (!jniOcResourceCollectionHandle)
+    {
+        return;
+    }
 
     std::vector<OCResourceHandle> resourceHandleList;
     int len = env->GetArrayLength(jResourceHandleArray);
@@ -1272,9 +2038,12 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindResources0
             return;
         }
 
-        JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-            env, jResourceHandle);
-        if (!jniOcResourceHandle) return;
+        JniOcResourceHandle* jniOcResourceHandle =
+            JniOcResourceHandle::getJniOcResourceHandlePtr(env, jResourceHandle);
+        if (!jniOcResourceHandle)
+        {
+            return;
+        }
 
         resourceHandleList.push_back(
             jniOcResourceHandle->getOCResourceHandle());
@@ -1295,7 +2064,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindResources0
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
     }
 }
 
@@ -1304,8 +2073,11 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindResources0
 * 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)
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unbindResource0(
+    JNIEnv *env,
+    jclass clazz,
+    jobject jResourceCollectionHandle,
+    jobject jResourceHandle)
 {
     LOGI("OcPlatform_unbindResource");
     if (!jResourceCollectionHandle)
@@ -1319,20 +2091,25 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unbindResource0
         return;
     }
 
-    JniOcResourceHandle* jniOcResourceCollectionHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-        env, jResourceCollectionHandle);
-    if (!jniOcResourceCollectionHandle) return;
+    JniOcResourceHandle* jniOcResourceCollectionHandle =
+        JniOcResourceHandle::getJniOcResourceHandlePtr(env, jResourceCollectionHandle);
+    if (!jniOcResourceCollectionHandle)
+    {
+        return;
+    }
 
-    JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-        env, jResourceHandle);
-    if (!jniOcResourceHandle) return;
+    JniOcResourceHandle* jniOcResourceHandle =
+        JniOcResourceHandle::getJniOcResourceHandlePtr(env, jResourceHandle);
+    if (!jniOcResourceHandle)
+    {
+        return;
+    }
 
     try
     {
         OCStackResult result = OCPlatform::unbindResource(
             jniOcResourceCollectionHandle->getOCResourceHandle(),
-            jniOcResourceHandle->getOCResourceHandle()
-            );
+            jniOcResourceHandle->getOCResourceHandle());
 
         if (OC_STACK_OK != result)
         {
@@ -1342,7 +2119,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unbindResource0
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
     }
 }
 
@@ -1351,8 +2128,11 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unbindResource0
 * 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)
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unbindResources0(
+    JNIEnv *env,
+    jclass clazz,
+    jobject jResourceCollectionHandle,
+    jobjectArray jResourceHandleArray)
 {
     LOGI("OcPlatform_unbindResources");
     if (!jResourceCollectionHandle)
@@ -1366,9 +2146,12 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unbindResources0
         return;
     }
 
-    JniOcResourceHandle* jniOcResourceCollectionHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-        env, jResourceCollectionHandle);
-    if (!jniOcResourceCollectionHandle) return;
+    JniOcResourceHandle* jniOcResourceCollectionHandle =
+        JniOcResourceHandle::getJniOcResourceHandlePtr(env, jResourceCollectionHandle);
+    if (!jniOcResourceCollectionHandle)
+    {
+        return;
+    }
 
     std::vector<OCResourceHandle> resourceHandleList;
     int len = env->GetArrayLength(jResourceHandleArray);
@@ -1381,9 +2164,12 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unbindResources0
             return;
         }
 
-        JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-            env, jResourceHandle);
-        if (!jniOcResourceHandle) return;
+        JniOcResourceHandle* jniOcResourceHandle =
+            JniOcResourceHandle::getJniOcResourceHandlePtr(env, jResourceHandle);
+        if (!jniOcResourceHandle)
+        {
+            return;
+        }
 
         resourceHandleList.push_back(
             jniOcResourceHandle->getOCResourceHandle());
@@ -1404,7 +2190,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unbindResources0
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
     }
 }
 
@@ -1413,8 +2199,11 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unbindResources0
 * 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)
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindTypeToResource0(
+    JNIEnv *env,
+    jclass clazz,
+    jobject jResourceHandle,
+    jstring jResourceTypeName)
 {
     LOGI("OcPlatform_bindTypeToResource");
     if (!jResourceHandle)
@@ -1425,12 +2214,15 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindTypeToResource0
     std::string typeName;
     if (jResourceTypeName)
     {
-        typeName = env->GetStringUTFChars(jResourceTypeName, NULL);
+        typeName = env->GetStringUTFChars(jResourceTypeName, nullptr);
     }
 
-    JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-        env, jResourceHandle);
-    if (!jniOcResourceHandle) return;
+    JniOcResourceHandle* jniOcResourceHandle =
+        JniOcResourceHandle::getJniOcResourceHandlePtr(env, jResourceHandle);
+    if (!jniOcResourceHandle)
+    {
+        return;
+    }
 
     try
     {
@@ -1447,7 +2239,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindTypeToResource0
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
     }
 }
 
@@ -1468,12 +2260,15 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindInterfaceToResource
     std::string interfaceName;
     if (jResourceInterfaceName)
     {
-        interfaceName = env->GetStringUTFChars(jResourceInterfaceName, NULL);
+        interfaceName = env->GetStringUTFChars(jResourceInterfaceName, nullptr);
     }
 
-    JniOcResourceHandle* jniOcResourceHandle = JniOcResourceHandle::getJniOcResourceHandlePtr(
-        env, jResourceHandle);
-    if (!jniOcResourceHandle) return;
+    JniOcResourceHandle* jniOcResourceHandle =
+        JniOcResourceHandle::getJniOcResourceHandlePtr(env, jResourceHandle);
+    if (!jniOcResourceHandle)
+    {
+        return;
+    }
 
     try
     {
@@ -1490,7 +2285,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindInterfaceToResource
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
     }
 }
 
@@ -1499,8 +2294,8 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_bindInterfaceToResource
 * Method:    startPresence0
 * Signature: (I)V
 */
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_startPresence0
-(JNIEnv *env, jclass clazz, jint ttl)
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_startPresence0(
+    JNIEnv *env, jclass clazz, jint ttl)
 {
     LOGI("OcPlatform_startPresence");
 
@@ -1516,7 +2311,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_startPresence0
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
     }
 }
 
@@ -1525,8 +2320,8 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_startPresence0
 * Method:    stopPresence0
 * Signature: ()V
 */
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_stopPresence0
-(JNIEnv *env, jclass clazz)
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_stopPresence0(
+    JNIEnv *env, jclass clazz)
 {
     LOGI("OcPlatform_stopPresence");
 
@@ -1542,7 +2337,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_stopPresence0
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
     }
 }
 
@@ -1551,14 +2346,18 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_stopPresence0
 * 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)
+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);
+        host = env->GetStringUTFChars(jHost, nullptr);
     }
     if (!jListener)
     {
@@ -1568,11 +2367,13 @@ JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_subscribePresence0
 
     JniOnPresenceListener *onPresenceListener = AddOnPresenceListener(env, jListener);
 
-    SubscribeCallback subscribeCallback = [onPresenceListener](OCStackResult result, const unsigned int nonce,
-        const std::string& hostAddress)
-    {
-        onPresenceListener->onPresenceCallback(result, nonce, hostAddress);
-    };
+    SubscribeCallback subscribeCallback =
+        [onPresenceListener](OCStackResult result,
+                             const unsigned int nonce,
+                             const std::string& hostAddress)
+        {
+            onPresenceListener->onPresenceCallback(result, nonce, hostAddress);
+        };
 
     OCPlatform::OCPresenceHandle presenceHandle;
     try
@@ -1591,13 +2392,15 @@ JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_subscribePresence0
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
         return nullptr;
     }
 
-    JniOcPresenceHandle* jniPresenceHandle = new JniOcPresenceHandle(onPresenceListener, presenceHandle);
+    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);
+    jobject jPresenceHandle =
+        env->NewObject(g_cls_OcPresenceHandle, g_mid_OcPresenceHandle_N_ctor, jhandle);
     if (!jPresenceHandle)
     {
         LOGE("Failed to create OcPresenceHandle");
@@ -1612,19 +2415,24 @@ JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_subscribePresence0
 * 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)
+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);
+        host = env->GetStringUTFChars(jHost, nullptr);
     }
     std::string resourceType;
     if (jResourceType)
     {
-        resourceType = env->GetStringUTFChars(jResourceType, NULL);
+        resourceType = env->GetStringUTFChars(jResourceType, nullptr);
     }
     if (!jListener)
     {
@@ -1658,13 +2466,15 @@ JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_subscribePresence1
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
         return nullptr;
     }
 
-    JniOcPresenceHandle* jniPresenceHandle = new JniOcPresenceHandle(onPresenceListener, presenceHandle);
+    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);
+    jobject jPresenceHandle =
+        env->NewObject(g_cls_OcPresenceHandle, g_mid_OcPresenceHandle_N_ctor, jhandle);
     if (!jPresenceHandle)
     {
         LOGE("Failed to create OcPresenceHandle");
@@ -1678,8 +2488,8 @@ JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_subscribePresence1
 * Method:    unsubscribePresence0
 * Signature: (Lorg/iotivity/base/OcPresenceHandle;)V
 */
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unsubscribePresence0
-(JNIEnv *env, jclass clazz, jobject jPresenceHandle)
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unsubscribePresence0(
+    JNIEnv *env, jclass clazz, jobject jPresenceHandle)
 {
     LOGD("OcPlatform_unsubscribePresence");
     if (!jPresenceHandle)
@@ -1687,8 +2497,12 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unsubscribePresence0
         ThrowOcException(OC_STACK_INVALID_PARAM, "presenceHandle cannot be null");
         return;
     }
-    JniOcPresenceHandle* jniPresenceHandle = JniOcPresenceHandle::getJniOcPresenceHandlePtr(env, jPresenceHandle);
-    if (!jniPresenceHandle) return;
+    JniOcPresenceHandle* jniPresenceHandle =
+        JniOcPresenceHandle::getJniOcPresenceHandlePtr(env, jPresenceHandle);
+    if (!jniPresenceHandle)
+    {
+        return;
+    }
 
     OCPresenceHandle presenceHandle = jniPresenceHandle->getOCPresenceHandle();
 
@@ -1701,17 +2515,106 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unsubscribePresence0
             ThrowOcException(result, "unsubscribe presence has failed");
             return;
         }
-        jweak jwOnPresenceListener = jniPresenceHandle->getJniOnPresenceListener()->getJWListener();
-        if (jwOnPresenceListener)
+
+        JniOnPresenceListener* jniPresenceListener = jniPresenceHandle->getJniOnPresenceListener();
+        if (jniPresenceListener)
+        {
+            jweak jwOnPresenceListener = jniPresenceListener->getJWListener();
+            if (jwOnPresenceListener)
+            {
+                RemoveOnPresenceListener(env, jwOnPresenceListener);
+            }
+        }
+    }
+    catch (OCException& e)
+    {
+        LOGE("%s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+    }
+}
+
+/*
+* Class:     org_iotivity_base_OcPlatform
+* Method:    subscribeDevicePresence0
+* Signature: (Ljava/lang/String;[Ljava/lang/String;I
+Lorg/iotivity/base/OcResource/OnObserveListener;)Lorg/iotivity/base/OcPresenceHandle;
+*/
+JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_subscribeDevicePresence0(
+    JNIEnv *env,
+    jclass clazz,
+    jstring jHost,
+    jobjectArray jDiArray,
+    jint jConnectivityType,
+    jobject jListener)
+{
+    LOGD("OcPlatform_subscribeDevicePresence0");
+#ifdef WITH_CLOUD
+    std::string host;
+    if (jHost)
+    {
+        host = env->GetStringUTFChars(jHost, nullptr);
+    }
+
+    if (!jDiArray)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "device id List cannot be null");
+        return nullptr;
+    }
+
+    std::vector<std::string> di;
+    JniUtils::convertJavaStrArrToStrVector(env, jDiArray, di);
+
+    if (!jListener)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onObserveListener cannot be null");
+        return nullptr;
+    }
+
+    JniOnObserveListener *onObserveListener = AddOnObserveListener(env, jListener);
+
+    ObserveCallback observeCallback = [onObserveListener](const HeaderOptions& opts,
+        const OCRepresentation& rep, const int& eCode, const int& sequenceNumber)
+    {
+        onObserveListener->onObserveCallback(opts, rep, eCode, sequenceNumber);
+    };
+
+    OCPlatform::OCPresenceHandle presenceHandle;
+    try
+    {
+        OCStackResult result = OCPlatform::subscribeDevicePresence(
+            presenceHandle,
+            host,
+            di,
+            static_cast<OCConnectivityType>(jConnectivityType),
+            observeCallback);
+
+        if (OC_STACK_OK != result)
         {
-            RemoveOnPresenceListener(env, jwOnPresenceListener);
+            ThrowOcException(result, "subscribe device presence has failed");
         }
     }
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+        return nullptr;
+    }
+
+    JniOcPresenceHandle* jniPresenceHandle =
+        new JniOcPresenceHandle(onObserveListener, 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;
+#else
+    ThrowOcException(JNI_NO_SUPPORT, "Not supported");
+    return nullptr;
+#endif
 }
 
 /*
@@ -1720,20 +2623,26 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_unsubscribePresence0
 * 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)
+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);
+        host = env->GetStringUTFChars(jHost, nullptr);
     }
     std::string uri;
     if (jUri)
     {
-        uri = env->GetStringUTFChars(jUri, NULL);
+        uri = env->GetStringUTFChars(jUri, nullptr);
     }
     if (!jResourceTypeArray)
     {
@@ -1767,7 +2676,6 @@ jboolean jIsObservable, jobjectArray jResourceTypeArray, jobjectArray jInterface
     }
 
     JniOcResource *jniOcResource = new JniOcResource(resource);
-    jlong handle = reinterpret_cast<jlong>(jniOcResource);
 
     jobject jResource = env->NewObject(g_cls_OcResource, g_mid_OcResource_ctor);
     if (!jResource)
@@ -1789,8 +2697,8 @@ jboolean jIsObservable, jobjectArray jResourceTypeArray, jobjectArray jInterface
 * Method:    sendResponse0
 * Signature: (Lorg/iotivity/base/OcResourceResponse;)V
 */
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_sendResponse0
-(JNIEnv *env, jclass clazz, jobject jResourceResponse)
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_sendResponse0(
+    JNIEnv *env, jclass clazz, jobject jResourceResponse)
 {
     LOGD("OcPlatform_sendResponse");
     if (!jResourceResponse)
@@ -1799,13 +2707,17 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_sendResponse0
         return;
     }
 
-    JniOcResourceResponse *jniResponse = JniOcResourceResponse::getJniOcResourceResponsePtr(
-        env, jResourceResponse);
-    if (!jniResponse) return;
+    JniOcResourceResponse *jniResponse =
+        JniOcResourceResponse::getJniOcResourceResponsePtr(env, jResourceResponse);
+    if (!jniResponse)
+    {
+        return;
+    }
 
     try
     {
-        OCStackResult result = OCPlatform::sendResponse(jniResponse->getOCResourceResponse());
+        OCStackResult result =
+            OCPlatform::sendResponse(jniResponse->getOCResourceResponse());
 
         if (OC_STACK_OK != result)
         {
@@ -1815,6 +2727,262 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_sendResponse0
     catch (OCException& e)
     {
         LOGE("%s", e.reason().c_str());
-        ThrowOcException(OC_STACK_ERROR, e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+    }
+}
+
+/*
+* Class:     org_iotivity_base_OcPlatform
+* Method:    constructAccountManagerObject0
+* Signature: (Ljava/lang/String;I)Lorg/iotivity/base/OcAccountManager;
+*/
+JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcPlatform_constructAccountManagerObject0(
+    JNIEnv *env,
+    jclass clazz,
+    jstring jHost,
+    jint jConnectivityType)
+{
+#ifndef WITH_CLOUD
+    ThrowOcException(OC_STACK_ERROR,
+                     "OCAccountManager is not supported. (Please build with WITH_CLOUD=1 option)");
+    return nullptr;
+#else
+    LOGD("OcPlatform_constructAccountManagerObject");
+    if (!jHost)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "host cannot be null");
+        return nullptr;
+    }
+
+    const char* charHost = env->GetStringUTFChars(jHost, nullptr);
+    if (!charHost)
+    {
+        ThrowOcException(JNI_EXCEPTION, "charHost is null");
+        return nullptr;
+    }
+    std::string host(charHost);
+    env->ReleaseStringUTFChars(jHost, charHost);
+
+    std::shared_ptr<OCAccountManager> accountManager = OCPlatform::constructAccountManagerObject(
+        host,
+        static_cast<OCConnectivityType>(jConnectivityType));
+
+    if (!accountManager)
+    {
+        ThrowOcException(OC_STACK_ERROR, "Failed to create OCAccountManager");
+        return nullptr;
+    }
+
+    JniOcAccountManager *jniOcAccountManager = new JniOcAccountManager(accountManager);
+
+    jobject jAccountManager = env->NewObject(g_cls_OcAccountManager, g_mid_OcAccountManager_ctor);
+    if (!jAccountManager)
+    {
+        delete jniOcAccountManager;
+        return nullptr;
+    }
+    SetHandle<JniOcAccountManager>(env, jAccountManager, jniOcAccountManager);
+    if (env->ExceptionCheck())
+    {
+        delete jniOcAccountManager;
+        return nullptr;
+    }
+    return jAccountManager;
+#endif
+}
+
+/*
+* Class:     org_iotivity_base_OcPlatform
+* Method:    getDeviceId
+* Signature: (I)V
+*/
+JNIEXPORT jbyteArray JNICALL Java_org_iotivity_base_OcPlatform_getDeviceId
+(JNIEnv *env, jobject thiz)
+{
+    LOGD("OcPlatform_getDeviceId");
+    OCUUIdentity deviceId;
+
+    jbyteArray ret = env->NewByteArray(UUID_IDENTITY_SIZE);
+    jbyte uuid[UUID_IDENTITY_SIZE];
+    try
+    {
+
+        OCStackResult result = OCPlatform::getDeviceId(&deviceId);
+        LOGD("OcPlatform_getDeviceId return from CPP");
+        if (OC_STACK_OK != result)
+        {
+            ThrowOcException(result, "Error while getting my device Id");
+        }
+        else
+        {
+            for(int i=0;i < UUID_IDENTITY_SIZE; i++)
+            {
+                uuid[i] =(jbyte) deviceId.id[i];
+            }
+        }
+
+    }
+    catch (OCException& e)
+    {
+        LOGE("%s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+    }
+
+    env->SetByteArrayRegion(ret, 0, UUID_IDENTITY_SIZE, uuid);
+
+    return ret;
+}
+
+/*
+* Class:     org_iotivity_base_OcPlatform
+* Method:    setDeviceId
+* Signature: (Ljava/lang/byte;)V
+*/
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_setDeviceId(
+    JNIEnv *env, jobject thiz, jbyteArray data)
+{
+    LOGI("OcPlatform_setDeviceId");
+    OCUUIdentity deviceId;
+    try
+    {
+        OCStackResult result;
+        jbyte* uuid = env->GetByteArrayElements(data, 0);
+        jsize arrayLength = env->GetArrayLength(data);
+        if(arrayLength!=UUID_IDENTITY_SIZE)
+        {
+            ThrowOcException(OC_STACK_INVALID_PARAM, "Byte length not equal to UUID_IDENTITY_SIZE");
+        }
+        else
+        {
+            for(int i=0;i < UUID_IDENTITY_SIZE; i++)
+            {
+                deviceId.id[i]=(jchar)uuid[i];
+            }
+            result = OCPlatform::setDeviceId(&deviceId);
+            if (OC_STACK_OK != result)
+            {
+                ThrowOcException(result, "Failed to set DeviceId");
+            }
+        }
+    }
+    catch (OCException& e)
+    {
+        LOGE("%s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+    }
+}
+
+/*
+ * Class:     org_iotivity_base_OcPlatform
+ * Method:    findKeepAliveResourceImpl
+ * Signature: (Ljava/lang/String;Lorg/iotivity/base/OcPlatform/KeepAliveListener;)V
+ */
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_findKeepAliveResourceImpl(
+        JNIEnv *env, jclass clazz, jstring jHost, jobject jListener)
+{
+#ifndef TCP_ADAPTER
+    ThrowOcException(OC_STACK_ERROR,
+                     "findKeepAliveResource is not supported. (Please build with WITH_TCP=1 option)");
+    return;
+#else
+    LOGI("OcPlatform_findKeepAliveResource");
+    std::string host;
+    if (!jHost)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "host cannot be null");
+        return;
+    }
+    else
+    {
+        host = env->GetStringUTFChars(jHost, nullptr);
+    }
+
+    if (!jListener)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onKeepAliveFoundListener cannot be null");
+        return;
+    }
+
+    JniKeepAliveListener *onKeepAliveFoundListener = AddKeepAliveListener(env, jListener);
+
+    KeepAliveCallback KeepAliveCallback = [onKeepAliveFoundListener](const int ret,
+                                                                   const OCRepresentation& rep)
+    {
+        onKeepAliveFoundListener->onKeepAliveListener(ret, rep);
+    };
+
+    try
+    {
+        OCStackResult result = OCPlatform::findKeepAliveResource(host, KeepAliveCallback);
+
+        if (OC_STACK_OK != result)
+        {
+            ThrowOcException(result, "findKeepAliveResource has failed");
+        }
+    }
+    catch (OCException& e)
+    {
+        LOGE("%s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+        return;
+    }
+#endif
+}
+
+/*
+ * Class:     org_iotivity_base_OcPlatform
+ * Method:    sendKeepAliveRequestImpl
+ * Signature: (Ljava/lang/String;ILorg/iotivity/base/OcPlatform/KeepAliveListener;)V
+ */
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcPlatform_sendKeepAliveRequestImpl(
+        JNIEnv *env, jclass clazz, jstring jHost, jobject jRep, jobject jListener)
+{
+#ifndef TCP_ADAPTER
+    ThrowOcException(OC_STACK_ERROR,
+                     "sendKeepAlive is not supported. (Please build with WITH_TCP=1 option)");
+    return;
+#else
+    LOGI("OcPlatform_sendKeepAliveRequest");
+    std::string host;
+    if (!jHost)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "host cannot be null");
+        return;
+    }
+    else
+    {
+        host = env->GetStringUTFChars(jHost, nullptr);
+    }
+
+    if (!jListener)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "keepAliveResponseListener cannot be null");
+        return;
+    };
+
+    JniKeepAliveListener *KeepAliveResponseListener = AddKeepAliveListener(env, jListener);
+
+    KeepAliveCallback KeepAliveCallback = [KeepAliveResponseListener](const int ret,
+                                                         const OCRepresentation& rep)
+    {
+        KeepAliveResponseListener->onKeepAliveListener(ret, rep);
+    };
+
+    try
+    {
+        OCRepresentation *rep = JniOcRepresentation::getOCRepresentationPtr(env, jRep);
+        OCStackResult result = OCPlatform::sendKeepAliveRequest(host, *rep, KeepAliveCallback);
+
+        if (OC_STACK_OK != result)
+        {
+            ThrowOcException(result, "sendKeepAliveRequest has failed");
+        }
+    }
+    catch (OCException& e)
+    {
+        LOGE("%s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+        return;
     }
+#endif
 }