Merge tizen_5.0 codes into tizen_4.0
[platform/upstream/iotivity.git] / android / android_api / base / jni / JniOcResource.cpp
index d361c81..f376cdd 100644 (file)
 #include "JniOcRepresentation.h"
 #include "JniUtils.h"
 
-JniOcResource::JniOcResource(std::shared_ptr<OCResource> resource)
-    : m_sharedResource(resource)
-{}
-
-JniOcResource::~JniOcResource()
-{
-    LOGD("~JniOcResource()");
-
-    m_sharedResource->cancelObserve();
-    m_sharedResource = NULL;
-
-    jint envRet;
+class JniOcResourceImpl : public std::enable_shared_from_this<JniOcResourceImpl>
+{
+public:
+    typedef std::shared_ptr<JniOcResourceImpl> Ptr;
+
+    JniOcResourceImpl(std::shared_ptr<OCResource> &resource);
+    ~JniOcResourceImpl();
+
+    OCStackResult get(JNIEnv* env, const QueryParamsMap &queryParametersMap, jobject jListener);
+    OCStackResult get(JNIEnv* env, const QueryParamsMap &queryParametersMap, jobject jListener,
+        QualityOfService QoS);
+    OCStackResult get(JNIEnv* env, const std::string &resourceType, const std::string &resourceInterface,
+        const QueryParamsMap &queryParametersMap, jobject jListener);
+    OCStackResult get(JNIEnv* env, const std::string &resourceType, const std::string &resourceInterface,
+        const QueryParamsMap &queryParametersMap, jobject jListener, QualityOfService QoS);
+
+    OCStackResult put(JNIEnv* env, const OCRepresentation &representation, const QueryParamsMap &queryParametersMap,
+        jobject jListener);
+    OCStackResult put(JNIEnv* env, const OCRepresentation &representation, const QueryParamsMap &queryParametersMap,
+        jobject jListener, QualityOfService QoS);
+    OCStackResult put(JNIEnv* env, const std::string &resourceType, const std::string &resourceInterface,
+        const OCRepresentation &representation, const QueryParamsMap &queryParametersMap, jobject jListener);
+    OCStackResult put(JNIEnv* env, const std::string &resourceType, const std::string &resourceInterface,
+        const OCRepresentation &representation, const QueryParamsMap &queryParametersMap, jobject jListener, QualityOfService QoS);
+
+    OCStackResult post(JNIEnv* env, const OCRepresentation &representation, const QueryParamsMap &queryParametersMap,
+        jobject jListener);
+    OCStackResult post(JNIEnv* env, const OCRepresentation &representation, const QueryParamsMap &queryParametersMap,
+        jobject jListener, QualityOfService QoS);
+    OCStackResult post(JNIEnv* env, const std::string &resourceType, const std::string &resourceInterface,
+        const OCRepresentation &representation, const QueryParamsMap &queryParametersMap, jobject jListener);
+    OCStackResult post(JNIEnv* env, const std::string &resourceType, const std::string &resourceInterface,
+        const OCRepresentation &representation, const QueryParamsMap &queryParametersMap, jobject jListener, QualityOfService QoS);
+
+    OCStackResult deleteResource(JNIEnv* env, jobject jListener);
+    OCStackResult deleteResource(JNIEnv* env, jobject jListener, QualityOfService QoS);
+
+    OCStackResult observe(JNIEnv* env, ObserveType observeType, const QueryParamsMap &queryParametersMap,
+        jobject jListener);
+    OCStackResult observe(JNIEnv* env, ObserveType observeType, const QueryParamsMap &queryParametersMap,
+        jobject jListener, QualityOfService qos);
+
+    OCStackResult cancelObserve(JNIEnv* env);
+    OCStackResult cancelObserve(JNIEnv* env, QualityOfService qos);
+
+    void setHeaderOptions(const HeaderOptions &headerOptions);
+    void unsetHeaderOptions();
+    std::string host();
+    std::string uri();
+    OCConnectivityType connectivityType() const;
+    bool isObservable();
+    std::vector< std::string >  getResourceTypes() const;
+    std::vector< std::string >  getResourceInterfaces(void) const;
+    OCResourceIdentifier uniqueIdentifier() const;
+    std::string sid() const;
+    std::string deviceName() const;
+
+    JniOnGetListener* addOnGetListener(JNIEnv* env, jobject jListener);
+    JniOnPutListener* addOnPutListener(JNIEnv* env, jobject jListener);
+    JniOnPostListener* addOnPostListener(JNIEnv* env, jobject jListener);
+    JniOnDeleteListener* addOnDeleteListener(JNIEnv* env, jobject jListener);
+    JniOnObserveListener* addOnObserveListener(JNIEnv* env, jobject jListener);
+
+    void removeOnGetListener(JNIEnv* env, jobject jListener);
+    void removeOnPutListener(JNIEnv* env, jobject jListener);
+    void removeOnPostListener(JNIEnv* env, jobject jListener);
+    void removeOnDeleteListener(JNIEnv* env, jobject jListener);
+    void removeOnObserveListener(JNIEnv* env, jobject jListener);
+
+    std::shared_ptr<OCResource> getOCResource();
+
+#ifdef WITH_MQ
+    JniOnMQTopicFoundListener* addOnTopicFoundListener(JNIEnv* env, jobject jListener);
+    void removeOnTopicFoundListener(JNIEnv* env, jobject jListener);
+
+    JniOnMQSubscribeListener* addOnMQTopicSubscribeListener(JNIEnv* env, jobject jListener);
+    void removeOnMQTopicSubscribeListener(JNIEnv* env, jobject jListener);
+
+    OCStackResult discoveryMQTopics(JNIEnv* env, const QueryParamsMap &queryParametersMap,
+                                    jobject jListener, QualityOfService QoS);
+    OCStackResult createMQTopic(JNIEnv* env, const OCRepresentation &representation,
+                                const std::string &targetUri,
+                                const QueryParamsMap &queryParametersMap,
+                                jobject jListener, QualityOfService QoS);
+#endif
+#ifdef MQ_SUBSCRIBER
+    OCStackResult subscribeMQTopic(JNIEnv* env, const QueryParamsMap &queryParametersMap,
+                                   jobject jListener, QualityOfService QoS);
+    OCStackResult unsubscribeMQTopic(QualityOfService QoS);
+    OCStackResult requestMQPublish(JNIEnv* env, const QueryParamsMap &queryParametersMap,
+                                   jobject jListener, QualityOfService QoS);
+#endif
+#ifdef MQ_PUBLISHER
+    OCStackResult publishMQTopic(JNIEnv* env, const OCRepresentation &representation,
+                                 const QueryParamsMap &queryParametersMap,
+                                 jobject jListener, QualityOfService QoS);
+#endif
+
+private:
+
+    static void onGetCallback(const HeaderOptions& opts, const OCRepresentation& rep,
+                              const int eCode, JniOnGetListener *listener,
+                              std::weak_ptr<JniOcResourceImpl> weakRef);
+
+    static void onPutCallback(const HeaderOptions& opts, const OCRepresentation& rep,
+                              const int eCode, JniOnPutListener *listener,
+                              std::weak_ptr<JniOcResourceImpl> weakRef);
+
+    static void onPostCallback(const HeaderOptions& opts, const OCRepresentation& rep,
+                               const int eCode, JniOnPostListener *listener,
+                               std::weak_ptr<JniOcResourceImpl> weakRef);
+
+    static void onDeleteCallback(const HeaderOptions& opts,
+                                 const int eCode, JniOnDeleteListener *listener,
+                                 std::weak_ptr<JniOcResourceImpl> weakRef);
+
+    static void onObserveCallback(const HeaderOptions& opts, const OCRepresentation& rep,
+                                  const int eCode, const int& sequenceNumber,
+                                  JniOnObserveListener *listener,
+                                  std::weak_ptr<JniOcResourceImpl> weakRef);
+
+
+    JniListenerManager<JniOnGetListener> m_onGetManager;
+    JniListenerManager<JniOnPutListener> m_onPutManager;
+    JniListenerManager<JniOnPostListener> m_onPostManager;
+    JniListenerManager<JniOnDeleteListener> m_onDeleteManager;
+    JniListenerManager<JniOnObserveListener> m_onObserveManager;
+#ifdef WITH_MQ
+    JniListenerManager<JniOnMQTopicFoundListener> m_onFoundTopicResourceManager;
+    JniListenerManager<JniOnMQSubscribeListener> m_onSubcribeTopicManager;
+#endif
+
+    std::shared_ptr<OCResource> m_sharedResource;
+};
+
+JniOcResourceImpl::JniOcResourceImpl(std::shared_ptr<OCResource> &resource)
+    : m_sharedResource(resource) {}
+
+JniOcResourceImpl::~JniOcResourceImpl()
+{
+    LOGD("~JniOcResourceImpl()");
+
+    m_sharedResource = nullptr;
+
+    jint envRet = JNI_ERR;
     JNIEnv *env = GetJNIEnv(envRet);
-    if (NULL == env) return;
+    if (nullptr == env)
+    {
+        return;
+    }
 
     m_onGetManager.removeAllListeners(env);
     m_onPutManager.removeAllListeners(env);
     m_onPostManager.removeAllListeners(env);
     m_onDeleteManager.removeAllListeners(env);
     m_onObserveManager.removeAllListeners(env);
+#ifdef WITH_MQ
+    m_onFoundTopicResourceManager.removeAllListeners(env);
+    m_onSubcribeTopicManager.removeAllListeners(env);
+#endif
 
-    if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread();
+    if (JNI_EDETACHED == envRet)
+    {
+        g_jvm->DetachCurrentThread();
+    }
 }
 
-OCStackResult JniOcResource::get(JNIEnv* env, const QueryParamsMap &queryParametersMap, jobject jListener)
+void JniOcResourceImpl::onGetCallback(const HeaderOptions& opts, const OCRepresentation& rep,
+                                      const int eCode, JniOnGetListener *listener,
+                                      std::weak_ptr<JniOcResourceImpl> weakRef)
+{
+    auto obj = weakRef.lock();
+       if (!obj)
+    {
+        LOGD("Get callback called on deleted object\n");
+        return;
+    }
+
+    listener->onGetCallback(opts, rep, eCode);
+}
+
+OCStackResult JniOcResourceImpl::get(JNIEnv* env, const QueryParamsMap &queryParametersMap, jobject jListener)
 {
     JniOnGetListener *onGetListener = addOnGetListener(env, jListener);
 
-    GetCallback getCallback = [onGetListener](
-        const HeaderOptions& opts,
-        const OCRepresentation& rep,
-        const int eCode)
-    {
-        onGetListener->onGetCallback(opts, rep, eCode);
-    };
+    GetCallback getCallback = std::bind(JniOcResourceImpl::onGetCallback, std::placeholders::_1,
+                                        std::placeholders::_2, std::placeholders::_3, onGetListener,
+                                        shared_from_this());
 
     return m_sharedResource->get(queryParametersMap, getCallback);
 }
 
-OCStackResult JniOcResource::get(JNIEnv* env, const QueryParamsMap &queryParametersMap, jobject jListener,
+OCStackResult JniOcResourceImpl::get(JNIEnv* env, const QueryParamsMap &queryParametersMap, jobject jListener,
     QualityOfService QoS)
 {
     JniOnGetListener *onGetListener = addOnGetListener(env, jListener);
 
-    GetCallback getCallback = [onGetListener](const HeaderOptions& opts, const OCRepresentation& rep,
-        const int eCode)
-    {
-        onGetListener->onGetCallback(opts, rep, eCode);
-    };
+    GetCallback getCallback = std::bind(JniOcResourceImpl::onGetCallback, std::placeholders::_1,
+                                        std::placeholders::_2, std::placeholders::_3, onGetListener,
+                                        shared_from_this());
 
     return m_sharedResource->get(queryParametersMap, getCallback, QoS);
 }
 
-OCStackResult JniOcResource::get(
+OCStackResult JniOcResourceImpl::get(
     JNIEnv* env,
     const std::string &resourceType,
     const std::string &resourceInterface,
@@ -86,534 +237,1401 @@ OCStackResult JniOcResource::get(
 {
     JniOnGetListener *onGetListener = addOnGetListener(env, jListener);
 
-    GetCallback getCallback = [onGetListener](const HeaderOptions& opts,
-        const OCRepresentation& rep, const int eCode)
-    {
-        onGetListener->onGetCallback(opts, rep, eCode);
-    };
+    GetCallback getCallback = std::bind(JniOcResourceImpl::onGetCallback, std::placeholders::_1,
+                                        std::placeholders::_2, std::placeholders::_3, onGetListener,
+                                        shared_from_this());
 
     return m_sharedResource->get(resourceType, resourceInterface, queryParametersMap,
         getCallback);
 }
 
-OCStackResult JniOcResource::get(JNIEnv* env, const std::string &resourceType,
+OCStackResult JniOcResourceImpl::get(JNIEnv* env, const std::string &resourceType,
     const std::string &resourceInterface, const QueryParamsMap &queryParametersMap,
     jobject jListener, QualityOfService QoS)
 {
     JniOnGetListener *onGetListener = addOnGetListener(env, jListener);
 
-    GetCallback getCallback = [onGetListener](const HeaderOptions& opts,
-        const OCRepresentation& rep, const int eCode)
-    {
-        onGetListener->onGetCallback(opts, rep, eCode);
-    };
+    GetCallback getCallback = std::bind(JniOcResourceImpl::onGetCallback, std::placeholders::_1,
+                                        std::placeholders::_2, std::placeholders::_3, onGetListener,
+                                        shared_from_this());
 
     return m_sharedResource->get(resourceType, resourceInterface, queryParametersMap,
         getCallback, QoS);
 }
 
-OCStackResult JniOcResource::put(JNIEnv* env, const OCRepresentation &representation,
+void JniOcResourceImpl::onPutCallback(const HeaderOptions& opts, const OCRepresentation& rep,
+                                      const int eCode, JniOnPutListener *listener,
+                                      std::weak_ptr<JniOcResourceImpl> weakRef)
+{
+    auto obj = weakRef.lock();
+       if (!obj)
+    {
+        LOGD("Put callback called on deleted object\n");
+        return;
+    }
+
+    listener->onPutCallback(opts, rep, eCode);
+}
+
+OCStackResult JniOcResourceImpl::put(JNIEnv* env, const OCRepresentation &representation,
     const QueryParamsMap &queryParametersMap, jobject jListener)
 {
     JniOnPutListener *onPutListener = addOnPutListener(env, jListener);
 
-    PutCallback putCallback = [onPutListener](const HeaderOptions& opts,
-        const OCRepresentation& rep, const int eCode)
-    {
-        onPutListener->onPutCallback(opts, rep, eCode);
-    };
+    PutCallback putCallback = std::bind(JniOcResourceImpl::onPutCallback, std::placeholders::_1,
+                                        std::placeholders::_2, std::placeholders::_3, onPutListener,
+                                        shared_from_this());
 
     return m_sharedResource->put(representation, queryParametersMap, putCallback);
 }
 
-OCStackResult JniOcResource::put(JNIEnv* env, const OCRepresentation &representation,
+OCStackResult JniOcResourceImpl::put(JNIEnv* env, const OCRepresentation &representation,
     const QueryParamsMap &queryParametersMap, jobject jListener, QualityOfService QoS)
 {
     JniOnPutListener *onPutListener = addOnPutListener(env, jListener);
 
-    PutCallback putCallback = [onPutListener](const HeaderOptions& opts,
-        const OCRepresentation& rep, const int eCode)
-    {
-        onPutListener->onPutCallback(opts, rep, eCode);
-    };
+    PutCallback putCallback = std::bind(JniOcResourceImpl::onPutCallback, std::placeholders::_1,
+                                        std::placeholders::_2, std::placeholders::_3, onPutListener,
+                                        shared_from_this());
 
     return m_sharedResource->put(representation, queryParametersMap, putCallback, QoS);
 }
 
-OCStackResult JniOcResource::put(JNIEnv* env, const std::string &resourceType,
+OCStackResult JniOcResourceImpl::put(JNIEnv* env, const std::string &resourceType,
     const std::string &resourceInterface, const OCRepresentation &representation,
     const QueryParamsMap &queryParametersMap, jobject jListener)
 {
     JniOnPutListener *onPutListener = addOnPutListener(env, jListener);
 
-    PutCallback putCallback = [onPutListener](const HeaderOptions& opts,
-        const OCRepresentation& rep, const int eCode)
-    {
-        onPutListener->onPutCallback(opts, rep, eCode);
-    };
+    PutCallback putCallback = std::bind(JniOcResourceImpl::onPutCallback, std::placeholders::_1,
+                                        std::placeholders::_2, std::placeholders::_3, onPutListener,
+                                        shared_from_this());
 
     return m_sharedResource->put(resourceType, resourceInterface, representation,
         queryParametersMap, putCallback);
 }
 
-OCStackResult JniOcResource::put(JNIEnv* env, const std::string &resourceType,
+OCStackResult JniOcResourceImpl::put(JNIEnv* env, const std::string &resourceType,
     const std::string &resourceInterface, const OCRepresentation &representation,
     const QueryParamsMap &queryParametersMap, jobject jListener, QualityOfService QoS)
 {
     JniOnPutListener *onPutListener = addOnPutListener(env, jListener);
 
-    PutCallback putCallback = [onPutListener](const HeaderOptions& opts,
-        const OCRepresentation& rep, const int eCode)
-    {
-        onPutListener->onPutCallback(opts, rep, eCode);
-    };
+    PutCallback putCallback = std::bind(JniOcResourceImpl::onPutCallback, std::placeholders::_1,
+                                        std::placeholders::_2, std::placeholders::_3, onPutListener,
+                                        shared_from_this());
 
     return m_sharedResource->put(resourceType, resourceInterface, representation,
         queryParametersMap, putCallback, QoS);
 }
 
-OCStackResult JniOcResource::post(JNIEnv* env, const OCRepresentation &representation,
+void JniOcResourceImpl::onPostCallback(const HeaderOptions& opts, const OCRepresentation& rep,
+                                      const int eCode, JniOnPostListener *listener,
+                                      std::weak_ptr<JniOcResourceImpl> weakRef)
+{
+    auto obj = weakRef.lock();
+       if (!obj)
+    {
+        LOGD("Post callback called on deleted object\n");
+        return;
+    }
+
+    listener->onPostCallback(opts, rep, eCode);
+}
+
+OCStackResult JniOcResourceImpl::post(JNIEnv* env, const OCRepresentation &representation,
     const QueryParamsMap &queryParametersMap, jobject jListener)
 {
     JniOnPostListener *onPostListener = addOnPostListener(env, jListener);
 
-    PostCallback postCallback = [onPostListener](const HeaderOptions& opts,
-        const OCRepresentation& rep, const int eCode)
-    {
-        onPostListener->onPostCallback(opts, rep, eCode);
-    };
+    PostCallback postCallback = std::bind(JniOcResourceImpl::onPostCallback, std::placeholders::_1,
+                                        std::placeholders::_2, std::placeholders::_3, onPostListener,
+                                        shared_from_this());
 
     return m_sharedResource->post(representation, queryParametersMap, postCallback);
 }
 
-OCStackResult JniOcResource::post(JNIEnv* env, const OCRepresentation &representation,
+OCStackResult JniOcResourceImpl::post(JNIEnv* env, const OCRepresentation &representation,
     const QueryParamsMap &queryParametersMap, jobject jListener, QualityOfService QoS)
 {
     JniOnPostListener *onPostListener = addOnPostListener(env, jListener);
 
-    PostCallback postCallback = [onPostListener](const HeaderOptions& opts,
-        const OCRepresentation& rep, const int eCode)
-    {
-        onPostListener->onPostCallback(opts, rep, eCode);
-    };
+    PostCallback postCallback = std::bind(JniOcResourceImpl::onPostCallback, std::placeholders::_1,
+                                        std::placeholders::_2, std::placeholders::_3, onPostListener,
+                                        shared_from_this());
 
     return m_sharedResource->post(representation, queryParametersMap, postCallback, QoS);
 }
 
-OCStackResult JniOcResource::post(JNIEnv* env, const std::string &resourceType,
+OCStackResult JniOcResourceImpl::post(JNIEnv* env, const std::string &resourceType,
     const std::string &resourceInterface, const OCRepresentation &representation,
     const QueryParamsMap &queryParametersMap, jobject jListener)
 {
     JniOnPostListener *onPostListener = addOnPostListener(env, jListener);
 
-    PostCallback postCallback = [onPostListener](const HeaderOptions& opts,
-        const OCRepresentation& rep, const int eCode)
-    {
-        onPostListener->onPostCallback(opts, rep, eCode);
-    };
+    PostCallback postCallback = std::bind(JniOcResourceImpl::onPostCallback, std::placeholders::_1,
+                                        std::placeholders::_2, std::placeholders::_3, onPostListener,
+                                        shared_from_this());
 
     return m_sharedResource->post(resourceType, resourceInterface, representation,
         queryParametersMap, postCallback);
 }
 
-OCStackResult JniOcResource::post(JNIEnv* env, const std::string &resourceType,
+OCStackResult JniOcResourceImpl::post(JNIEnv* env, const std::string &resourceType,
     const std::string &resourceInterface, const OCRepresentation &representation,
     const QueryParamsMap &queryParametersMap, jobject jListener, QualityOfService QoS)
 {
     JniOnPostListener *onPostListener = addOnPostListener(env, jListener);
 
-    PostCallback postCallback = [onPostListener](const HeaderOptions& opts,
-        const OCRepresentation& rep, const int eCode)
-    {
-        onPostListener->onPostCallback(opts, rep, eCode);
-    };
+    PostCallback postCallback = std::bind(JniOcResourceImpl::onPostCallback, std::placeholders::_1,
+                                        std::placeholders::_2, std::placeholders::_3, onPostListener,
+                                        shared_from_this());
 
     return m_sharedResource->post(resourceType, resourceInterface, representation,
         queryParametersMap, postCallback, QoS);
 }
 
-OCStackResult JniOcResource::deleteResource(JNIEnv* env, jobject jListener)
+void JniOcResourceImpl::onDeleteCallback(const HeaderOptions& opts,
+                                      const int eCode, JniOnDeleteListener *listener,
+                                      std::weak_ptr<JniOcResourceImpl> weakRef)
+{
+    auto obj = weakRef.lock();
+       if (!obj)
+    {
+        LOGD("Delete callback called on deleted object\n");
+        return;
+    }
+
+    listener->onDeleteCallback(opts, eCode);
+}
+
+OCStackResult JniOcResourceImpl::deleteResource(JNIEnv* env, jobject jListener)
 {
     JniOnDeleteListener *onDeleteListener = addOnDeleteListener(env, jListener);
 
-    DeleteCallback deleteCallback = [onDeleteListener](const HeaderOptions& opts,
-        const int eCode)
-    {
-        onDeleteListener->onDeleteCallback(opts, eCode);
-    };
+    DeleteCallback deleteCallback = std::bind(JniOcResourceImpl::onDeleteCallback, std::placeholders::_1,
+                                        std::placeholders::_2, onDeleteListener,
+                                        shared_from_this());
 
     return m_sharedResource->deleteResource(deleteCallback);
 }
 
-OCStackResult JniOcResource::deleteResource(JNIEnv* env, jobject jListener, QualityOfService QoS)
+OCStackResult JniOcResourceImpl::deleteResource(JNIEnv* env, jobject jListener, QualityOfService QoS)
 {
     JniOnDeleteListener *onDeleteListener = addOnDeleteListener(env, jListener);
 
-    DeleteCallback deleteCallback = [onDeleteListener](const HeaderOptions& opts, const int eCode)
-    {
-        onDeleteListener->onDeleteCallback(opts, eCode);
-    };
+    DeleteCallback deleteCallback = std::bind(JniOcResourceImpl::onDeleteCallback, std::placeholders::_1,
+                                        std::placeholders::_2, onDeleteListener,
+                                        shared_from_this());
 
     return m_sharedResource->deleteResource(deleteCallback, QoS);
 }
 
-OCStackResult JniOcResource::observe(JNIEnv* env, ObserveType observeType,
+void JniOcResourceImpl::onObserveCallback(const HeaderOptions& opts, const OCRepresentation& rep,
+                                      const int eCode, const int& sequenceNumber,
+                                      JniOnObserveListener *listener,
+                                      std::weak_ptr<JniOcResourceImpl> weakRef)
+{
+    auto obj = weakRef.lock();
+       if (!obj)
+    {
+        LOGD("Observe callback called on deleted object\n");
+        return;
+    }
+
+    listener->onObserveCallback(opts, rep, eCode, sequenceNumber);
+}
+
+OCStackResult JniOcResourceImpl::observe(JNIEnv* env, ObserveType observeType,
     const QueryParamsMap &queryParametersMap, jobject jListener)
 {
     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);
-    };
+    ObserveCallback observeCallback = std::bind(JniOcResourceImpl::onObserveCallback, std::placeholders::_1,
+                                        std::placeholders::_2, std::placeholders::_3,
+                                        std::placeholders::_4, onObserveListener,
+                                        shared_from_this());
 
     return m_sharedResource->observe(observeType, queryParametersMap, observeCallback);
 }
 
-OCStackResult JniOcResource::observe(JNIEnv* env, ObserveType observeType,
+OCStackResult JniOcResourceImpl::observe(JNIEnv* env, ObserveType observeType,
     const QueryParamsMap &queryParametersMap, jobject jListener, QualityOfService QoS)
 {
     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);
-    };
+    ObserveCallback observeCallback = std::bind(JniOcResourceImpl::onObserveCallback, std::placeholders::_1,
+                                        std::placeholders::_2, std::placeholders::_3,
+                                        std::placeholders::_4, onObserveListener,
+                                        shared_from_this());
 
     return m_sharedResource->observe(observeType, queryParametersMap, observeCallback, QoS);
 }
 
-OCStackResult JniOcResource::cancelObserve(JNIEnv* env)
-{
-    this->m_onObserveManager.removeAllListeners(env);
-    return m_sharedResource->cancelObserve();
-}
-
-OCStackResult JniOcResource::cancelObserve(JNIEnv* env, QualityOfService qos)
+OCStackResult JniOcResourceImpl::cancelObserve(JNIEnv* env, QualityOfService qos)
 {
-    //TODO confirm behavior
-    //add removal of java listeners by qos
-    this->m_onObserveManager.removeAllListeners(env);
+    // In Low case, after delete the callback and send empty message when client receive the notify.
+    // But TCP does not support EMPTY message.
+    if ((CT_ADAPTER_IP & connectivityType()) && QualityOfService::HighQos != qos)
+    {
+        this->m_onObserveManager.removeAllListeners(env);
+    }
     return m_sharedResource->cancelObserve(qos);
 }
 
-void JniOcResource::setHeaderOptions(const HeaderOptions &headerOptions)
+void JniOcResourceImpl::setHeaderOptions(const HeaderOptions &headerOptions)
 {
     m_sharedResource->setHeaderOptions(headerOptions);
 }
 
-void JniOcResource::unsetHeaderOptions()
+void JniOcResourceImpl::unsetHeaderOptions()
 {
     m_sharedResource->unsetHeaderOptions();
 }
 
-std::string JniOcResource::host()
+std::string JniOcResourceImpl::host()
 {
     return m_sharedResource->host();
 }
 
-std::string JniOcResource::uri()
+std::string JniOcResourceImpl::uri()
 {
     return m_sharedResource->uri();
 }
 
-OCConnectivityType JniOcResource::connectivityType() const
+OCConnectivityType JniOcResourceImpl::connectivityType() const
 {
     return m_sharedResource->connectivityType();
 }
 
-bool JniOcResource::isObservable()
+bool JniOcResourceImpl::isObservable()
 {
     return m_sharedResource->isObservable();
 }
 
-std::vector< std::string > JniOcResource::getResourceTypes() const
+std::vector< std::string > JniOcResourceImpl::getResourceTypes() const
 {
     return m_sharedResource->getResourceTypes();
 }
 
-std::vector< std::string > JniOcResource::getResourceInterfaces(void) const
+std::vector< std::string > JniOcResourceImpl::getResourceInterfaces(void) const
 {
     return m_sharedResource->getResourceInterfaces();
 }
 
-OCResourceIdentifier JniOcResource::uniqueIdentifier() const
+OCResourceIdentifier JniOcResourceImpl::uniqueIdentifier() const
 {
     return m_sharedResource->uniqueIdentifier();
 }
 
-std::string JniOcResource::sid() const
+std::string JniOcResourceImpl::sid() const
 {
     return m_sharedResource->sid();
 }
 
-JniOnGetListener* JniOcResource::addOnGetListener(JNIEnv* env, jobject jListener)
+std::string JniOcResourceImpl::deviceName() const
 {
-    return this->m_onGetManager.addListener(env, jListener, this);
+    return m_sharedResource->deviceName();
 }
 
-JniOnPutListener* JniOcResource::addOnPutListener(JNIEnv* env, jobject jListener)
+JniOnGetListener* JniOcResourceImpl::addOnGetListener(JNIEnv* env, jobject jListener)
 {
-    return this->m_onPutManager.addListener(env, jListener, this);
+    return this->m_onGetManager.addListener(env, jListener,
+                                            std::bind(&JniOcResourceImpl::removeOnGetListener, this,
+                                            std::placeholders::_1, std::placeholders::_2));
 }
 
-JniOnPostListener* JniOcResource::addOnPostListener(JNIEnv* env, jobject jListener)
+JniOnPutListener* JniOcResourceImpl::addOnPutListener(JNIEnv* env, jobject jListener)
 {
-    return this->m_onPostManager.addListener(env, jListener, this);
+    return this->m_onPutManager.addListener(env, jListener,
+                                            std::bind(&JniOcResourceImpl::removeOnPutListener, this,
+                                            std::placeholders::_1, std::placeholders::_2));
 }
 
-JniOnDeleteListener* JniOcResource::addOnDeleteListener(JNIEnv* env, jobject jListener)
+JniOnPostListener* JniOcResourceImpl::addOnPostListener(JNIEnv* env, jobject jListener)
 {
-    return this->m_onDeleteManager.addListener(env, jListener, this);
+    return this->m_onPostManager.addListener(env, jListener,
+                                             std::bind(&JniOcResourceImpl::removeOnPostListener, this,
+                                             std::placeholders::_1, std::placeholders::_2));
 }
 
-JniOnObserveListener* JniOcResource::addOnObserveListener(JNIEnv* env, jobject jListener)
+JniOnDeleteListener* JniOcResourceImpl::addOnDeleteListener(JNIEnv* env, jobject jListener)
 {
-    return this->m_onObserveManager.addListener(env, jListener, this);
+    return this->m_onDeleteManager.addListener(env, jListener,
+                                               std::bind(&JniOcResourceImpl::removeOnDeleteListener, this,
+                                               std::placeholders::_1, std::placeholders::_2));
 }
 
-void JniOcResource::removeOnGetListener(JNIEnv* env, jobject jListener)
+JniOnObserveListener* JniOcResourceImpl::addOnObserveListener(JNIEnv* env, jobject jListener)
+{
+    return this->m_onObserveManager.addListener(env, jListener,
+                                                std::bind(&JniOcResourceImpl::removeOnObserveListener, this,
+                                                std::placeholders::_1, std::placeholders::_2));
+}
+
+void JniOcResourceImpl::removeOnGetListener(JNIEnv* env, jobject jListener)
 {
     this->m_onGetManager.removeListener(env, jListener);
 }
 
-void JniOcResource::removeOnPutListener(JNIEnv* env, jobject jListener)
+void JniOcResourceImpl::removeOnPutListener(JNIEnv* env, jobject jListener)
 {
     this->m_onPutManager.removeListener(env, jListener);
 }
 
-void JniOcResource::removeOnPostListener(JNIEnv* env, jobject jListener)
+void JniOcResourceImpl::removeOnPostListener(JNIEnv* env, jobject jListener)
 {
     this->m_onPostManager.removeListener(env, jListener);
 }
 
-void JniOcResource::removeOnDeleteListener(JNIEnv* env, jobject jListener)
+void JniOcResourceImpl::removeOnDeleteListener(JNIEnv* env, jobject jListener)
 {
     this->m_onDeleteManager.removeListener(env, jListener);
 }
 
-void JniOcResource::removeOnObserveListener(JNIEnv* env, jobject jListener)
+void JniOcResourceImpl::removeOnObserveListener(JNIEnv* env, jobject jListener)
 {
     this->m_onObserveManager.removeListener(env, jListener);
 }
 
-std::shared_ptr<OCResource> JniOcResource::getOCResource()
+#ifdef WITH_MQ
+JniOnMQTopicFoundListener* JniOcResourceImpl::addOnTopicFoundListener(JNIEnv* env, jobject jListener)
 {
-    return this->m_sharedResource;
+    return this->m_onFoundTopicResourceManager.addListener(env, jListener,
+                                                           std::bind(&JniOcResource::removeOnTopicFoundListener, this,
+                                                           std::placeholders::_1, std::placeholders::_2));
 }
 
-JniOcResource* JniOcResource::getJniOcResourcePtr(JNIEnv *env, jobject thiz)
+void JniOcResourceImpl::removeOnTopicFoundListener(JNIEnv* env, jobject jListener)
 {
-    JniOcResource *resource = GetHandle<JniOcResource>(env, thiz);
-    if (env->ExceptionCheck())
-    {
-        LOGE("Failed to get native handle from OcResource");
-    }
-    if (!resource)
-    {
-        ThrowOcException(JNI_NO_NATIVE_POINTER, "");
-    }
-    return resource;
+    this->m_onFoundTopicResourceManager.removeListener(env, jListener);
 }
 
-/*
-* Class:     org_iotivity_base_OcResource
-* Method:    get
-* Signature: (Ljava/util/Map;Lorg/iotivity/base/OcResource/OnGetListener;)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_get
-(JNIEnv *env, jobject thiz, jobject jQueryParamsMap, jobject jListener)
+JniOnMQSubscribeListener* JniOcResourceImpl::addOnMQTopicSubscribeListener(JNIEnv* env, jobject jListener)
 {
-    LOGD("OcResource_get");
-    if (!jQueryParamsMap)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
-        return;
-    }
-    if (!jListener)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "onGetListener cannot be null");
-        return;
-    }
-    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return;
+    return this->m_onSubcribeTopicManager.addListener(env, jListener,
+                                                      std::bind(&JniOcResource::removeOnMQTopicSubscribeListener, this
+                                                      std::placeholders::_1, std::placeholders::_2));
+}
 
-    QueryParamsMap qpm;
-    JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
+void JniOcResourceImpl::removeOnMQTopicSubscribeListener(JNIEnv* env, jobject jListener)
+{
+    this->m_onSubcribeTopicManager.removeListener(env, jListener);
+}
+#endif
 
-    try
-    {
-        OCStackResult result = resource->get(
-            env,
-            qpm,
-            jListener);
+std::shared_ptr<OCResource> JniOcResourceImpl::getOCResource()
+{
+    return this->m_sharedResource;
+}
 
-        if (OC_STACK_OK != result)
+#ifdef WITH_MQ
+OCStackResult JniOcResourceImpl::discoveryMQTopics(JNIEnv* env,
+    const QueryParamsMap &queryParametersMap, jobject jListener, QualityOfService QoS)
+{
+    JniOnMQTopicFoundListener *onTopicFoundListener = addOnTopicFoundListener(env, jListener);
+
+    MQTopicCallback findCallback = std::bind([](const int& eCode,
+                                                const std::string& uri, std::shared_ptr<OCResource> resource,
+                                                JniOnMQTopicFoundListener *listener,
+                                                std::weak_ptr<JniOcResourceImpl> weakRef)
+    {
+        auto obj = weakRef.lock();
+           if (!obj)
         {
-            ThrowOcException(result, "OcResource_get");
+            LOGD("Topic callback called on deleted object\n");
+            return;
         }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(e.code(), e.reason().c_str());
-    }
+        listener->foundTopicCallback(eCode, uri, resource);
+    }, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3,
+       onTopicFoundListener, shared_from_this());
+
+    return m_sharedResource->discoveryMQTopics(queryParametersMap, findCallback, QoS);
 }
 
-/*
-* Class:     org_iotivity_base_OcResource
-* Method:    get1
-* Signature: (Ljava/util/Map;Lorg/iotivity/base/OcResource/OnGetListener;I)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_get1
-(JNIEnv *env, jobject thiz, jobject jQueryParamsMap, jobject jListener, jint jQoS)
+OCStackResult JniOcResourceImpl::createMQTopic(JNIEnv* env,
+    const OCRepresentation &representation, const std::string &targetUri,
+    const QueryParamsMap &queryParametersMap, jobject jListener, QualityOfService QoS)
 {
-    LOGD("OcResource_get");
-    if (!jQueryParamsMap)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
-        return;
-    }
-    if (!jListener)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "onGetListener cannot be null");
-        return;
-    }
-    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return;
-
-    QueryParamsMap qpm;
-    JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
+    JniOnMQTopicFoundListener *onTopicCreatedListener = addOnTopicFoundListener(env, jListener);
 
-    try
+    MQTopicCallback createCallback = std::bind([](const int& eCode,
+                                                  const std::string& uri,
+                                                  std::shared_ptr<OCResource> resource,
+                                                  JniOnMQTopicFoundListener *listener,
+                                                  std::weak_ptr<JniOcResourceImpl> weakRef)
     {
-        OCStackResult result = resource->get(
-            env,
-            qpm,
-            jListener,
-            JniUtils::getQOS(env, static_cast<int>(jQoS)));
-
-        if (OC_STACK_OK != result)
+        auto obj = weakRef.lock();
+           if (!obj)
         {
-            ThrowOcException(result, "OcResource_get");
+            LOGD("Topic callback called on deleted object\n");
+            return;
         }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(e.code(), e.reason().c_str());
-    }
-}
+        listener->createdTopicCallback(eCode, uri, resource);
+    }, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3,
+       onTopicCreatedListener, shared_from_this());
 
-/*
-* Class:     org_iotivity_base_OcResource
-* Method:    get2
-* Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;
-Lorg/iotivity/base/OcResource/OnGetListener;)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_get2
-(JNIEnv *env, jobject thiz, jstring jResourceType, jstring jResourceInterface,
-jobject jQueryParamsMap, jobject jListener)
+    return m_sharedResource->createMQTopic(representation, targetUri,
+                                           queryParametersMap,
+                                           createCallback, QoS);
+}
+#endif
+#ifdef MQ_SUBSCRIBER
+OCStackResult JniOcResourceImpl::subscribeMQTopic(JNIEnv* env,
+    const QueryParamsMap &queryParametersMap, jobject jListener, QualityOfService QoS)
 {
-    LOGD("OcResource_get");
-    std::string resourceType;
-    if (jResourceType)
-    {
-        resourceType = env->GetStringUTFChars(jResourceType, NULL);
-    }
-    std::string resourceInterface;
-    if (jResourceInterface)
-    {
-        resourceInterface = env->GetStringUTFChars(jResourceInterface, NULL);
-    }
-    if (!jQueryParamsMap)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
-        return;
-    }
-    if (!jListener)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "onGetListener cannot be null");
-        return;
-    }
-    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return;
+    JniOnMQSubscribeListener *onSubscribeListener = addOnMQTopicSubscribeListener(env, jListener);
 
-    QueryParamsMap qpm;
-    JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
-    try
+    ObserveCallback subscribeCallback = std::bind([](const HeaderOptions& opts,
+                                                     const OCRepresentation& rep, const int& eCode,
+                                                     const int& sequenceNumber,
+                                                     JniOnMQSubscribeListener *listener,
+                                                     std::weak_ptr<JniOcResourceImpl> weakRef)
     {
-        OCStackResult result = resource->get(
-            env,
-            resourceType,
-            resourceInterface,
-            qpm,
-            jListener);
-
-        if (OC_STACK_OK != result)
+        auto obj = weakRef.lock();
+           if (!obj)
         {
-            ThrowOcException(result, "OcResource_get");
+            LOGD("Subscribe MQ callback called on deleted object\n");
+            return;
         }
-    }
-    catch (OCException& e)
-    {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(e.code(), e.reason().c_str());
-    }
+        listener->onSubscribeCallback(opts, rep, eCode, sequenceNumber);
+    }, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4,
+       onSubscribeListener, shared_from_this());
+
+    return m_sharedResource->subscribeMQTopic(ObserveType::Observe, queryParametersMap,
+                                              subscribeCallback, QoS);
 }
 
-/*
-* Class:     org_iotivity_base_OcResource
-* Method:    get3
-* Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;
-Lorg/iotivity/base/OcResource/OnGetListener;I)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_get3
-(JNIEnv *env, jobject thiz, jstring jResourceType, jstring jResourceInterface,
-jobject jQueryParamsMap, jobject jListener, jint jQoS)
+OCStackResult JniOcResourceImpl::unsubscribeMQTopic(QualityOfService QoS)
 {
-    LOGD("OcResource_get");
-    if (!jQueryParamsMap)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
+    return m_sharedResource->unsubscribeMQTopic(QoS);
+}
+
+OCStackResult JniOcResourceImpl::requestMQPublish(JNIEnv* env,
+    const QueryParamsMap &queryParametersMap, jobject jListener, QualityOfService QoS)
+{
+    JniOnPostListener *onPostListener = addOnPostListener(env, jListener);
+
+    PostCallback postCallback = std::bind(JniOcResourceImpl::onPostCallback, std::placeholders::_1,
+                                        std::placeholders::_2, std::placeholders::_3, onPostListener,
+                                        shared_from_this());
+
+    return m_sharedResource->requestMQPublish(queryParametersMap, postCallback, QoS);
+}
+#endif
+#ifdef MQ_PUBLISHER
+OCStackResult JniOcResourceImpl::publishMQTopic(JNIEnv* env, const OCRepresentation &representation,
+    const QueryParamsMap &queryParametersMap, jobject jListener, QualityOfService QoS)
+{
+    JniOnPostListener *onPostListener = addOnPostListener(env, jListener);
+
+    PostCallback postCallback = std::bind(JniOcResourceImpl::onPostCallback, std::placeholders::_1,
+                                        std::placeholders::_2, std::placeholders::_3, onPostListener,
+                                        shared_from_this());
+
+    return m_sharedResource->publishMQTopic(representation, queryParametersMap,
+                                            postCallback, QoS);
+}
+#endif
+
+
+JniOcResource::JniOcResource(std::shared_ptr<OCResource> &resource)
+{
+    m_impl = std::make_shared<JniOcResourceImpl>(resource);
+}
+
+OCStackResult JniOcResource::get(JNIEnv* env, const QueryParamsMap &queryParametersMap, jobject jListener)
+{
+    return m_impl->get(env, queryParametersMap, jListener);
+}
+
+OCStackResult JniOcResource::get(JNIEnv* env, const QueryParamsMap &queryParametersMap, jobject jListener,
+    QualityOfService QoS)
+{
+    return m_impl->get(env, queryParametersMap, jListener, QoS);
+}
+
+OCStackResult JniOcResource::get(
+    JNIEnv* env,
+    const std::string &resourceType,
+    const std::string &resourceInterface,
+    const QueryParamsMap &queryParametersMap,
+    jobject jListener)
+{
+    return m_impl->get(env, resourceType, resourceInterface, queryParametersMap, jListener);
+}
+
+OCStackResult JniOcResource::get(JNIEnv* env, const std::string &resourceType,
+    const std::string &resourceInterface, const QueryParamsMap &queryParametersMap,
+    jobject jListener, QualityOfService QoS)
+{
+    return m_impl->get(env, resourceType, resourceInterface, queryParametersMap, jListener, QoS);
+}
+
+OCStackResult JniOcResource::put(JNIEnv* env, const OCRepresentation &representation,
+    const QueryParamsMap &queryParametersMap, jobject jListener)
+{
+    return m_impl->put(env, representation, queryParametersMap, jListener);
+}
+
+OCStackResult JniOcResource::put(JNIEnv* env, const OCRepresentation &representation,
+    const QueryParamsMap &queryParametersMap, jobject jListener, QualityOfService QoS)
+{
+    return m_impl->put(env, representation, queryParametersMap, jListener, QoS);
+}
+
+OCStackResult JniOcResource::put(JNIEnv* env, const std::string &resourceType,
+    const std::string &resourceInterface, const OCRepresentation &representation,
+    const QueryParamsMap &queryParametersMap, jobject jListener)
+{
+    return m_impl->put(env, resourceType, resourceInterface, representation, queryParametersMap, jListener);
+}
+
+OCStackResult JniOcResource::put(JNIEnv* env, const std::string &resourceType,
+    const std::string &resourceInterface, const OCRepresentation &representation,
+    const QueryParamsMap &queryParametersMap, jobject jListener, QualityOfService QoS)
+{
+    return m_impl->put(env, resourceType, resourceInterface, representation, queryParametersMap, jListener, QoS);
+}
+
+OCStackResult JniOcResource::post(JNIEnv* env, const OCRepresentation &representation,
+    const QueryParamsMap &queryParametersMap, jobject jListener)
+{
+    return m_impl->post(env, representation, queryParametersMap, jListener);
+}
+
+OCStackResult JniOcResource::post(JNIEnv* env, const OCRepresentation &representation,
+    const QueryParamsMap &queryParametersMap, jobject jListener, QualityOfService QoS)
+{
+    return m_impl->post(env, representation, queryParametersMap, jListener, QoS);
+}
+
+OCStackResult JniOcResource::post(JNIEnv* env, const std::string &resourceType,
+    const std::string &resourceInterface, const OCRepresentation &representation,
+    const QueryParamsMap &queryParametersMap, jobject jListener)
+{
+    return m_impl->post(env, resourceType, resourceInterface, representation, queryParametersMap, jListener);
+}
+
+OCStackResult JniOcResource::post(JNIEnv* env, const std::string &resourceType,
+    const std::string &resourceInterface, const OCRepresentation &representation,
+    const QueryParamsMap &queryParametersMap, jobject jListener, QualityOfService QoS)
+{
+    return m_impl->post(env, resourceType, resourceInterface, representation, queryParametersMap, jListener, QoS);
+}
+
+OCStackResult JniOcResource::deleteResource(JNIEnv* env, jobject jListener)
+{
+    return m_impl->deleteResource(env, jListener);
+}
+
+OCStackResult JniOcResource::deleteResource(JNIEnv* env, jobject jListener, QualityOfService QoS)
+{
+    return m_impl->deleteResource(env, jListener, QoS);
+}
+
+OCStackResult JniOcResource::observe(JNIEnv* env, ObserveType observeType,
+    const QueryParamsMap &queryParametersMap, jobject jListener)
+{
+    return m_impl->observe(env, observeType, queryParametersMap, jListener);
+}
+
+OCStackResult JniOcResource::observe(JNIEnv* env, ObserveType observeType,
+    const QueryParamsMap &queryParametersMap, jobject jListener, QualityOfService QoS)
+{
+    return m_impl->observe(env, observeType, queryParametersMap, jListener, QoS);
+}
+
+OCStackResult JniOcResource::cancelObserve(JNIEnv* env, QualityOfService qos)
+{
+    return m_impl->cancelObserve(env, qos);
+}
+
+void JniOcResource::setHeaderOptions(const HeaderOptions &headerOptions)
+{
+    m_impl->setHeaderOptions(headerOptions);
+}
+
+void JniOcResource::unsetHeaderOptions()
+{
+    m_impl->unsetHeaderOptions();
+}
+
+std::string JniOcResource::host()
+{
+    return m_impl->host();
+}
+
+std::string JniOcResource::uri()
+{
+    return m_impl->uri();
+}
+
+OCConnectivityType JniOcResource::connectivityType() const
+{
+    return m_impl->connectivityType();
+}
+
+bool JniOcResource::isObservable()
+{
+    return m_impl->isObservable();
+}
+
+std::vector< std::string > JniOcResource::getResourceTypes() const
+{
+    return m_impl->getResourceTypes();
+}
+
+std::vector< std::string > JniOcResource::getResourceInterfaces(void) const
+{
+    return m_impl->getResourceInterfaces();
+}
+
+OCResourceIdentifier JniOcResource::uniqueIdentifier() const
+{
+    return m_impl->uniqueIdentifier();
+}
+
+std::string JniOcResource::sid() const
+{
+    return m_impl->sid();
+}
+
+std::string JniOcResource::deviceName() const
+{
+    return m_impl->deviceName();
+}
+
+std::shared_ptr<OCResource> JniOcResource::getOCResource()
+{
+    return m_impl->getOCResource();
+}
+
+JniOcResource* JniOcResource::getJniOcResourcePtr(JNIEnv *env, jobject thiz)
+{
+    JniOcResource *resource = GetHandle<JniOcResource>(env, thiz);
+    if (env->ExceptionCheck())
+    {
+        LOGE("Failed to get native handle from OcResource");
+    }
+    if (!resource)
+    {
+        ThrowOcException(JNI_NO_NATIVE_POINTER, "");
+    }
+    return resource;
+}
+
+#ifdef WITH_MQ
+OCStackResult JniOcResource::discoveryMQTopics(JNIEnv* env,
+    const QueryParamsMap &queryParametersMap, jobject jListener, QualityOfService QoS)
+{
+    return m_impl->discoveryMQTopics(env, queryParametersMap, jListener, QoS);
+}
+
+OCStackResult JniOcResource::createMQTopic(JNIEnv* env,
+    const OCRepresentation &representation, const std::string &targetUri,
+    const QueryParamsMap &queryParametersMap, jobject jListener, QualityOfService QoS)
+{
+    return m_impl->createMQTopic(env, representation, targetUri, queryParametersMap, jListener, QoS);
+}
+#endif
+#ifdef MQ_SUBSCRIBER
+OCStackResult JniOcResource::subscribeMQTopic(JNIEnv* env,
+    const QueryParamsMap &queryParametersMap, jobject jListener, QualityOfService QoS)
+{
+    return m_impl->subscribeMQTopic(env, queryParametersMap, jListener, QoS);
+}
+
+OCStackResult JniOcResource::unsubscribeMQTopic(QualityOfService QoS)
+{
+    return m_impl->unsubscribeMQTopic(QoS);
+}
+
+OCStackResult JniOcResource::requestMQPublish(JNIEnv* env,
+    const QueryParamsMap &queryParametersMap, jobject jListener, QualityOfService QoS)
+{
+    return  m_impl->requestMQPublish(env, queryParametersMap, jListener, QoS);
+}
+#endif
+#ifdef MQ_PUBLISHER
+OCStackResult JniOcResource::publishMQTopic(JNIEnv* env, const OCRepresentation &representation,
+    const QueryParamsMap &queryParametersMap, jobject jListener, QualityOfService QoS)
+{
+    return m_impl->publishMQTopic(env, representation, queryParametersMap, jListener, QoS);
+}
+#endif
+
+/*
+* Class:     org_iotivity_base_OcResource
+* Method:    get
+* Signature: (Ljava/util/Map;Lorg/iotivity/base/OcResource/OnGetListener;)V
+*/
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_get
+(JNIEnv *env, jobject thiz, jobject jQueryParamsMap, jobject jListener)
+{
+    LOGD("OcResource_get");
+    if (!jQueryParamsMap)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
+        return;
+    }
+    if (!jListener)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onGetListener cannot be null");
+        return;
+    }
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    if (!resource)
+    {
+        return;
+    }
+
+    QueryParamsMap qpm;
+    JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
+
+    try
+    {
+        OCStackResult result = resource->get(
+            env,
+            qpm,
+            jListener);
+
+        if (OC_STACK_OK != result)
+        {
+            ThrowOcException(result, "OcResource_get");
+        }
+    }
+    catch (OCException& e)
+    {
+        LOGE("%s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+    }
+}
+
+/*
+* Class:     org_iotivity_base_OcResource
+* Method:    get1
+* Signature: (Ljava/util/Map;Lorg/iotivity/base/OcResource/OnGetListener;I)V
+*/
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_get1
+(JNIEnv *env, jobject thiz, jobject jQueryParamsMap, jobject jListener, jint jQoS)
+{
+    LOGD("OcResource_get");
+    if (!jQueryParamsMap)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
+        return;
+    }
+    if (!jListener)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onGetListener cannot be null");
+        return;
+    }
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    if (!resource)
+    {
+        return;
+    }
+
+    QueryParamsMap qpm;
+    JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
+
+    try
+    {
+        OCStackResult result = resource->get(
+            env,
+            qpm,
+            jListener,
+            JniUtils::getQOS(env, static_cast<int>(jQoS)));
+
+        if (OC_STACK_OK != result)
+        {
+            ThrowOcException(result, "OcResource_get");
+        }
+    }
+    catch (OCException& e)
+    {
+        LOGE("%s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+    }
+}
+
+/*
+* Class:     org_iotivity_base_OcResource
+* Method:    get2
+* Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;
+Lorg/iotivity/base/OcResource/OnGetListener;)V
+*/
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_get2
+(JNIEnv *env, jobject thiz, jstring jResourceType, jstring jResourceInterface,
+jobject jQueryParamsMap, jobject jListener)
+{
+    LOGD("OcResource_get");
+    std::string resourceType;
+    if (jResourceType)
+    {
+        resourceType = env->GetStringUTFChars(jResourceType, nullptr);
+    }
+    std::string resourceInterface;
+    if (jResourceInterface)
+    {
+        resourceInterface = env->GetStringUTFChars(jResourceInterface, nullptr);
+    }
+    if (!jQueryParamsMap)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
+        return;
+    }
+    if (!jListener)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onGetListener cannot be null");
+        return;
+    }
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    if (!resource)
+    {
+        return;
+    }
+
+    QueryParamsMap qpm;
+    JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
+    try
+    {
+        OCStackResult result = resource->get(
+            env,
+            resourceType,
+            resourceInterface,
+            qpm,
+            jListener);
+
+        if (OC_STACK_OK != result)
+        {
+            ThrowOcException(result, "OcResource_get");
+        }
+    }
+    catch (OCException& e)
+    {
+        LOGE("%s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+    }
+}
+
+/*
+* Class:     org_iotivity_base_OcResource
+* Method:    get3
+* Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;
+Lorg/iotivity/base/OcResource/OnGetListener;I)V
+*/
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_get3
+(JNIEnv *env, jobject thiz, jstring jResourceType, jstring jResourceInterface,
+jobject jQueryParamsMap, jobject jListener, jint jQoS)
+{
+    LOGD("OcResource_get");
+    if (!jQueryParamsMap)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
+        return;
+    }
+    if (!jListener)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onGetListener cannot be null");
+        return;
+    }
+    std::string resourceType;
+    if (jResourceType)
+    {
+        resourceType = env->GetStringUTFChars(jResourceType, nullptr);
+    }
+    std::string resourceInterface;
+    if (jResourceInterface)
+    {
+        resourceInterface = env->GetStringUTFChars(jResourceInterface, nullptr);
+    }
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    if (!resource)
+    {
+        return;
+    }
+
+    QueryParamsMap qpm;
+    JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
+
+    try
+    {
+        OCStackResult result = resource->get(
+            env,
+            resourceType,
+            resourceInterface,
+            qpm,
+            jListener,
+            JniUtils::getQOS(env, static_cast<int>(jQoS)));
+
+        if (OC_STACK_OK != result)
+        {
+            ThrowOcException(result, "OcResource_get");
+        }
+    }
+    catch (OCException& e)
+    {
+        LOGE("%s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+    }
+}
+
+/*
+* Class:     org_iotivity_base_OcResource
+* Method:    put
+* Signature: (Lorg/iotivity/base/OcRepresentation;Ljava/util/Map;
+Lorg/iotivity/base/OcResource/OnPutListener;)V
+*/
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_put
+(JNIEnv *env, jobject thiz, jobject jRepresentation, jobject jQueryParamsMap, jobject jListener)
+{
+    LOGD("OcResource_put");
+    if (!jRepresentation)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
+        return;
+    }
+    if (!jQueryParamsMap)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
+        return;
+    }
+    if (!jListener)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onPutListener cannot be null");
+        return;
+    }
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    if (!resource)
+    {
+        return;
+    }
+
+    OCRepresentation *representation = JniOcRepresentation::getOCRepresentationPtr(env, jRepresentation);
+    if (!representation)
+    {
+        return;
+    }
+
+    QueryParamsMap qpm;
+    JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
+
+    try
+    {
+        OCStackResult result = resource->put(
+            env,
+            *representation,
+            qpm,
+            jListener);
+
+        if (OC_STACK_OK != result)
+        {
+            ThrowOcException(result, "OcResource_put");
+        }
+    }
+    catch (OCException& e)
+    {
+        LOGE("%s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+    }
+}
+
+/*
+* Class:     org_iotivity_base_OcResource
+* Method:    put1
+* Signature: (Lorg/iotivity/base/OcRepresentation;Ljava/util/Map;
+Lorg/iotivity/base/OcResource/OnPutListener;I)V
+*/
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_put1
+(JNIEnv *env, jobject thiz, jobject jRepresentation, jobject jQueryParamsMap,
+jobject jListener, jint jQoS)
+{
+    LOGD("OcResource_put");
+    if (!jRepresentation)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
+        return;
+    }
+    if (!jQueryParamsMap)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
+        return;
+    }
+    if (!jListener)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onPutListener cannot be null");
+        return;
+    }
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    if (!resource)
+    {
+        return;
+    }
+
+    OCRepresentation *representation = JniOcRepresentation::getOCRepresentationPtr(env, jRepresentation);
+    if (!representation)
+    {
+        return;
+    }
+
+    QueryParamsMap qpm;
+    JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
+
+    try
+    {
+        OCStackResult result = resource->put(
+            env,
+            *representation,
+            qpm,
+            jListener,
+            JniUtils::getQOS(env, static_cast<int>(jQoS)));
+
+        if (OC_STACK_OK != result)
+        {
+            ThrowOcException(result, "OcResource_put");
+        }
+    }
+    catch (OCException& e)
+    {
+        LOGE("%s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+    }
+}
+
+/*
+* Class:     org_iotivity_base_OcResource
+* Method:    put2
+* Signature: (Ljava/lang/String;Ljava/lang/String;Lorg/iotivity/base/OcRepresentation;
+Ljava/util/Map;Lorg/iotivity/base/OcResource/OnPutListener;)V
+*/
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_put2
+(JNIEnv *env, jobject thiz, jstring jResourceType, jstring jResourceInterface,
+jobject jRepresentation, jobject jQueryParamsMap, jobject jListener)
+{
+    LOGD("OcResource_put");
+    std::string resourceType;
+    if (jResourceType)
+    {
+        resourceType = env->GetStringUTFChars(jResourceType, nullptr);
+    }
+    std::string resourceInterface;
+    if (jResourceInterface)
+    {
+        resourceInterface = env->GetStringUTFChars(jResourceInterface, nullptr);
+    }
+    if (!jRepresentation)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
+        return;
+    }
+    if (!jQueryParamsMap)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
+        return;
+    }
+    if (!jListener)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onPutListener cannot be null");
+        return;
+    }
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    if (!resource)
+    {
+        return;
+    }
+
+    OCRepresentation *representation = JniOcRepresentation::getOCRepresentationPtr(env, jRepresentation);
+    if (!representation)
+    {
+        return;
+    }
+
+    QueryParamsMap qpm;
+    JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
+
+    try
+    {
+        OCStackResult result = resource->put(
+            env,
+            resourceType,
+            resourceInterface,
+            *representation,
+            qpm,
+            jListener);
+
+        if (OC_STACK_OK != result)
+        {
+            ThrowOcException(result, "OcResource_put");
+        }
+    }
+    catch (OCException& e)
+    {
+        LOGE("%s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+    }
+}
+
+/*
+* Class:     org_iotivity_base_OcResource
+* Method:    put3
+* Signature: (Ljava/lang/String;Ljava/lang/String;Lorg/iotivity/base/OcRepresentation;
+Ljava/util/Map;Lorg/iotivity/base/OcResource/OnPutListener;I)V
+*/
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_put3
+(JNIEnv *env, jobject thiz, jstring jResourceType, jstring jResourceInterface, jobject jRepresentation,
+jobject jQueryParamsMap, jobject jListener, jint jQoS)
+{
+    LOGD("OcResource_put");
+    if (!jRepresentation)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "representation cannot be null");
+        return;
+    }
+    if (!jQueryParamsMap)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
+        return;
+    }
+    if (!jListener)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onPutListener cannot be null");
+        return;
+    }
+    std::string resourceType;
+    if (jResourceType)
+    {
+        resourceType = env->GetStringUTFChars(jResourceType, nullptr);
+    }
+    std::string resourceInterface;
+    if (jResourceInterface)
+    {
+        resourceInterface = env->GetStringUTFChars(jResourceInterface, nullptr);
+    }
+
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    if (!resource)
+    {
+        return;
+    }
+
+    OCRepresentation *representation = JniOcRepresentation::getOCRepresentationPtr(env, jRepresentation);
+    if (!representation)
+    {
+        return;
+    }
+
+    QueryParamsMap qpm;
+    JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
+
+    try
+    {
+        OCStackResult result = resource->put(
+            env,
+            resourceType,
+            resourceInterface,
+            *representation,
+            qpm,
+            jListener,
+            JniUtils::getQOS(env, static_cast<int>(jQoS)));
+
+        if (OC_STACK_OK != result)
+        {
+            ThrowOcException(result, "OcResource_put");
+        }
+    }
+    catch (OCException& e)
+    {
+        LOGE("%s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+    }
+}
+
+/*
+* Class:     org_iotivity_base_OcResource
+* Method:    post
+* Signature: (Lorg/iotivity/base/OcRepresentation;Ljava/util/Map;Lorg/iotivity/base/OcResource/OnPostListener;)V
+*/
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_post
+(JNIEnv *env, jobject thiz, jobject jRepresentation, jobject jQueryParamsMap, jobject jListener)
+{
+    LOGD("OcResource_post");
+    if (!jRepresentation)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "representation cannot be null");
+        return;
+    }
+    if (!jQueryParamsMap)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
+        return;
+    }
+    if (!jListener)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onPostListener cannot be null");
+        return;
+    }
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    if (!resource)
+    {
+        return;
+    }
+
+    OCRepresentation *representation = JniOcRepresentation::getOCRepresentationPtr(env, jRepresentation);
+    if (!representation)
+    {
+        return;
+    }
+
+    QueryParamsMap qpm;
+    JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
+
+    try
+    {
+        OCStackResult result = resource->post(
+            env,
+            *representation,
+            qpm,
+            jListener);
+
+        if (OC_STACK_OK != result)
+        {
+            ThrowOcException(result, "OcResource_post");
+        }
+    }
+    catch (OCException& e)
+    {
+        LOGE("%s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+    }
+}
+
+/*
+* Class:     org_iotivity_base_OcResource
+* Method:    post1
+* Signature: (Lorg/iotivity/base/OcRepresentation;Ljava/util/Map;Lorg/iotivity/base/OcResource/OnPostListener;I)V
+*/
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_post1
+(JNIEnv *env, jobject thiz, jobject jRepresentation, jobject jQueryParamsMap, jobject jListener, jint jQoS)
+{
+    LOGD("OcResource_post");
+    if (!jRepresentation)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "representation cannot be null");
+        return;
+    }
+    if (!jQueryParamsMap)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
         return;
     }
     if (!jListener)
     {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "onGetListener cannot be null");
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onPostListener cannot be null");
+        return;
+    }
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    if (!resource)
+    {
+        return;
+    }
+
+    OCRepresentation *representation = JniOcRepresentation::getOCRepresentationPtr(env, jRepresentation);
+    if (!representation)
+    {
+        return;
+    }
+
+    QueryParamsMap qpm;
+    JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
+
+    try
+    {
+        OCStackResult result = resource->post(
+            env,
+            *representation,
+            qpm,
+            jListener,
+            JniUtils::getQOS(env, static_cast<int>(jQoS)));
+
+        if (OC_STACK_OK != result)
+        {
+            ThrowOcException(result, "OcResource_post");
+        }
+    }
+    catch (OCException& e)
+    {
+        LOGE("%s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+    }
+}
+
+/*
+* Class:     org_iotivity_base_OcResource
+* Method:    post2
+* Signature: (Ljava/lang/String;Ljava/lang/String;Lorg/iotivity/base/OcRepresentation;
+Ljava/util/Map;Lorg/iotivity/base/OcResource/OnPostListener;)V
+*/
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_post2
+(JNIEnv *env, jobject thiz, jstring jResourceType, jstring jResourceInterface,
+jobject jRepresentation, jobject jQueryParamsMap, jobject jListener)
+{
+    LOGD("OcResource_post");
+    if (!jRepresentation)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "representation cannot be null");
+        return;
+    }
+    if (!jQueryParamsMap)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
+        return;
+    }
+    if (!jListener)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onPostListener cannot be null");
         return;
     }
     std::string resourceType;
     if (jResourceType)
     {
-        resourceType = env->GetStringUTFChars(jResourceType, NULL);
+        resourceType = env->GetStringUTFChars(jResourceType, nullptr);
     }
     std::string resourceInterface;
     if (jResourceInterface)
     {
-        resourceInterface = env->GetStringUTFChars(jResourceInterface, NULL);
+        resourceInterface = env->GetStringUTFChars(jResourceInterface, nullptr);
     }
+
     JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return;
+    if (!resource)
+    {
+        return;
+    }
+
+    OCRepresentation *representation = JniOcRepresentation::getOCRepresentationPtr(env, jRepresentation);
+    if (!representation)
+    {
+        return;
+    }
 
     QueryParamsMap qpm;
     JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
 
     try
     {
-        OCStackResult result = resource->get(
+        OCStackResult result = resource->post(
             env,
             resourceType,
             resourceInterface,
+            *representation,
             qpm,
-            jListener,
-            JniUtils::getQOS(env, static_cast<int>(jQoS)));
+            jListener);
 
         if (OC_STACK_OK != result)
         {
-            ThrowOcException(result, "OcResource_get");
+            ThrowOcException(result, "OcResource_post");
         }
     }
     catch (OCException& e)
@@ -625,17 +1643,18 @@ jobject jQueryParamsMap, jobject jListener, jint jQoS)
 
 /*
 * Class:     org_iotivity_base_OcResource
-* Method:    put
-* Signature: (Lorg/iotivity/base/OcRepresentation;Ljava/util/Map;
-Lorg/iotivity/base/OcResource/OnPutListener;)V
+* Method:    post3
+* Signature: (Ljava/lang/String;Ljava/lang/String;Lorg/iotivity/base/OcRepresentation;
+Ljava/util/Map;Lorg/iotivity/base/OcResource/OnPostListener;I)V
 */
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_put
-(JNIEnv *env, jobject thiz, jobject jRepresentation, jobject jQueryParamsMap, jobject jListener)
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_post3
+(JNIEnv *env, jobject thiz, jstring jResourceType, jstring jResourceInterface,
+jobject jRepresentation, jobject jQueryParamsMap, jobject jListener, jint jQoS)
 {
-    LOGD("OcResource_put");
+    LOGD("OcResource_post");
     if (!jRepresentation)
     {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
+        ThrowOcException(OC_STACK_INVALID_PARAM, "representation cannot be null");
         return;
     }
     if (!jQueryParamsMap)
@@ -645,29 +1664,87 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_put
     }
     if (!jListener)
     {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "onPutListener cannot be null");
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onPostListener cannot be null");
         return;
     }
+    std::string resourceType;
+    if (jResourceType)
+    {
+        resourceType = env->GetStringUTFChars(jResourceType, nullptr);
+    }
+    std::string resourceInterface;
+    if (jResourceInterface)
+    {
+        resourceInterface = env->GetStringUTFChars(jResourceInterface, nullptr);
+    }
+
     JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return;
+    if (!resource)
+    {
+        return;
+    }
 
     OCRepresentation *representation = JniOcRepresentation::getOCRepresentationPtr(env, jRepresentation);
-    if (!representation) return;
+    if (!representation)
+    {
+        return;
+    }
 
     QueryParamsMap qpm;
     JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
 
     try
     {
-        OCStackResult result = resource->put(
+        OCStackResult result = resource->post(
             env,
+            resourceType,
+            resourceInterface,
             *representation,
             qpm,
+            jListener,
+            JniUtils::getQOS(env, static_cast<int>(jQoS)));
+
+        if (OC_STACK_OK != result)
+        {
+            ThrowOcException(result, "OcResource_post");
+        }
+    }
+    catch (OCException& e)
+    {
+        LOGE("%s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+    }
+}
+
+/*
+* Class:     org_iotivity_base_OcResource
+* Method:    deleteResource
+* Signature: (Lorg/iotivity/base/OcResource/OnDeleteListener;)V
+*/
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_deleteResource
+(JNIEnv *env, jobject thiz, jobject jListener)
+{
+    LOGD("OcResource_deleteResource");
+    if (!jListener)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onDeleteListener cannot be null");
+        return;
+    }
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    if (!resource)
+    {
+        return;
+    }
+
+    try
+    {
+        OCStackResult result = resource->deleteResource(
+            env,
             jListener);
 
         if (OC_STACK_OK != result)
         {
-            ThrowOcException(result, "OcResource_put");
+            ThrowOcException(result, "OcResource_deleteResource");
         }
     }
     catch (OCException& e)
@@ -679,20 +1756,53 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_put
 
 /*
 * Class:     org_iotivity_base_OcResource
-* Method:    put1
-* Signature: (Lorg/iotivity/base/OcRepresentation;Ljava/util/Map;
-Lorg/iotivity/base/OcResource/OnPutListener;I)V
+* Method:    deleteResource1
+* Signature: (Lorg/iotivity/base/OcResource/OnDeleteListener;I)V
 */
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_put1
-(JNIEnv *env, jobject thiz, jobject jRepresentation, jobject jQueryParamsMap,
-jobject jListener, jint jQoS)
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_deleteResource1
+(JNIEnv *env, jobject thiz, jobject jListener, jint jQoS)
 {
-    LOGD("OcResource_put");
-    if (!jRepresentation)
+    LOGD("OcResource_deleteResource");
+    if (!jListener)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onDeleteListener cannot be null");
+        return;
+    }
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    if (!resource)
     {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
         return;
     }
+
+    try
+    {
+        OCStackResult result = resource->deleteResource(
+            env,
+            jListener,
+            JniUtils::getQOS(env, static_cast<int>(jQoS)));
+
+        if (OC_STACK_OK != result)
+        {
+            ThrowOcException(result, "OcResource_deleteResource");
+        }
+    }
+    catch (OCException& e)
+    {
+        LOGE("%s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
+    }
+}
+
+/*
+* Class:     org_iotivity_base_OcResource
+* Method:    observe
+* Signature: (Lorg/iotivity/base/ObserveType;Ljava/util/Map;
+Lorg/iotivity/base/OcResource/OnObserveListener;)V
+*/
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_observe
+(JNIEnv *env, jobject thiz, jint observeType, jobject jQueryParamsMap, jobject jListener)
+{
+    LOGD("OcResource_observe");
     if (!jQueryParamsMap)
     {
         ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
@@ -700,30 +1810,29 @@ jobject jListener, jint jQoS)
     }
     if (!jListener)
     {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "onPutListener cannot be null");
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onObserveListener cannot be null");
         return;
     }
     JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return;
-
-    OCRepresentation *representation = JniOcRepresentation::getOCRepresentationPtr(env, jRepresentation);
-    if (!representation) return;
+    if (!resource)
+    {
+        return;
+    }
 
     QueryParamsMap qpm;
     JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
 
     try
     {
-        OCStackResult result = resource->put(
+        OCStackResult result = resource->observe(
             env,
-            *representation,
+            JniUtils::getObserveType(env, static_cast<int>(observeType)),
             qpm,
-            jListener,
-            JniUtils::getQOS(env, static_cast<int>(jQoS)));
+            jListener);
 
         if (OC_STACK_OK != result)
         {
-            ThrowOcException(result, "OcResource_put");
+            ThrowOcException(result, "OcResource_observe");
         }
     }
     catch (OCException& e)
@@ -735,30 +1844,15 @@ jobject jListener, jint jQoS)
 
 /*
 * Class:     org_iotivity_base_OcResource
-* Method:    put2
-* Signature: (Ljava/lang/String;Ljava/lang/String;Lorg/iotivity/base/OcRepresentation;
-Ljava/util/Map;Lorg/iotivity/base/OcResource/OnPutListener;)V
+* Method:    observe1
+* Signature: (Lorg/iotivity/base/ObserveType;Ljava/util/Map;
+Lorg/iotivity/base/OcResource/OnObserveListener;I)V
 */
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_put2
-(JNIEnv *env, jobject thiz, jstring jResourceType, jstring jResourceInterface,
-jobject jRepresentation, jobject jQueryParamsMap, jobject jListener)
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_observe1
+(JNIEnv *env, jobject thiz, jint observeType, jobject jQueryParamsMap,
+jobject jListener, jint jQoS)
 {
-    LOGD("OcResource_put");
-    std::string resourceType;
-    if (jResourceType)
-    {
-        resourceType = env->GetStringUTFChars(jResourceType, NULL);
-    }
-    std::string resourceInterface;
-    if (jResourceInterface)
-    {
-        resourceInterface = env->GetStringUTFChars(jResourceInterface, NULL);
-    }
-    if (!jRepresentation)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
-        return;
-    }
+    LOGD("OcResource_observe");
     if (!jQueryParamsMap)
     {
         ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
@@ -766,31 +1860,30 @@ jobject jRepresentation, jobject jQueryParamsMap, jobject jListener)
     }
     if (!jListener)
     {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "onPutListener cannot be null");
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onObserveListener cannot be null");
         return;
     }
     JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return;
-
-    OCRepresentation *representation = JniOcRepresentation::getOCRepresentationPtr(env, jRepresentation);
-    if (!representation) return;
+    if (!resource)
+    {
+        return;
+    }
 
     QueryParamsMap qpm;
     JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
 
     try
     {
-        OCStackResult result = resource->put(
+        OCStackResult result = resource->observe(
             env,
-            resourceType,
-            resourceInterface,
-            *representation,
+            JniUtils::getObserveType(env, static_cast<int>(observeType)),
             qpm,
-            jListener);
+            jListener,
+            JniUtils::getQOS(env, static_cast<int>(jQoS)));
 
         if (OC_STACK_OK != result)
         {
-            ThrowOcException(result, "OcResource_put");
+            ThrowOcException(result, "OcResource_observe");
         }
     }
     catch (OCException& e)
@@ -802,64 +1895,28 @@ jobject jRepresentation, jobject jQueryParamsMap, jobject jListener)
 
 /*
 * Class:     org_iotivity_base_OcResource
-* Method:    put3
-* Signature: (Ljava/lang/String;Ljava/lang/String;Lorg/iotivity/base/OcRepresentation;
-Ljava/util/Map;Lorg/iotivity/base/OcResource/OnPutListener;I)V
+* Method:    cancelObserve1
+* Signature: I)V
 */
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_put3
-(JNIEnv *env, jobject thiz, jstring jResourceType, jstring jResourceInterface, jobject jRepresentation,
-jobject jQueryParamsMap, jobject jListener, jint jQoS)
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_cancelObserve1
+(JNIEnv *env, jobject thiz, jint jQoS)
 {
-    LOGD("OcResource_put");
-    if (!jRepresentation)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "representation cannot be null");
-        return;
-    }
-    if (!jQueryParamsMap)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
-        return;
-    }
-    if (!jListener)
+    LOGD("OcResource_cancelObserve1");
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    if (!resource)
     {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "onPutListener cannot be null");
         return;
     }
-    std::string resourceType;
-    if (jResourceType)
-    {
-        resourceType = env->GetStringUTFChars(jResourceType, NULL);
-    }
-    std::string resourceInterface;
-    if (jResourceInterface)
-    {
-        resourceInterface = env->GetStringUTFChars(jResourceInterface, NULL);
-    }
-
-    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return;
-
-    OCRepresentation *representation = JniOcRepresentation::getOCRepresentationPtr(env, jRepresentation);
-    if (!representation) return;
-
-    QueryParamsMap qpm;
-    JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
 
     try
     {
-        OCStackResult result = resource->put(
+        OCStackResult result = resource->cancelObserve(
             env,
-            resourceType,
-            resourceInterface,
-            *representation,
-            qpm,
-            jListener,
             JniUtils::getQOS(env, static_cast<int>(jQoS)));
 
         if (OC_STACK_OK != result)
         {
-            ThrowOcException(result, "OcResource_put");
+            ThrowOcException(result, "OcResource_cancelObserve");
         }
     }
     catch (OCException& e)
@@ -871,239 +1928,285 @@ jobject jQueryParamsMap, jobject jListener, jint jQoS)
 
 /*
 * Class:     org_iotivity_base_OcResource
-* Method:    post
-* Signature: (Lorg/iotivity/base/OcRepresentation;Ljava/util/Map;Lorg/iotivity/base/OcResource/OnPostListener;)V
+* Method:    setHeaderOptions
+* Signature: ([Lorg/iotivity/OcHeaderOption;)V
 */
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_post
-(JNIEnv *env, jobject thiz, jobject jRepresentation, jobject jQueryParamsMap, jobject jListener)
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_setHeaderOptions
+(JNIEnv *env, jobject thiz, jobjectArray jheaderOptionArr)
 {
-    LOGD("OcResource_post");
-    if (!jRepresentation)
+    LOGD("OcResource_setHeaderOptions");
+    if (!jheaderOptionArr)
     {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "representation cannot be null");
+        ThrowOcException(OC_STACK_INVALID_PARAM, "headerOptionList cannot be null");
         return;
     }
-    if (!jQueryParamsMap)
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    if (!resource)
     {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
         return;
     }
-    if (!jListener)
+
+    HeaderOptions headerOptions;
+    JniUtils::convertJavaHeaderOptionsArrToVector(env, jheaderOptionArr, headerOptions);
+
+    resource->setHeaderOptions(headerOptions);
+}
+
+/*
+* Class:     org_iotivity_base_OcResource
+* Method:    unsetHeaderOptions
+* Signature: ()V
+*/
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_unsetHeaderOptions
+(JNIEnv *env, jobject thiz)
+{
+    LOGD("OcResource_unsetHeaderOptions");
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    if (!resource)
     {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "onPostListener cannot be null");
         return;
     }
+
+    resource->unsetHeaderOptions();
+}
+
+/*
+* Class:     org_iotivity_base_OcResource
+* Method:    getHost
+* Signature: ()Ljava/lang/String;
+*/
+JNIEXPORT jstring JNICALL Java_org_iotivity_base_OcResource_getHost
+(JNIEnv *env, jobject thiz)
+{
+    LOGD("OcResource_getHost");
     JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return;
+    if (!resource)
+    {
+        return nullptr;
+    }
 
-    OCRepresentation *representation = JniOcRepresentation::getOCRepresentationPtr(env, jRepresentation);
-    if (!representation) return;
+    return env->NewStringUTF(resource->host().c_str());
+}
 
-    QueryParamsMap qpm;
-    JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
+/*
+* Class:     org_iotivity_base_OcResource
+* Method:    getUri
+* Signature: ()Ljava/lang/String;
+*/
+JNIEXPORT jstring JNICALL Java_org_iotivity_base_OcResource_getUri
+(JNIEnv *env, jobject thiz)
+{
+    LOGD("OcResource_getUri");
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    if (!resource)
+    {
+        return nullptr;
+    }
 
-    try
+    return env->NewStringUTF(resource->uri().c_str());
+}
+
+/*
+* Class:     org_iotivity_base_OcResource
+* Method:    getConnectivityTypeN
+* Signature: ()I
+*/
+JNIEXPORT jint JNICALL Java_org_iotivity_base_OcResource_getConnectivityTypeN
+(JNIEnv *env, jobject thiz)
+{
+    LOGD("OcResource_getConnectivityType");
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    if (!resource)
     {
-        OCStackResult result = resource->post(
-            env,
-            *representation,
-            qpm,
-            jListener);
+        return -1;
+    }
 
-        if (OC_STACK_OK != result)
-        {
-            ThrowOcException(result, "OcResource_post");
-        }
+    OCConnectivityType connectivityType = resource->connectivityType();
+    return static_cast<jint>(connectivityType);
+}
+
+/*
+* Class:     org_iotivity_base_OcResource
+* Method:    isObservable
+* Signature: ()Z
+*/
+JNIEXPORT jboolean JNICALL Java_org_iotivity_base_OcResource_isObservable
+(JNIEnv *env, jobject thiz)
+{
+    LOGD("OcResource_isObservable");
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    if (!resource)
+    {
+        return false;
     }
-    catch (OCException& e)
+
+    return (jboolean)resource->isObservable();
+}
+
+/*
+* Class:     org_iotivity_base_OcResource
+* Method:    getResourceTypes
+* Signature: ()Ljava/util/List;
+*/
+JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcResource_getResourceTypes
+(JNIEnv *env, jobject thiz)
+{
+    LOGD("OcResource_getResourceTypes");
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    if (!resource)
+    {
+        return nullptr;
+    }
+
+    std::vector<std::string> resourceTypes = resource->getResourceTypes();
+
+    return JniUtils::convertStrVectorToJavaStrList(env, resourceTypes);
+}
+
+/*
+* Class:     org_iotivity_base_OcResource
+* Method:    getResourceInterfaces
+* Signature: ()Ljava/util/List;
+*/
+JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcResource_getResourceInterfaces
+(JNIEnv *env, jobject thiz)
+{
+    LOGD("OcResource_getResourceInterfaces");
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    if (!resource)
     {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(e.code(), e.reason().c_str());
+        return nullptr;
     }
+
+    std::vector<std::string> resourceInterfaces = resource->getResourceInterfaces();
+
+    return JniUtils::convertStrVectorToJavaStrList(env, resourceInterfaces);
 }
 
 /*
 * Class:     org_iotivity_base_OcResource
-* Method:    post1
-* Signature: (Lorg/iotivity/base/OcRepresentation;Ljava/util/Map;Lorg/iotivity/base/OcResource/OnPostListener;I)V
+* Method:    getUniqueIdentifier
+* Signature: ()Lorg/iotivity/base/OcResourceIdentifier;
 */
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_post1
-(JNIEnv *env, jobject thiz, jobject jRepresentation, jobject jQueryParamsMap, jobject jListener, jint jQoS)
+JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcResource_getUniqueIdentifier
+(JNIEnv *env, jobject thiz)
 {
-    LOGD("OcResource_post");
-    if (!jRepresentation)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "representation cannot be null");
-        return;
-    }
-    if (!jQueryParamsMap)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
-        return;
-    }
-    if (!jListener)
+    LOGD("OcResource_getUniqueIdentifier");
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    if (!resource)
     {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "onPostListener cannot be null");
-        return;
+        return nullptr;
     }
-    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return;
-
-    OCRepresentation *representation = JniOcRepresentation::getOCRepresentationPtr(env, jRepresentation);
-    if (!representation) return;
-
-    QueryParamsMap qpm;
-    JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
 
-    try
+    JniOcResourceIdentifier *jniResourceIdentifier =
+        new JniOcResourceIdentifier(resource->uniqueIdentifier());
+    if (!jniResourceIdentifier)
     {
-        OCStackResult result = resource->post(
-            env,
-            *representation,
-            qpm,
-            jListener,
-            JniUtils::getQOS(env, static_cast<int>(jQoS)));
-
-        if (OC_STACK_OK != result)
-        {
-            ThrowOcException(result, "OcResource_post");
-        }
+        return nullptr;
     }
-    catch (OCException& e)
+
+    jlong handle = reinterpret_cast<jlong>(jniResourceIdentifier);
+    jobject jResourceIdentifier = env->NewObject(g_cls_OcResourceIdentifier,
+        g_mid_OcResourceIdentifier_N_ctor, handle);
+    if (!jResourceIdentifier)
     {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(e.code(), e.reason().c_str());
+        delete jniResourceIdentifier;
     }
+    return jResourceIdentifier;
 }
 
 /*
 * Class:     org_iotivity_base_OcResource
-* Method:    post2
-* Signature: (Ljava/lang/String;Ljava/lang/String;Lorg/iotivity/base/OcRepresentation;
-Ljava/util/Map;Lorg/iotivity/base/OcResource/OnPostListener;)V
+* Method:    getServerId
+* Signature: ()Ljava/lang/String;
 */
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_post2
-(JNIEnv *env, jobject thiz, jstring jResourceType, jstring jResourceInterface,
-jobject jRepresentation, jobject jQueryParamsMap, jobject jListener)
+JNIEXPORT jstring JNICALL Java_org_iotivity_base_OcResource_getServerId
+(JNIEnv *env, jobject thiz)
 {
-    LOGD("OcResource_post");
-    if (!jRepresentation)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "representation cannot be null");
-        return;
-    }
-    if (!jQueryParamsMap)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
-        return;
-    }
-    if (!jListener)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "onPostListener cannot be null");
-        return;
-    }
-    std::string resourceType;
-    if (jResourceType)
-    {
-        resourceType = env->GetStringUTFChars(jResourceType, NULL);
-    }
-    std::string resourceInterface;
-    if (jResourceInterface)
+    LOGD("OcResource_getServerId");
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    if (!resource)
     {
-        resourceInterface = env->GetStringUTFChars(jResourceInterface, NULL);
+        return nullptr;
     }
 
-    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return;
-
-    OCRepresentation *representation = JniOcRepresentation::getOCRepresentationPtr(env, jRepresentation);
-    if (!representation) return;
-
-    QueryParamsMap qpm;
-    JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
-
-    try
-    {
-        OCStackResult result = resource->post(
-            env,
-            resourceType,
-            resourceInterface,
-            *representation,
-            qpm,
-            jListener);
+    return env->NewStringUTF(resource->sid().c_str());
+}
 
-        if (OC_STACK_OK != result)
-        {
-            ThrowOcException(result, "OcResource_post");
-        }
-    }
-    catch (OCException& e)
+/*
+* Class:     org_iotivity_base_OcResource
+* Method:    getDeviceName
+* Signature: ()Ljava/lang/String;
+*/
+JNIEXPORT jstring JNICALL Java_org_iotivity_base_OcResource_getDeviceName
+(JNIEnv *env, jobject thiz)
+{
+    LOGD("OcResource_getDeviceName");
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    if (!resource)
     {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(e.code(), e.reason().c_str());
+        return nullptr;
     }
+
+    return env->NewStringUTF(resource->deviceName().c_str());
 }
 
 /*
 * Class:     org_iotivity_base_OcResource
-* Method:    post3
-* Signature: (Ljava/lang/String;Ljava/lang/String;Lorg/iotivity/base/OcRepresentation;
-Ljava/util/Map;Lorg/iotivity/base/OcResource/OnPostListener;I)V
+* Method:    dispose
+* Signature: ()V
 */
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_post3
-(JNIEnv *env, jobject thiz, jstring jResourceType, jstring jResourceInterface,
-jobject jRepresentation, jobject jQueryParamsMap, jobject jListener, jint jQoS)
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_dispose
+(JNIEnv *env, jobject thiz)
 {
-    LOGD("OcResource_post");
-    if (!jRepresentation)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "representation cannot be null");
-        return;
-    }
+    LOGD("OcResource_dispose");
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    delete resource;
+}
+
+/*
+* Class:     org_iotivity_base_OcResource
+* Method:    discoveryMQTopicsImpl
+* Signature: (Ljava/util/Map;Lorg/iotivity/base/OcPlatform/OnResourceFoundListener;I)V
+*/
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_discoveryMQTopicsImpl
+(JNIEnv *env, jobject thiz, jobject jQueryParamsMap, jobject jListener, jint jQoS)
+{
+    LOGD("OcResource_discoveryMQTopicsImpl");
+
+#ifdef WITH_MQ
     if (!jQueryParamsMap)
     {
         ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
         return;
     }
+
     if (!jListener)
     {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "onPostListener cannot be null");
+        ThrowOcException(OC_STACK_INVALID_PARAM, "listener cannot be null");
         return;
     }
-    std::string resourceType;
-    if (jResourceType)
-    {
-        resourceType = env->GetStringUTFChars(jResourceType, NULL);
-    }
-    std::string resourceInterface;
-    if (jResourceInterface)
-    {
-        resourceInterface = env->GetStringUTFChars(jResourceInterface, NULL);
-    }
 
     JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return;
-
-    OCRepresentation *representation = JniOcRepresentation::getOCRepresentationPtr(env, jRepresentation);
-    if (!representation) return;
+    if (!resource)
+    {
+        return;
+    }
 
     QueryParamsMap qpm;
     JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
 
     try
     {
-        OCStackResult result = resource->post(
+        OCStackResult result = resource->discoveryMQTopics(
             env,
-            resourceType,
-            resourceInterface,
-            *representation,
             qpm,
             jListener,
             JniUtils::getQOS(env, static_cast<int>(jQoS)));
 
         if (OC_STACK_OK != result)
         {
-            ThrowOcException(result, "OcResource_post");
+            ThrowOcException(result, "OcResource_discoveryMQTopicsImpl");
         }
     }
     catch (OCException& e)
@@ -1111,116 +2214,77 @@ jobject jRepresentation, jobject jQueryParamsMap, jobject jListener, jint jQoS)
         LOGE("%s", e.reason().c_str());
         ThrowOcException(e.code(), e.reason().c_str());
     }
+#else
+    ThrowOcException(JNI_NO_SUPPORT, "not support");
+#endif
 }
 
 /*
 * Class:     org_iotivity_base_OcResource
-* Method:    deleteResource
-* Signature: (Lorg/iotivity/base/OcResource/OnDeleteListener;)V
+* Method:    createMQTopicImpl
+* Signature: (Lorg/iotivity/base/OcRepresentation;Ljava/util/String;Ljava/util/Map
+*             ;Lorg/iotivity/base/OcPlatform/OnMQTopicCreatedListener;I)V
 */
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_deleteResource
-(JNIEnv *env, jobject thiz, jobject jListener)
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_createMQTopicImpl
+(JNIEnv *env, jobject thiz, jobject jRepresentation, jstring jUri,
+ jobject jQueryParamsMap, jobject jListener, jint jQoS)
 {
-    LOGD("OcResource_deleteResource");
-    if (!jListener)
-    {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "onDeleteListener cannot be null");
-        return;
-    }
-    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return;
-
-    try
-    {
-        OCStackResult result = resource->deleteResource(
-            env,
-            jListener);
+    LOGD("OcResource_createMQTopicImpl");
 
-        if (OC_STACK_OK != result)
-        {
-            ThrowOcException(result, "OcResource_deleteResource");
-        }
-    }
-    catch (OCException& e)
+#ifdef WITH_MQ
+    if (!jQueryParamsMap)
     {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(e.code(), e.reason().c_str());
+        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
+        return;
     }
-}
 
-/*
-* Class:     org_iotivity_base_OcResource
-* Method:    deleteResource1
-* Signature: (Lorg/iotivity/base/OcResource/OnDeleteListener;I)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_deleteResource1
-(JNIEnv *env, jobject thiz, jobject jListener, jint jQoS)
-{
-    LOGD("OcResource_deleteResource");
     if (!jListener)
     {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "onDeleteListener cannot be null");
+        ThrowOcException(OC_STACK_INVALID_PARAM, "listener cannot be null");
         return;
     }
-    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return;
-
-    try
-    {
-        OCStackResult result = resource->deleteResource(
-            env,
-            jListener,
-            JniUtils::getQOS(env, static_cast<int>(jQoS)));
 
-        if (OC_STACK_OK != result)
-        {
-            ThrowOcException(result, "OcResource_deleteResource");
-        }
-    }
-    catch (OCException& e)
+    if (!jRepresentation)
     {
-        LOGE("%s", e.reason().c_str());
-        ThrowOcException(e.code(), e.reason().c_str());
+        ThrowOcException(OC_STACK_INVALID_PARAM, "representation null");
+        return;
     }
-}
 
-/*
-* Class:     org_iotivity_base_OcResource
-* Method:    observe
-* Signature: (Lorg/iotivity/base/ObserveType;Ljava/util/Map;
-Lorg/iotivity/base/OcResource/OnObserveListener;)V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_observe
-(JNIEnv *env, jobject thiz, jint observeType, jobject jQueryParamsMap, jobject jListener)
-{
-    LOGD("OcResource_observe");
-    if (!jQueryParamsMap)
+    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
+    if (!resource)
     {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
         return;
     }
-    if (!jListener)
+
+    std::string targetUri;
+    if (jUri)
+    {
+        targetUri = env->GetStringUTFChars(jUri, nullptr);
+    }
+
+    OCRepresentation *representation = JniOcRepresentation::getOCRepresentationPtr(env,
+                                                                                   jRepresentation);
+    if (!representation)
     {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "onObserveListener cannot be null");
         return;
     }
-    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return;
 
     QueryParamsMap qpm;
     JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
 
     try
     {
-        OCStackResult result = resource->observe(
+        OCStackResult result = resource->createMQTopic(
             env,
-            JniUtils::getObserveType(env, static_cast<int>(observeType)),
+            *representation,
+            targetUri,
             qpm,
-            jListener);
+            jListener,
+            JniUtils::getQOS(env, static_cast<int>(jQoS)));
 
         if (OC_STACK_OK != result)
         {
-            ThrowOcException(result, "OcResource_observe");
+            ThrowOcException(result, "OcResource_createMQTopicImpl");
         }
     }
     catch (OCException& e)
@@ -1228,19 +2292,21 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_observe
         LOGE("%s", e.reason().c_str());
         ThrowOcException(e.code(), e.reason().c_str());
     }
+#else
+    ThrowOcException(JNI_NO_SUPPORT, "not support");
+#endif
 }
 
 /*
 * Class:     org_iotivity_base_OcResource
-* Method:    observe1
-* Signature: (Lorg/iotivity/base/ObserveType;Ljava/util/Map;
-Lorg/iotivity/base/OcResource/OnObserveListener;I)V
+* Method:    subscribeMQTopic
+* Signature: (Ljava/util/Map;Lorg/iotivity/base/OcResource/OnObserveListener;I)V
 */
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_observe1
-(JNIEnv *env, jobject thiz, jint observeType, jobject jQueryParamsMap,
-jobject jListener, jint jQoS)
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_subscribeMQTopicImpl
+(JNIEnv *env, jobject thiz, jobject jQueryParamsMap, jobject jListener, jint jQoS)
 {
-    LOGD("OcResource_observe");
+    LOGD("OcResource_subscribeMQTopicImpl");
+#ifdef MQ_SUBSCRIBER
     if (!jQueryParamsMap)
     {
         ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
@@ -1252,23 +2318,25 @@ jobject jListener, jint jQoS)
         return;
     }
     JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return;
+    if (!resource)
+    {
+        return;
+    }
 
     QueryParamsMap qpm;
     JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
 
     try
     {
-        OCStackResult result = resource->observe(
+        OCStackResult result = resource->subscribeMQTopic(
             env,
-            JniUtils::getObserveType(env, static_cast<int>(observeType)),
             qpm,
             jListener,
             JniUtils::getQOS(env, static_cast<int>(jQoS)));
 
         if (OC_STACK_OK != result)
         {
-            ThrowOcException(result, "OcResource_observe");
+            ThrowOcException(result, "OcResource_subscribeMQTopicImpl");
         }
     }
     catch (OCException& e)
@@ -1276,27 +2344,34 @@ jobject jListener, jint jQoS)
         LOGE("%s", e.reason().c_str());
         ThrowOcException(e.code(), e.reason().c_str());
     }
+#else
+    ThrowOcException(JNI_NO_SUPPORT, "not support");
+#endif
 }
 
 /*
 * Class:     org_iotivity_base_OcResource
-* Method:    cancelObserve
-* Signature: ()V
+* Method:    unsubscribeMQTopicImpl
+* Signature: (I)V
 */
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_cancelObserve
-(JNIEnv *env, jobject thiz)
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_unsubscribeMQTopicImpl
+(JNIEnv *env, jobject thiz, jint jQoS)
 {
-    LOGD("OcResource_cancelObserve");
+    LOGD("OcResource_unsubscribeMQTopicImpl");
+#ifdef MQ_SUBSCRIBER
     JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return;
+    if (!resource)
+    {
+        return;
+    }
 
     try
     {
-        OCStackResult result = resource->cancelObserve(env);
-
+        OCStackResult result = resource->unsubscribeMQTopic(
+                JniUtils::getQOS(env, static_cast<int>(jQoS)));
         if (OC_STACK_OK != result)
         {
-            ThrowOcException(result, "OcResource_cancelObserve");
+            ThrowOcException(result, "OcResource_unsubscribeMQTopicImpl");
         }
     }
     catch (OCException& e)
@@ -1304,29 +2379,52 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_cancelObserve
         LOGE("%s", e.reason().c_str());
         ThrowOcException(e.code(), e.reason().c_str());
     }
+#else
+    ThrowOcException(JNI_NO_SUPPORT, "not support");
+#endif
 }
 
 /*
 * Class:     org_iotivity_base_OcResource
-* Method:    cancelObserve1
-* Signature: I)V
+* Method:    requestMQPublishImpl
+* Signature: (Ljava/util/Map;Lorg/iotivity/base/OcResource/OnPostListener;I)V
 */
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_cancelObserve1
-(JNIEnv *env, jobject thiz, jint jQoS)
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_requestMQPublishImpl
+(JNIEnv *env, jobject thiz, jobject jQueryParamsMap, jobject jListener, jint jQoS)
 {
-    LOGD("OcResource_cancelObserve1");
+    LOGD("OcResource_requestMQPublishImpl");
+#ifdef MQ_SUBSCRIBER
+    if (!jQueryParamsMap)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
+        return;
+    }
+    if (!jListener)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onPostListener cannot be null");
+        return;
+    }
+
     JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return;
+    if (!resource)
+    {
+        return;
+    }
+
+    QueryParamsMap qpm;
+    JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
 
     try
     {
-        OCStackResult result = resource->cancelObserve(
+        OCStackResult result = resource->requestMQPublish(
             env,
+            qpm,
+            jListener,
             JniUtils::getQOS(env, static_cast<int>(jQoS)));
 
         if (OC_STACK_OK != result)
         {
-            ThrowOcException(result, "OcResource_cancelObserve");
+            ThrowOcException(result, "OcResource_requestMQPublishImpl");
         }
     }
     catch (OCException& e)
@@ -1334,189 +2432,77 @@ JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_cancelObserve1
         LOGE("%s", e.reason().c_str());
         ThrowOcException(e.code(), e.reason().c_str());
     }
+#else
+    ThrowOcException(JNI_NO_SUPPORT, "not support");
+#endif
 }
 
 /*
 * Class:     org_iotivity_base_OcResource
-* Method:    setHeaderOptions
-* Signature: ([Lorg/iotivity/OcHeaderOption;)V
+* Method:    publishMQTopicImpl
+* Signature: (Lorg/iotivity/base/OcRepresentation;Ljava/util/Map;
+*             Lorg/iotivity/base/OcResource/OnPostListener;I)V
 */
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_setHeaderOptions
-(JNIEnv *env, jobject thiz, jobjectArray jheaderOptionArr)
+JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_publishMQTopicImpl
+(JNIEnv *env, jobject thiz, jobject jRepresentation, jobject jQueryParamsMap,
+ jobject jListener, jint jQoS)
 {
-    LOGD("OcResource_setHeaderOptions");
-    if (!jheaderOptionArr)
+    LOGD("OcResource_publishMQTopicImpl");
+#ifdef MQ_PUBLISHER
+    if (!jRepresentation)
     {
-        ThrowOcException(OC_STACK_INVALID_PARAM, "headerOptionList cannot be null");
+        ThrowOcException(OC_STACK_INVALID_PARAM, "representation cannot be null");
         return;
     }
-    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return;
-
-    HeaderOptions headerOptions;
-    JniUtils::convertJavaHeaderOptionsArrToVector(env, jheaderOptionArr, headerOptions);
-
-    resource->setHeaderOptions(headerOptions);
-}
-
-/*
-* Class:     org_iotivity_base_OcResource
-* Method:    unsetHeaderOptions
-* Signature: ()V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_unsetHeaderOptions
-(JNIEnv *env, jobject thiz)
-{
-    LOGD("OcResource_unsetHeaderOptions");
-    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return;
-
-    resource->unsetHeaderOptions();
-}
-
-/*
-* Class:     org_iotivity_base_OcResource
-* Method:    getHost
-* Signature: ()Ljava/lang/String;
-*/
-JNIEXPORT jstring JNICALL Java_org_iotivity_base_OcResource_getHost
-(JNIEnv *env, jobject thiz)
-{
-    LOGD("OcResource_getHost");
-    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return nullptr;
-
-    return env->NewStringUTF(resource->host().c_str());
-}
-
-/*
-* Class:     org_iotivity_base_OcResource
-* Method:    getUri
-* Signature: ()Ljava/lang/String;
-*/
-JNIEXPORT jstring JNICALL Java_org_iotivity_base_OcResource_getUri
-(JNIEnv *env, jobject thiz)
-{
-    LOGD("OcResource_getUri");
-    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return nullptr;
-
-    return env->NewStringUTF(resource->uri().c_str());
-}
-
-/*
-* Class:     org_iotivity_base_OcResource
-* Method:    getConnectivityTypeN
-* Signature: ()I
-*/
-JNIEXPORT jint JNICALL Java_org_iotivity_base_OcResource_getConnectivityTypeN
-(JNIEnv *env, jobject thiz)
-{
-    LOGD("OcResource_getConnectivityType");
-    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return -1;
-
-    OCConnectivityType connectivityType = resource->connectivityType();
-    return static_cast<jint>(connectivityType);
-}
-
-/*
-* Class:     org_iotivity_base_OcResource
-* Method:    isObservable
-* Signature: ()Z
-*/
-JNIEXPORT jboolean JNICALL Java_org_iotivity_base_OcResource_isObservable
-(JNIEnv *env, jobject thiz)
-{
-    LOGD("OcResource_isObservable");
-    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    return (jboolean)resource->isObservable();
-}
-
-/*
-* Class:     org_iotivity_base_OcResource
-* Method:    getResourceTypes
-* Signature: ()Ljava/util/List;
-*/
-JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcResource_getResourceTypes
-(JNIEnv *env, jobject thiz)
-{
-    LOGD("OcResource_getResourceTypes");
-    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return nullptr;
 
-    std::vector<std::string> resourceTypes = resource->getResourceTypes();
+    if (!jQueryParamsMap)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "queryParamsMap cannot be null");
+        return;
+    }
 
-    return JniUtils::convertStrVectorToJavaStrList(env, resourceTypes);
-}
+    if (!jListener)
+    {
+        ThrowOcException(OC_STACK_INVALID_PARAM, "onPostListener cannot be null");
+        return;
+    }
 
-/*
-* Class:     org_iotivity_base_OcResource
-* Method:    getResourceInterfaces
-* Signature: ()Ljava/util/List;
-*/
-JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcResource_getResourceInterfaces
-(JNIEnv *env, jobject thiz)
-{
-    LOGD("OcResource_getResourceInterfaces");
     JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return nullptr;
-
-    std::vector<std::string> resourceInterfaces = resource->getResourceInterfaces();
+    if (!resource)
+    {
+        return;
+    }
 
-    return JniUtils::convertStrVectorToJavaStrList(env, resourceInterfaces);
-}
+    OCRepresentation *representation = JniOcRepresentation::getOCRepresentationPtr(env,
+                                                                                   jRepresentation);
+    if (!representation)
+    {
+        return;
+    }
 
-/*
-* Class:     org_iotivity_base_OcResource
-* Method:    getUniqueIdentifier
-* Signature: ()Lorg/iotivity/base/OcResourceIdentifier;
-*/
-JNIEXPORT jobject JNICALL Java_org_iotivity_base_OcResource_getUniqueIdentifier
-(JNIEnv *env, jobject thiz)
-{
-    LOGD("OcResource_getUniqueIdentifier");
-    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return nullptr;
+    QueryParamsMap qpm;
+    JniUtils::convertJavaMapToQueryParamsMap(env, jQueryParamsMap, qpm);
 
-    JniOcResourceIdentifier *jniResourceIdentifier =
-        new JniOcResourceIdentifier(resource->uniqueIdentifier());
-    if (!jniResourceIdentifier) return nullptr;
+    try
+    {
+        OCStackResult result = resource->publishMQTopic(
+            env,
+            *representation,
+            qpm,
+            jListener,
+            JniUtils::getQOS(env, static_cast<int>(jQoS)));
 
-    jlong handle = reinterpret_cast<jlong>(jniResourceIdentifier);
-    jobject jResourceIdentifier = env->NewObject(g_cls_OcResourceIdentifier,
-        g_mid_OcResourceIdentifier_N_ctor, handle);
-    if (!jResourceIdentifier)
+        if (OC_STACK_OK != result)
+        {
+            ThrowOcException(result, "OcResource_publishMQTopicImpl");
+        }
+    }
+    catch (OCException& e)
     {
-        delete jniResourceIdentifier;
+        LOGE("%s", e.reason().c_str());
+        ThrowOcException(e.code(), e.reason().c_str());
     }
-    return jResourceIdentifier;
-}
-
-/*
-* Class:     org_iotivity_base_OcResource
-* Method:    getServerId
-* Signature: ()Ljava/lang/String;
-*/
-JNIEXPORT jstring JNICALL Java_org_iotivity_base_OcResource_getServerId
-(JNIEnv *env, jobject thiz)
-{
-    LOGD("OcResource_getServerId");
-    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    if (!resource) return nullptr;
-
-    return env->NewStringUTF(resource->sid().c_str());
+#else
+    ThrowOcException(JNI_NO_SUPPORT, "not support");
+#endif
 }
-
-/*
-* Class:     org_iotivity_base_OcResource
-* Method:    dispose
-* Signature: ()V
-*/
-JNIEXPORT void JNICALL Java_org_iotivity_base_OcResource_dispose
-(JNIEnv *env, jobject thiz)
-{
-    LOGD("OcResource_dispose");
-    JniOcResource *resource = JniOcResource::getJniOcResourcePtr(env, thiz);
-    delete resource;
-}
\ No newline at end of file