replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / service / notification / android / notification-service / src / main / jni / consumer / JniNotificationConsumer.cpp
index ad4a123..7abe708 100755 (executable)
@@ -20,6 +20,7 @@
 \r
 #include "JniNotificationConsumer.h"\r
 #include "NSConsumerService.h"\r
+#include "NSException.h"\r
 #include "JniOcRepresentation.h"\r
 \r
 static JavaVM *g_jvm_consumer = NULL;\r
@@ -54,7 +55,7 @@ static JNIEnv *GetJNIEnv(jint *ret)
         case JNI_EDETACHED:\r
             if (g_jvm_consumer->AttachCurrentThread(&env, NULL) != JNI_OK)\r
             {\r
-                LOGE ("Failed to get the environment");\r
+                NS_LOGE ("Failed to get the environment");\r
                 return NULL;\r
             }\r
             else\r
@@ -62,99 +63,116 @@ static JNIEnv *GetJNIEnv(jint *ret)
                 return env;\r
             }\r
         case JNI_EVERSION:\r
-            LOGE ("JNI version is not supported");\r
+            NS_LOGE ("JNI version is not supported");\r
+            return NULL;\r
         default:\r
-            LOGE ("Failed to get the environment");\r
+            NS_LOGE ("Failed to get the environment");\r
             return NULL;\r
     }\r
 }\r
 \r
 jobject getJavaProviderState(JNIEnv *env, OIC::Service::NSProviderState state)\r
 {\r
-    LOGD ("ConsumerService_getJavaProviderState - IN");\r
+    NS_LOGD ("ConsumerService_getJavaProviderState - IN");\r
+    jobject providerState = NULL;\r
     switch (state)\r
     {\r
         case OIC::Service::NSProviderState::ALLOW:\r
             {\r
                 static jfieldID fieldID = env->GetStaticFieldID(g_cls_ProviderState,\r
                                           "ALLOW", "Lorg/iotivity/service/ns/consumer/Provider$ProviderState;");\r
-                return env->GetStaticObjectField(g_cls_ProviderState, fieldID);\r
+                providerState = env->GetStaticObjectField(g_cls_ProviderState, fieldID);\r
+                break;\r
             }\r
         case OIC::Service::NSProviderState::DENY:\r
             {\r
                 static jfieldID fieldID = env->GetStaticFieldID(g_cls_ProviderState,\r
                                           "DENY", "Lorg/iotivity/service/ns/consumer/Provider$ProviderState;");\r
-                return env->GetStaticObjectField(g_cls_ProviderState, fieldID);\r
+                providerState = env->GetStaticObjectField(g_cls_ProviderState, fieldID);\r
+                break;\r
             }\r
         case OIC::Service::NSProviderState::TOPIC:\r
             {\r
                 static jfieldID fieldID = env->GetStaticFieldID(g_cls_ProviderState,\r
                                           "TOPIC", "Lorg/iotivity/service/ns/consumer/Provider$ProviderState;");\r
-                return env->GetStaticObjectField(g_cls_ProviderState, fieldID);\r
+                providerState = env->GetStaticObjectField(g_cls_ProviderState, fieldID);\r
+                break;\r
             }\r
         case OIC::Service::NSProviderState::STOPPED:\r
             {\r
                 static jfieldID fieldID = env->GetStaticFieldID(g_cls_ProviderState,\r
                                           "STOPPED", "Lorg/iotivity/service/ns/consumer/Provider$ProviderState;");\r
-                return env->GetStaticObjectField(g_cls_ProviderState, fieldID);\r
+                providerState = env->GetStaticObjectField(g_cls_ProviderState, fieldID);\r
+                break;\r
             }\r
         default:\r
-            return NULL;\r
+            {\r
+                providerState = NULL;\r
+                break;\r
+            }\r
     }\r
-    LOGD ("ConsumerService_getJavaProviderState - OUT");\r
-    return NULL;\r
+    NS_LOGD ("ConsumerService_getJavaProviderState - OUT");\r
+    return providerState;\r
 }\r
 \r
 jobject getJavaSyncType(JNIEnv *env, OIC::Service::NSSyncInfo::NSSyncType nsType)\r
 {\r
-    LOGD ("ConsumerService_getJavaSyncType - IN");\r
+    NS_LOGD ("ConsumerService_getJavaSyncType - IN");\r
 \r
     // SyncType\r
     jclass cls_SyncType = (jclass) (env->NewLocalRef(g_cls_SyncType));\r
     if (!cls_SyncType)\r
     {\r
-        LOGE ("Failed to Get ObjectClass for SyncType");\r
+        NS_LOGE ("Failed to Get ObjectClass for SyncType");\r
         return NULL;\r
     }\r
+    jobject syncType = NULL;\r
     switch (nsType)\r
     {\r
         case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_UNREAD:\r
             {\r
                 static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType,\r
                                           "UNREAD", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;");\r
-                return env->GetStaticObjectField(cls_SyncType, fieldID);\r
+                syncType = env->GetStaticObjectField(cls_SyncType, fieldID);\r
+                break;\r
             }\r
         case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ :\r
             {\r
                 static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType,\r
                                           "READ", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;");\r
-                return env->GetStaticObjectField(cls_SyncType, fieldID);\r
+                syncType = env->GetStaticObjectField(cls_SyncType, fieldID);\r
+                break;\r
             }\r
         case OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_DELETED :\r
             {\r
                 static jfieldID fieldID = env->GetStaticFieldID(cls_SyncType,\r
                                           "DELETED", "Lorg/iotivity/service/ns/common/SyncInfo$SyncType;");\r
-                return env->GetStaticObjectField(cls_SyncType, fieldID);\r
+                syncType = env->GetStaticObjectField(cls_SyncType, fieldID);\r
+                break;\r
             }\r
         default:\r
-            return NULL;\r
+            {\r
+                syncType = NULL;\r
+                break;\r
+            }\r
     }\r
 \r
-    LOGD ("ConsumerService_getJavaSyncType - OUT");\r
-    return NULL;\r
+    NS_LOGD ("ConsumerService_getJavaSyncType - OUT");\r
+    return syncType;\r
 }\r
 \r
 jobject getJavaTopicState(JNIEnv *env, OIC::Service::NSTopic::NSTopicState nsState)\r
 {\r
-    LOGD ("ConsumerService_getJavaTopicState - IN");\r
+    NS_LOGD ("ConsumerService_getJavaTopicState - IN");\r
 \r
     // TopicState\r
     jclass cls_topicState = (jclass) (env->NewLocalRef(g_cls_TopicState));\r
     if (!cls_topicState)\r
     {\r
-        LOGE ("Failed to Get ObjectClass for TopicState Type");\r
+        NS_LOGE ("Failed to Get ObjectClass for TopicState Type");\r
         return NULL;\r
     }\r
+    jobject topicState = NULL;\r
 \r
     switch (nsState)\r
     {\r
@@ -162,72 +180,77 @@ jobject getJavaTopicState(JNIEnv *env, OIC::Service::NSTopic::NSTopicState nsSta
             {\r
                 static jfieldID fieldID = env->GetStaticFieldID(cls_topicState,\r
                                           "UNSUBSCRIBED", "Lorg/iotivity/service/ns/common/Topic$TopicState;");\r
-                return env->GetStaticObjectField(cls_topicState, fieldID);\r
+                topicState = env->GetStaticObjectField(cls_topicState, fieldID);\r
+                break;\r
             }\r
         case OIC::Service::NSTopic::NSTopicState::SUBSCRIBED:\r
             {\r
                 static jfieldID fieldID = env->GetStaticFieldID(cls_topicState,\r
                                           "SUBSCRIBED", "Lorg/iotivity/service/ns/common/Topic$TopicState;");\r
-                return env->GetStaticObjectField(cls_topicState, fieldID);\r
+                topicState = env->GetStaticObjectField(cls_topicState, fieldID);\r
+                break;\r
             }\r
         default:\r
-            return NULL;\r
+            {\r
+                topicState = NULL;\r
+                break;\r
+            }\r
     }\r
 \r
-    LOGD ("ConsumerService_getJavaTopicState - OUT");\r
-    return NULL;\r
+    NS_LOGD ("ConsumerService_getJavaTopicState - OUT");\r
+    return topicState;\r
 }\r
 \r
-jobject getJavaTopicsList(JNIEnv *env, OIC::Service::NSTopicsList *topicList)\r
+jobject getJavaTopicsList(JNIEnv *env, std::shared_ptr<OIC::Service::NSTopicsList> topicList)\r
 {\r
-    LOGD ("ConsumerService_getJavaTopicsList - IN");\r
+    NS_LOGD ("ConsumerService_getJavaTopicsList - IN");\r
     jclass cls_topicList = (jclass) (env->NewLocalRef(g_cls_TopicsList));\r
     if (!cls_topicList)\r
     {\r
-        LOGE ("Failed to Get ObjectClass for TopicsList");\r
+        NS_LOGE ("Failed to Get ObjectClass for TopicsList");\r
         return NULL;\r
     }\r
     jmethodID mid_topicList = env->GetMethodID(cls_topicList, "<init>", "()V");\r
     if (!mid_topicList)\r
     {\r
-        LOGE ("Failed to Get MethodID for TopicsList<init>");\r
+        NS_LOGE ("Failed to Get MethodID for TopicsList<init>");\r
         return NULL;\r
     }\r
     jobject obj_topicList = env->NewObject(cls_topicList, mid_topicList);\r
     if (!obj_topicList)\r
     {\r
-        LOGE ("Failed to Get object for TopicsList");\r
+        NS_LOGE ("Failed to Get object for TopicsList");\r
         return NULL;\r
     }\r
     jmethodID mid_addTopic = env->GetMethodID(cls_topicList, "addTopic",\r
                              "(Ljava/lang/String;Lorg/iotivity/service/ns/common/Topic$TopicState;)V");\r
     if (!mid_addTopic)\r
     {\r
-        LOGE ("Failed to Get MethodID for addTopic");\r
+        NS_LOGE ("Failed to Get MethodID for addTopic");\r
         return NULL;\r
     }\r
     for (auto it : topicList->getTopicsList())\r
     {\r
-        jobject jState = getJavaTopicState(env, it->getState());\r
-        std::string topicName = it->getTopicName();\r
+        jobject jState = getJavaTopicState(env, it.getState());\r
+        std::string topicName = it.getTopicName();\r
         jstring jTopicName = env->NewStringUTF(topicName.c_str());\r
         env->CallVoidMethod(obj_topicList, mid_addTopic, jTopicName, jState);\r
     }\r
     env->DeleteLocalRef(cls_topicList);\r
-    LOGD ("ConsumerService_getJavaTopicsList - OUT");\r
+    NS_LOGD ("ConsumerService_getJavaTopicsList - OUT");\r
     return obj_topicList;\r
 }\r
 \r
 bool getNativeTopicState(JNIEnv *env,  jobject jTopic , OIC::Service::NSTopic::NSTopicState &state )\r
 {\r
-    LOGD ("ConsumerService_getNativeTopicState - IN");\r
+    NS_LOGD ("ConsumerService_getNativeTopicState - IN");\r
 \r
     jclass cls_topic = env->GetObjectClass( jTopic);\r
     // TopicState\r
     jclass cls_TopicState = (jclass) (env->NewLocalRef(g_cls_TopicState));\r
     if (!cls_TopicState)\r
     {\r
-        LOGE ("Failed to Get ObjectClass for cls_TopicState Type");\r
+        NS_LOGE ("Failed to Get ObjectClass for cls_TopicState Type");\r
         return false;\r
     }\r
     jmethodID mid = env->GetMethodID(cls_TopicState, "ordinal", "()I");\r
@@ -235,110 +258,111 @@ bool getNativeTopicState(JNIEnv *env,  jobject jTopic , OIC::Service::NSTopic::N
                                           "Lorg/iotivity/service/ns/common/Topic$TopicState;");\r
     if (fid_state == NULL)\r
     {\r
-        LOGE("Error: jfieldID for state type  is null");\r
+        NS_LOGE ("Error: jfieldID for state type  is null");\r
         return false;\r
     }\r
     jobject jobj = env->GetObjectField( jTopic, fid_state);\r
     if (jobj == NULL)\r
     {\r
-        LOGE("Error: object of field  state Type is null");\r
+        NS_LOGE ("Error: object of field  state Type is null");\r
         return false;\r
     }\r
     jint jState = env->CallIntMethod(jobj, mid);\r
     state = (OIC::Service::NSTopic::NSTopicState) jState;\r
-    LOGD ("ConsumerService_getNativeTopicState - OUT");\r
+    NS_LOGD ("ConsumerService_getNativeTopicState - OUT");\r
     return true;\r
 \r
 }\r
 \r
 const char *getNativeTopicName(JNIEnv *env,  jobject jTopic)\r
 {\r
-    LOGD ("ConsumerService_getNativeTopicName - IN");\r
+    NS_LOGD ("ConsumerService_getNativeTopicName - IN");\r
     jclass cls_topic = env->GetObjectClass( jTopic);\r
     if (cls_topic == NULL)\r
     {\r
-        LOGE("Error: Class for Topic is null");\r
+        NS_LOGE ("Error: Class for Topic is null");\r
         return nullptr;\r
     }\r
     jfieldID fid_name = env->GetFieldID( cls_topic, "mTopicName", "Ljava/lang/String;");\r
     if (fid_name == NULL)\r
     {\r
-        LOGE("Error: jfieldID for Topic Name  is null");\r
+        NS_LOGE ("Error: jfieldID for Topic Name  is null");\r
         return nullptr;\r
     }\r
     jstring jTopicName = (jstring) env->GetObjectField( jTopic, fid_name);\r
-    const char *topicName;\r
+    const char *topicName = NULL;\r
     if (jTopicName)\r
     {\r
         topicName = env->GetStringUTFChars( jTopicName, NULL);\r
     }\r
     else\r
     {\r
-        LOGI("Info: topicName is null");\r
+        NS_LOGI (TAG, "Info: topicName is null");\r
     }\r
-    LOGD ("ConsumerService_getNativeTopicName - OUT");\r
+    NS_LOGD ("ConsumerService_getNativeTopicName - OUT");\r
     return topicName;\r
 \r
 }\r
 \r
-OIC::Service::NSTopicsList *getNativeTopicsList(JNIEnv *env, jobject jTopicList)\r
+std::shared_ptr<OIC::Service::NSTopicsList> getNativeTopicsList(JNIEnv *env, jobject jTopicList)\r
 {\r
-    LOGD ("ConsumerService_getNativeTopicsList - IN");\r
+    NS_LOGD ("ConsumerService_getNativeTopicsList - IN");\r
 \r
     jclass cls_topicList = env->GetObjectClass( jTopicList);\r
     if (cls_topicList == NULL)\r
     {\r
-        LOGE("Error: Class for Topic List  is null");\r
+        NS_LOGE ("Error: Class for Topic List  is null");\r
         return nullptr;\r
     }\r
     jfieldID fid_list = env->GetFieldID( cls_topicList, "mTopicsList", "Ljava/util/Vector;");\r
     if (fid_list == NULL)\r
     {\r
-        LOGE("Error: jfieldID for Topic List  is null");\r
+        NS_LOGE ("Error: jfieldID for Topic List  is null");\r
         return nullptr;\r
     }\r
     jobject jobj = env->GetObjectField( jTopicList, fid_list);\r
     if (jobj == NULL)\r
     {\r
-        LOGE("Error: object of field  Topic List is null");\r
+        NS_LOGE ("Error: object of field  Topic List is null");\r
         return nullptr;\r
     }\r
     jclass cls_vec = env->FindClass("java/util/Vector");\r
     if (cls_vec == NULL)\r
     {\r
-        LOGE("Error: Class for Vector not found");\r
+        NS_LOGE ("Error: Class for Vector not found");\r
         return nullptr;\r
     }\r
     jmethodID sizeMethod = env->GetMethodID(cls_vec,  "size", "()I");\r
     if (sizeMethod == NULL)\r
     {\r
-        LOGE("Error: MethodId for Vector Size  not found");\r
+        NS_LOGE ("Error: MethodId for Vector Size  not found");\r
         return nullptr;\r
     }\r
     int size = env->CallIntMethod(jobj, sizeMethod);\r
     jmethodID getMethod = env->GetMethodID(cls_vec,  "get", "(I)Ljava/lang/Object;");\r
     if (getMethod == NULL)\r
     {\r
-        LOGE("Error: MethodId for Vector get  not found");\r
+        NS_LOGE ("Error: MethodId for Vector get  not found");\r
         return nullptr;\r
     }\r
-    OIC::Service::NSTopicsList *nsTopicList = new OIC::Service::NSTopicsList();\r
+    std::shared_ptr<OIC::Service::NSTopicsList> nsTopicList =\r
+        std::make_shared<OIC::Service::NSTopicsList>();\r
     for (int index = 0; index < size; index++)\r
     {\r
         jobject topicObj = env->CallObjectMethod(jobj, getMethod, index);\r
         if (topicObj == NULL)\r
         {\r
-            LOGE("Error: object of field  Topic  is null");\r
+            NS_LOGE ("Error: object of field  Topic  is null");\r
             return nullptr;\r
         }\r
         const char *name =  getNativeTopicName(env, topicObj);\r
         if (name == nullptr)\r
         {\r
-            LOGE("Error: Couldn't find topic Name");\r
+            NS_LOGE ("Error: Couldn't find topic Name");\r
             return nullptr;\r
         }\r
         std::string topicName(name);\r
-        OIC::Service::NSTopic::NSTopicState state;\r
+        OIC::Service::NSTopic::NSTopicState state = OIC::Service::NSTopic::NSTopicState::UNSUBSCRIBED;\r
         if (!getNativeTopicState(env, topicObj, state))\r
         {\r
             return nullptr;\r
@@ -348,149 +372,124 @@ OIC::Service::NSTopicsList *getNativeTopicsList(JNIEnv *env, jobject jTopicList)
 \r
     env->DeleteLocalRef(cls_vec);\r
     env->DeleteLocalRef(cls_topicList);\r
-    LOGD ("ConsumerService_getNativeTopicsList - OUT");\r
+    NS_LOGD ("ConsumerService_getNativeTopicsList - OUT");\r
     return nsTopicList;\r
 }\r
 \r
-OIC::Service::NSProvider *getNativeProvider(JNIEnv *env, jobject jObj)\r
+jobject getJavaProvider(JNIEnv *env, std::shared_ptr<OIC::Service::NSProvider> provider)\r
 {\r
-    LOGD ("ConsumerService_getNativeProvider - IN");\r
-    jclass providerClass = env->GetObjectClass(jObj);\r
-    if (!providerClass)\r
-    {\r
-        ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
-        return NULL;\r
-    }\r
-    jfieldID jproviderId = env->GetFieldID(providerClass, "mProviderId", "Ljava/lang/String;");\r
-    if (!jproviderId)\r
-    {\r
-        ThrowNSException(NS_ERROR, "Failed to get providerId for Provider");\r
-        return NULL;\r
-    }\r
-    jstring jprovider_id = (jstring) env->GetObjectField(jObj, jproviderId);\r
-    if (!jprovider_id)\r
-    {\r
-        ThrowNSException(NS_ERROR, "ProviderId cannot be null");\r
-        return NULL;\r
-    }\r
+    NS_LOGD ("ConsumerService_getJavaProvider - IN");\r
+    NS_LOGD ("ProviderId : %s\n", provider->getProviderId().c_str());\r
 \r
-    const char *providerId = env->GetStringUTFChars(jprovider_id, 0);\r
-    LOGD ("ProviderId : %s\n", providerId);\r
-\r
-    OIC::Service::NSProvider *provider =\r
-        OIC::Service::NSConsumerService::getInstance()->getProvider(std::string(providerId));\r
-    if (provider == nullptr)\r
+    jstring jProviderId = env->NewStringUTF(provider->getProviderId().c_str());\r
+    auto *objectHolder = JniSharedObjectHolder<OIC::Service::NSProvider>::create(provider);\r
+    if (!objectHolder)\r
     {\r
-        ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
+        NS_LOGE ("Failed to create new Object Holder for Provider");\r
         return NULL;\r
     }\r
-    env->ReleaseStringUTFChars(jprovider_id, providerId);\r
-    LOGD ("ConsumerService_getNativeProvider - OUT");\r
-    return provider;\r
-}\r
-\r
-jobject getJavaProvider(JNIEnv *env, OIC::Service::NSProvider *provider)\r
-{\r
-    LOGD ("ConsumerService_getJavaProvider - IN");\r
-    LOGD ("ProviderId : %s\n", provider->getProviderId().c_str());\r
-\r
-    jstring jProviderId = env->NewStringUTF(provider->getProviderId().c_str());\r
-    jlong pProvider = (long)provider;\r
+    jlong pProvider = (long)objectHolder;\r
 \r
     jclass cls_provider = (jclass) (env->NewLocalRef(g_cls_Provider));\r
     if (!cls_provider)\r
     {\r
-        LOGE ("Failed to Get ObjectClass for Provider");\r
+        NS_LOGE ("Failed to Get ObjectClass for Provider");\r
         return NULL;\r
     }\r
     jmethodID mid_provider = env->GetMethodID(\r
                                  cls_provider, "<init>", "(Ljava/lang/String;)V");\r
     if (!mid_provider)\r
     {\r
-        LOGE ("Failed to Get MethodID for Provider<init>");\r
+        NS_LOGE ("Failed to Get MethodID for Provider<init>");\r
         return NULL;\r
     }\r
     jobject obj_provider = env->NewObject(cls_provider, mid_provider, jProviderId);\r
     if (!obj_provider)\r
     {\r
-        LOGE("Failed to create new Object for Provider");\r
+        NS_LOGE ("Failed to create new Object for Provider");\r
         return NULL;\r
     }\r
 \r
     jfieldID nativeHandle = env->GetFieldID(cls_provider, "mNativeHandle", "J");\r
     if (!nativeHandle)\r
     {\r
-        LOGE("Failed to get nativeHandle for Provider");\r
+        NS_LOGE ("Failed to get nativeHandle for Provider");\r
         return NULL;\r
     }\r
     env->SetLongField(obj_provider, nativeHandle, pProvider);\r
 \r
     env->DeleteLocalRef(cls_provider);\r
-    LOGD ("ConsumerService_getJavaProvider - OUT");\r
+    NS_LOGD ("ConsumerService_getJavaProvider - OUT");\r
     return obj_provider;\r
 }\r
 \r
 jobject getJavaMessageType(JNIEnv *env, OIC::Service::NSMessage::NSMessageType type)\r
 {\r
-    LOGD ("ConsumerService_getJavaMessageType - IN");\r
+    NS_LOGD ("ConsumerService_getJavaMessageType - IN");\r
+    jobject messageType = NULL;\r
     switch (type)\r
     {\r
         case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_ALERT:\r
             {\r
                 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message_Type,\r
                                           "ALERT", "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
-                return env->GetStaticObjectField(g_cls_Message_Type, fieldID);\r
+                messageType = env->GetStaticObjectField(g_cls_Message_Type, fieldID);\r
+                break;\r
             }\r
         case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_NOTICE:\r
             {\r
                 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message_Type,\r
                                           "NOTICE", "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
-                return env->GetStaticObjectField(g_cls_Message_Type, fieldID);\r
+                messageType = env->GetStaticObjectField(g_cls_Message_Type, fieldID);\r
+                break;\r
             }\r
         case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_EVENT:\r
             {\r
                 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message_Type,\r
                                           "EVENT", "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
-                return env->GetStaticObjectField(g_cls_Message_Type, fieldID);\r
+                messageType = env->GetStaticObjectField(g_cls_Message_Type, fieldID);\r
+                break;\r
             }\r
         case OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_INFO:\r
             {\r
                 static jfieldID fieldID = env->GetStaticFieldID(g_cls_Message_Type,\r
                                           "INFO", "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
-                return env->GetStaticObjectField(g_cls_Message_Type, fieldID);\r
+                messageType = env->GetStaticObjectField(g_cls_Message_Type, fieldID);\r
+                break;\r
             }\r
         default:\r
-            return NULL;\r
+            {\r
+                messageType = NULL;\r
+                break;\r
+            }\r
     }\r
-    LOGD ("ConsumerService_getJavaMessageType - OUT");\r
-    return NULL;\r
+    NS_LOGD ("ConsumerService_getJavaMessageType - OUT");\r
+    return messageType;\r
 }\r
 \r
-jobject getJavaMessage(JNIEnv *env, OIC::Service::NSMessage *message)\r
+jobject getJavaMessage(JNIEnv *env, OIC::Service::NSMessage message)\r
 {\r
-    LOGD ("ConsumerService_getJavaMessage - IN");\r
-\r
-    LOGD ("id : %llu\n", message->getMessageId());\r
-    LOGD ("title : %s\n", message->getTitle().c_str());\r
-    LOGD ("content : %s\n", message->getContentText().c_str());\r
-    LOGD ("source : %s\n", message->getSourceName().c_str());\r
+    NS_LOGD ("ConsumerService_getJavaMessage - IN");\r
 \r
-    jlong jMessageId = (jlong) message->getMessageId();\r
-    jstring jProviderId = env->NewStringUTF(message->getProviderId().c_str());\r
-    jstring jTitle = env->NewStringUTF(message->getTitle().c_str());\r
-    jstring jContentText = env->NewStringUTF(message->getContentText().c_str());\r
-    jstring jSourceName = env->NewStringUTF(message->getSourceName().c_str());\r
-    jstring jTopic = env->NewStringUTF(message->getTopic().c_str());\r
+    NS_LOGD ("id : %llu\n", message.getMessageId());\r
+    NS_LOGD ("title : %s\n", message.getTitle().c_str());\r
+    NS_LOGD ("content : %s\n", message.getContentText().c_str());\r
+    NS_LOGD ("source : %s\n", message.getSourceName().c_str());\r
 \r
-    jstring jTime = env->NewStringUTF(message->getTime().c_str());\r
-    jlong jTTL = (jlong) message->getTTL();\r
+    jlong jMessageId = (jlong) message.getMessageId();\r
+    jstring jProviderId = env->NewStringUTF(message.getProviderId().c_str());\r
+    jstring jTitle = env->NewStringUTF(message.getTitle().c_str());\r
+    jstring jContentText = env->NewStringUTF(message.getContentText().c_str());\r
+    jstring jSourceName = env->NewStringUTF(message.getSourceName().c_str());\r
+    jstring jTopic = env->NewStringUTF(message.getTopic().c_str());\r
 \r
-    jlong pMessage = (long) message;\r
+    jstring jTime = env->NewStringUTF(message.getTime().c_str());\r
+    jlong jTTL = (jlong) message.getTTL();\r
 \r
     jclass cls_message = (jclass) (env->NewLocalRef(g_cls_Message));\r
     if (!cls_message)\r
     {\r
-        LOGE ("Failed to Get ObjectClass for Message");\r
+        NS_LOGE ("Failed to Get ObjectClass for Message");\r
         return NULL ;\r
     }\r
     jmethodID mid_message = env->GetMethodID(\r
@@ -498,28 +497,21 @@ jobject getJavaMessage(JNIEnv *env, OIC::Service::NSMessage *message)
                                 "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");\r
     if (!mid_message)\r
     {\r
-        LOGE ("Failed to Get MethodID for Message<init>");\r
+        NS_LOGE ("Failed to Get MethodID for Message<init>");\r
         return NULL;\r
     }\r
     jobject obj_message = env->NewObject(cls_message, mid_message,\r
                                          jTitle, jContentText, jSourceName);\r
     if (!obj_message)\r
     {\r
-        LOGE ("Failed to Get Java Object for Message");\r
-        return NULL;\r
-    }\r
-    jfieldID fid_nativeHandle = env->GetFieldID(cls_message, "mNativeHandle", "J");\r
-    if (!fid_nativeHandle)\r
-    {\r
-        LOGE("Failed to get nativeHandle for Message");\r
+        NS_LOGE ("Failed to Get Java Object for Message");\r
         return NULL;\r
     }\r
-    env->SetLongField(obj_message, fid_nativeHandle, pMessage);\r
 \r
     jfieldID fid_messageId = env->GetFieldID(cls_message, "mMessageId", "J");\r
     if (!fid_messageId)\r
     {\r
-        LOGE("Failed to get field MessageID for Message");\r
+        NS_LOGE ("Failed to get field MessageID for Message");\r
         return NULL;\r
     }\r
     env->SetLongField(obj_message, fid_messageId, jMessageId);\r
@@ -527,7 +519,7 @@ jobject getJavaMessage(JNIEnv *env, OIC::Service::NSMessage *message)
     jfieldID fid_providerId = env->GetFieldID(cls_message, "mProviderId", "Ljava/lang/String;");\r
     if (!fid_providerId)\r
     {\r
-        LOGE("Failed to get field ProviderID for Message");\r
+        NS_LOGE ("Failed to get field ProviderID for Message");\r
         return NULL;\r
     }\r
     env->SetObjectField(obj_message, fid_providerId, jProviderId);\r
@@ -535,7 +527,7 @@ jobject getJavaMessage(JNIEnv *env, OIC::Service::NSMessage *message)
     jfieldID fid_time = env->GetFieldID(cls_message, "mTime", "Ljava/lang/String;");\r
     if (!fid_time)\r
     {\r
-        LOGE("Failed to get field Time for Message");\r
+        NS_LOGE ("Failed to get field Time for Message");\r
         return NULL;\r
     }\r
     env->SetObjectField(obj_message, fid_time, jTime);\r
@@ -543,7 +535,7 @@ jobject getJavaMessage(JNIEnv *env, OIC::Service::NSMessage *message)
     jfieldID fid_ttl = env->GetFieldID(cls_message, "mTTL", "J");\r
     if (!fid_ttl)\r
     {\r
-        LOGE("Failed to get field TTL for Message");\r
+        NS_LOGE ("Failed to get field TTL for Message");\r
         return NULL;\r
     }\r
     env->SetLongField(obj_message, fid_ttl, jTTL);\r
@@ -551,26 +543,26 @@ jobject getJavaMessage(JNIEnv *env, OIC::Service::NSMessage *message)
     jfieldID fid_topic = env->GetFieldID(cls_message, "mTopic", "Ljava/lang/String;");\r
     if (!fid_topic)\r
     {\r
-        LOGE("Failed to get mTopic for Message");\r
+        NS_LOGE ("Failed to get mTopic for Message");\r
         return NULL;\r
     }\r
     env->SetObjectField(obj_message, fid_topic, jTopic);\r
 \r
-    OIC::Service::NSMediaContents *mediaCont = message->getMediaContents();\r
+    OIC::Service::NSMediaContents *mediaCont = message.getMediaContents();\r
     if (mediaCont != nullptr)\r
     {\r
         jstring jIconImage = env->NewStringUTF(mediaCont->getIconImage().c_str());\r
         jclass cls_mediaContents = (jclass) (env->NewLocalRef(g_cls_MediaContents));\r
         if (!cls_mediaContents)\r
         {\r
-            LOGE ("Failed to Get ObjectClass for MediaContents");\r
+            NS_LOGE ("Failed to Get ObjectClass for MediaContents");\r
             return NULL;\r
         }\r
         jmethodID mid_mediaContents = env->GetMethodID(\r
                                           cls_mediaContents, "<init>", "(Ljava/lang/String;)V");\r
         if (!mid_mediaContents)\r
         {\r
-            LOGE ("Failed to Get MethodID for MediaContents<init>");\r
+            NS_LOGE ("Failed to Get MethodID for MediaContents<init>");\r
             return NULL;\r
         }\r
         jobject obj_mediaContents = env->NewObject(cls_mediaContents, mid_mediaContents,\r
@@ -580,86 +572,98 @@ jobject getJavaMessage(JNIEnv *env, OIC::Service::NSMessage *message)
                                      "Lorg/iotivity/service/ns/common/MediaContents;");\r
         if (!fid_mediaContents)\r
         {\r
-            LOGE("Failed to get field mediaContents for Message");\r
+            NS_LOGE ("Failed to get field mediaContents for Message");\r
             return NULL;\r
         }\r
         env->SetObjectField(obj_message, fid_mediaContents, obj_mediaContents);\r
 \r
     }\r
 \r
-    jobject jType = getJavaMessageType(env, message->getType());\r
+    jobject jType = getJavaMessageType(env, message.getType());\r
     if (jType)\r
     {\r
         jfieldID fid_type = env->GetFieldID(cls_message, "mType",\r
                                             "Lorg/iotivity/service/ns/common/Message$MessageType;");\r
         if (!fid_type)\r
         {\r
-            LOGE("Failed to get field Type for Message");\r
+            NS_LOGE ("Failed to get field Type for Message");\r
             return NULL;\r
         }\r
         env->SetObjectField(obj_message, fid_type, jType);\r
     }\r
 \r
-    LOGD("Reading OCRepresentation Object from Native");\r
+    NS_LOGD ("Reading OCRepresentation Object from Native");\r
 \r
-    OC::OCRepresentation *ocRepresentation = new OC::OCRepresentation(message->getExtraInfo());\r
+    OC::OCRepresentation *ocRepresentation = new OC::OCRepresentation(message.getExtraInfo());\r
     jlong handle = reinterpret_cast<jlong>(ocRepresentation);\r
     jobject jRepresentation = env->NewObject(g_cls_OcRepresentation, g_mid_OcRepresentation_N_ctor_bool,\r
                               handle, true);\r
     if (!jRepresentation)\r
     {\r
-        LOGE("Failed to create OcRepresentation");\r
+        NS_LOGE ("Failed to create OcRepresentation");\r
         delete ocRepresentation;\r
     }\r
     else\r
     {\r
-        LOGD("Created OCRepresentation Object from Native");\r
+        NS_LOGD ("Created OCRepresentation Object from Native");\r
     }\r
     jfieldID fid_extraInfo = env->GetFieldID(cls_message, "mExtraInfo",\r
                              "Lorg/iotivity/base/OcRepresentation;");\r
     if (!fid_extraInfo)\r
     {\r
-        LOGE("Failed to get mExtraInfo for Message");\r
+        NS_LOGE ("Failed to get mExtraInfo for Message");\r
         delete ocRepresentation;\r
         return NULL;\r
     }\r
-    LOGD ("setting extraInfo field");\r
+    NS_LOGD ("setting extraInfo field");\r
     env->SetObjectField(obj_message, fid_extraInfo, jRepresentation);\r
 \r
     env->DeleteLocalRef(cls_message);\r
-    LOGD ("ConsumerService_getJavaMessage - OUT");\r
+    NS_LOGD ("ConsumerService_getJavaMessage - OUT");\r
     return obj_message;\r
 }\r
 \r
-void onDiscoverProvider(OIC::Service::NSProvider *provider)\r
+void onDiscoverProvider(std::shared_ptr<OIC::Service::NSProvider> provider)\r
 {\r
-    LOGD ("ConsumerService_onDiscoverProvider - IN");\r
+    NS_LOGD ("ConsumerService_onDiscoverProvider - IN");\r
 \r
-    jint envRet;\r
+    jint envRet = 0;;\r
     JNIEnv *env = GetJNIEnv(&envRet);\r
-    if (NULL == env) return ;\r
+    if (NULL == env)\r
+    {\r
+        return ;\r
+    }\r
 \r
     jobject jDiscoverListener = (jobject) env->NewLocalRef(g_obj_discoverListener);\r
     if (!jDiscoverListener)\r
     {\r
-        LOGE ("Failed to Get jDiscoverListener");\r
-        if (JNI_EDETACHED == envRet) g_jvm_consumer->DetachCurrentThread();\r
+        NS_LOGE ("Failed to Get jDiscoverListener");\r
+        if (JNI_EDETACHED == envRet)\r
+        {\r
+            g_jvm_consumer->DetachCurrentThread();\r
+        }\r
         return ;\r
     }\r
 \r
     jobject obj_provider = getJavaProvider(env, provider);\r
     if (!obj_provider)\r
     {\r
-        LOGE ("Failed to Get Provider Object");\r
-        if (JNI_EDETACHED == envRet) g_jvm_consumer->DetachCurrentThread();\r
+        NS_LOGE ("Failed to Get Provider Object");\r
+        if (JNI_EDETACHED == envRet)\r
+        {\r
+            g_jvm_consumer->DetachCurrentThread();\r
+        }\r
         return ;\r
     }\r
 \r
     jclass cls = env->GetObjectClass(jDiscoverListener);\r
     if (!cls)\r
     {\r
-        LOGE ("Failed to Get ObjectClass for jDiscoverListener");\r
-        if (JNI_EDETACHED == envRet) g_jvm_consumer->DetachCurrentThread();\r
+        NS_LOGE ("Failed to Get ObjectClass for jDiscoverListener");\r
+        if (JNI_EDETACHED == envRet)\r
+        {\r
+            g_jvm_consumer->DetachCurrentThread();\r
+        }\r
         return ;\r
     }\r
     jmethodID mid = env->GetMethodID(\r
@@ -668,47 +672,65 @@ void onDiscoverProvider(OIC::Service::NSProvider *provider)
                         "(Lorg/iotivity/service/ns/consumer/Provider;)V");\r
     if (!mid)\r
     {\r
-        LOGE ("Failed to Get MethodID for onProviderDiscovered");\r
-        if (JNI_EDETACHED == envRet) g_jvm_consumer->DetachCurrentThread();\r
+        NS_LOGE ("Failed to Get MethodID for onProviderDiscovered");\r
+        if (JNI_EDETACHED == envRet)\r
+        {\r
+            g_jvm_consumer->DetachCurrentThread();\r
+        }\r
         return ;\r
     }\r
 \r
     env->CallVoidMethod(jDiscoverListener, mid, obj_provider);\r
 \r
     env->DeleteLocalRef(jDiscoverListener);\r
-    if (JNI_EDETACHED == envRet) g_jvm_consumer->DetachCurrentThread();\r
-    LOGD ("ConsumerService_onDiscoverProvider - OUT");\r
+    if (JNI_EDETACHED == envRet)\r
+    {\r
+        g_jvm_consumer->DetachCurrentThread();\r
+    }\r
+    NS_LOGD ("ConsumerService_onDiscoverProvider - OUT");\r
     return ;\r
 }\r
 \r
 void onProviderState( OIC::Service::NSProviderState state)\r
 {\r
-    LOGD ("ConsumerService_onProviderState -IN");\r
+    NS_LOGD ("ConsumerService_onProviderState -IN");\r
 \r
-    jint envRet;\r
+    jint envRet = 0;;\r
     JNIEnv *env = GetJNIEnv(&envRet);\r
-    if (NULL == env) return ;\r
+    if (NULL == env)\r
+    {\r
+        return ;\r
+    }\r
 \r
     jobject jAcceptListener = (jobject) env->NewLocalRef(g_obj_acceptListener);\r
     if (!jAcceptListener)\r
     {\r
-        LOGE ("Failed to Get jAcceptListener");\r
-        if (JNI_EDETACHED == envRet) g_jvm_consumer->DetachCurrentThread();\r
+        NS_LOGE ("Failed to Get jAcceptListener");\r
+        if (JNI_EDETACHED == envRet)\r
+        {\r
+            g_jvm_consumer->DetachCurrentThread();\r
+        }\r
         return ;\r
     }\r
     jobject obj_state = getJavaProviderState(env, state);\r
     if (!obj_state)\r
     {\r
-        LOGE ("Failed to Get ProviderState Object");\r
-        if (JNI_EDETACHED == envRet) g_jvm_consumer->DetachCurrentThread();\r
+        NS_LOGE ("Failed to Get ProviderState Object");\r
+        if (JNI_EDETACHED == envRet)\r
+        {\r
+            g_jvm_consumer->DetachCurrentThread();\r
+        }\r
         return ;\r
     }\r
 \r
     jclass cls = env->GetObjectClass(jAcceptListener);\r
     if (!cls)\r
     {\r
-        LOGE ("Failed to Get ObjectClass for jAcceptListener");\r
-        if (JNI_EDETACHED == envRet) g_jvm_consumer->DetachCurrentThread();\r
+        NS_LOGE ("Failed to Get ObjectClass for jAcceptListener");\r
+        if (JNI_EDETACHED == envRet)\r
+        {\r
+            g_jvm_consumer->DetachCurrentThread();\r
+        }\r
         return ;\r
     }\r
     jmethodID mid = env->GetMethodID(\r
@@ -717,47 +739,65 @@ void onProviderState( OIC::Service::NSProviderState state)
                         "(Lorg/iotivity/service/ns/consumer/Provider$ProviderState;)V");\r
     if (!mid)\r
     {\r
-        LOGE ("Failed to Get MethodID for onProviderState");\r
-        if (JNI_EDETACHED == envRet) g_jvm_consumer->DetachCurrentThread();\r
+        NS_LOGE ("Failed to Get MethodID for onProviderState");\r
+        if (JNI_EDETACHED == envRet)\r
+        {\r
+            g_jvm_consumer->DetachCurrentThread();\r
+        }\r
         return ;\r
     }\r
     env->CallVoidMethod(jAcceptListener, mid, obj_state);\r
 \r
     env->DeleteLocalRef(jAcceptListener);\r
-    if (JNI_EDETACHED == envRet) g_jvm_consumer->DetachCurrentThread();\r
-    LOGD ("ConsumerService_onProviderState -OUT");\r
+    if (JNI_EDETACHED == envRet)\r
+    {\r
+        g_jvm_consumer->DetachCurrentThread();\r
+    }\r
+    NS_LOGD ("ConsumerService_onProviderState -OUT");\r
     return ;\r
 \r
 }\r
 \r
-void onMessagePosted(OIC::Service::NSMessage *message)\r
+void onMessagePosted(OIC::Service::NSMessage message)\r
 {\r
-    LOGD ("ConsumerService_onMessagePosted -IN");\r
+    NS_LOGD ("ConsumerService_onMessagePosted -IN");\r
 \r
-    jint envRet;\r
+    jint envRet = 0;;\r
     JNIEnv *env = GetJNIEnv(&envRet);\r
-    if (NULL == env) return ;\r
+    if (NULL == env)\r
+    {\r
+        return ;\r
+    }\r
 \r
     jobject jPostListener = (jobject) env->NewLocalRef(g_obj_postListener);\r
     if (!jPostListener)\r
     {\r
-        LOGE ("Failed to Get jPostListener");\r
-        if (JNI_EDETACHED == envRet) g_jvm_consumer->DetachCurrentThread();\r
+        NS_LOGE ("Failed to Get jPostListener");\r
+        if (JNI_EDETACHED == envRet)\r
+        {\r
+            g_jvm_consumer->DetachCurrentThread();\r
+        }\r
         return ;\r
     }\r
 \r
     jobject obj_message = getJavaMessage( env, message);\r
     if (!obj_message)\r
     {\r
-        LOGE ("Failed to Get Message Object");\r
-        if (JNI_EDETACHED == envRet) g_jvm_consumer->DetachCurrentThread();\r
+        NS_LOGE ("Failed to Get Message Object");\r
+        if (JNI_EDETACHED == envRet)\r
+        {\r
+            g_jvm_consumer->DetachCurrentThread();\r
+        }\r
         return ;\r
     }\r
     jclass cls = env->GetObjectClass(jPostListener);\r
     if (!cls)\r
     {\r
-        LOGE ("Failed to Get ObjectClass for jPostListener");\r
-        if (JNI_EDETACHED == envRet) g_jvm_consumer->DetachCurrentThread();\r
+        NS_LOGE ("Failed to Get ObjectClass for jPostListener");\r
+        if (JNI_EDETACHED == envRet)\r
+        {\r
+            g_jvm_consumer->DetachCurrentThread();\r
+        }\r
         return ;\r
     }\r
     jmethodID mid = env->GetMethodID(\r
@@ -766,53 +806,71 @@ void onMessagePosted(OIC::Service::NSMessage *message)
                         "(Lorg/iotivity/service/ns/common/Message;)V");\r
     if (!mid)\r
     {\r
-        LOGE ("Failed to Get MethodID for onMessageReceived");\r
-        if (JNI_EDETACHED == envRet) g_jvm_consumer->DetachCurrentThread();\r
+        NS_LOGE ("Failed to Get MethodID for onMessageReceived");\r
+        if (JNI_EDETACHED == envRet)\r
+        {\r
+            g_jvm_consumer->DetachCurrentThread();\r
+        }\r
         return ;\r
     }\r
 \r
     env->CallVoidMethod(jPostListener, mid, obj_message);\r
 \r
     env->DeleteLocalRef(jPostListener);\r
-    if (JNI_EDETACHED == envRet) g_jvm_consumer->DetachCurrentThread();\r
-    LOGD ("ConsumerService_onMessagePosted -OUT");\r
+    if (JNI_EDETACHED == envRet)\r
+    {\r
+        g_jvm_consumer->DetachCurrentThread();\r
+    }\r
+    NS_LOGD ("ConsumerService_onMessagePosted -OUT");\r
     return ;\r
 }\r
 \r
-void onSyncInfoReceived(OIC::Service::NSSyncInfo *sync)\r
+void onSyncInfoReceived(OIC::Service::NSSyncInfo sync)\r
 {\r
-    LOGD ("ConsumerService_onSyncInfoReceived - IN");\r
+    NS_LOGD ("ConsumerService_onSyncInfoReceived - IN");\r
 \r
-    jint envRet;\r
+    jint envRet = 0;\r
     JNIEnv *env = GetJNIEnv(&envRet);\r
-    if (NULL == env) return ;\r
+    if (NULL == env)\r
+    {\r
+        return ;\r
+    }\r
 \r
     jobject jSyncListener = (jobject) env->NewLocalRef(g_obj_syncListener);\r
     if (!jSyncListener)\r
     {\r
-        LOGE ("Failed to Get jSyncListener");\r
-        if (JNI_EDETACHED == envRet) g_jvm_consumer->DetachCurrentThread();\r
+        NS_LOGE ("Failed to Get jSyncListener");\r
+        if (JNI_EDETACHED == envRet)\r
+        {\r
+            g_jvm_consumer->DetachCurrentThread();\r
+        }\r
         return ;\r
     }\r
 \r
-    LOGD ("Sync ID : %llu\n", sync->getMessageId());\r
-    LOGD ("Sync ProviderId : %s\n", sync->getProviderId().c_str());\r
-    LOGD ("Sync STATE : %d\n", (int) sync->getState());\r
+    NS_LOGD ("Sync ID : %llu\n", sync.getMessageId());\r
+    NS_LOGD ("Sync ProviderId : %s\n", sync.getProviderId().c_str());\r
+    NS_LOGD ("Sync STATE : %d\n", (int) sync.getState());\r
 \r
-    jlong jMessageId = (jlong) sync->getMessageId();\r
-    jstring jProviderId = env->NewStringUTF(sync->getProviderId().c_str());\r
-    jobject syncType = getJavaSyncType(env, sync->getState());\r
+    jlong jMessageId = (jlong) sync.getMessageId();\r
+    jstring jProviderId = env->NewStringUTF(sync.getProviderId().c_str());\r
+    jobject syncType = getJavaSyncType(env, sync.getState());\r
     if (!syncType)\r
     {\r
-        LOGE ("Failed to Get syncType for SyncInfo");\r
-        if (JNI_EDETACHED == envRet) g_jvm_consumer->DetachCurrentThread();\r
+        NS_LOGE ("Failed to Get syncType for SyncInfo");\r
+        if (JNI_EDETACHED == envRet)\r
+        {\r
+            g_jvm_consumer->DetachCurrentThread();\r
+        }\r
         return ;\r
     }\r
     jclass cls_SyncInfo = (jclass) (env->NewLocalRef(g_cls_SyncInfo));\r
     if (!cls_SyncInfo)\r
     {\r
-        LOGE ("Failed to Get ObjectClass for SyncInfo");\r
-        if (JNI_EDETACHED == envRet) g_jvm_consumer->DetachCurrentThread();\r
+        NS_LOGE ("Failed to Get ObjectClass for SyncInfo");\r
+        if (JNI_EDETACHED == envRet)\r
+        {\r
+            g_jvm_consumer->DetachCurrentThread();\r
+        }\r
         return ;\r
     }\r
     jmethodID mid_syncInfo = env->GetMethodID(\r
@@ -821,8 +879,11 @@ void onSyncInfoReceived(OIC::Service::NSSyncInfo *sync)
                                  "(JLjava/lang/String;Lorg/iotivity/service/ns/common/SyncInfo$SyncType;)V");\r
     if (!mid_syncInfo)\r
     {\r
-        LOGE ("Failed to Get MethodID for SyncInfo");\r
-        if (JNI_EDETACHED == envRet) g_jvm_consumer->DetachCurrentThread();\r
+        NS_LOGE ("Failed to Get MethodID for SyncInfo");\r
+        if (JNI_EDETACHED == envRet)\r
+        {\r
+            g_jvm_consumer->DetachCurrentThread();\r
+        }\r
         return ;\r
     }\r
 \r
@@ -830,16 +891,22 @@ void onSyncInfoReceived(OIC::Service::NSSyncInfo *sync)
                                            jMessageId, jProviderId, syncType);\r
     if (!obj_syncInfo)\r
     {\r
-        LOGE ("Failed to Get Object for SyncInfo");\r
-        if (JNI_EDETACHED == envRet) g_jvm_consumer->DetachCurrentThread();\r
+        NS_LOGE ("Failed to Get Object for SyncInfo");\r
+        if (JNI_EDETACHED == envRet)\r
+        {\r
+            g_jvm_consumer->DetachCurrentThread();\r
+        }\r
         return ;\r
     }\r
 \r
     jclass cls = env->GetObjectClass(jSyncListener);\r
     if (!cls)\r
     {\r
-        LOGE ("Failed to Get ObjectClass for jSyncListener");\r
-        if (JNI_EDETACHED == envRet) g_jvm_consumer->DetachCurrentThread();\r
+        NS_LOGE ("Failed to Get ObjectClass for jSyncListener");\r
+        if (JNI_EDETACHED == envRet)\r
+        {\r
+            g_jvm_consumer->DetachCurrentThread();\r
+        }\r
         return ;\r
     }\r
     jmethodID mid = env->GetMethodID(\r
@@ -848,8 +915,11 @@ void onSyncInfoReceived(OIC::Service::NSSyncInfo *sync)
                         "(Lorg/iotivity/service/ns/common/SyncInfo;)V");\r
     if (!mid)\r
     {\r
-        LOGE ("Failed to Get MethodID for onSyncInfoReceived");\r
-        if (JNI_EDETACHED == envRet) g_jvm_consumer->DetachCurrentThread();\r
+        NS_LOGE ("Failed to Get MethodID for onSyncInfoReceived");\r
+        if (JNI_EDETACHED == envRet)\r
+        {\r
+            g_jvm_consumer->DetachCurrentThread();\r
+        }\r
         return ;\r
     }\r
 \r
@@ -857,19 +927,22 @@ void onSyncInfoReceived(OIC::Service::NSSyncInfo *sync)
 \r
     env->DeleteLocalRef(jSyncListener);\r
     env->DeleteLocalRef(cls_SyncInfo);\r
-    if (JNI_EDETACHED == envRet) g_jvm_consumer->DetachCurrentThread();\r
-    LOGD ("ConsumerService_onSyncInfoReceived - OUT");\r
+    if (JNI_EDETACHED == envRet)\r
+    {\r
+        g_jvm_consumer->DetachCurrentThread();\r
+    }\r
+    NS_LOGD ("ConsumerService_onSyncInfoReceived - OUT");\r
     return ;\r
 }\r
 \r
 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeStart\r
 (JNIEnv *env, jobject jObj, jobject jDiscoverListener)\r
 {\r
-    LOGD ("ConsumerService_StartConsumer - IN");\r
+    NS_LOGD ("ConsumerService_StartConsumer - IN");\r
     if (!jDiscoverListener)\r
     {\r
-        ThrowNSException(NS_ERROR, "Listener cannot be null");\r
-        return ;\r
+        ThrowNSException(JNI_INVALID_VALUE, "Listener cannot be null");\r
+        return;\r
     }\r
     if (g_obj_discoverListener != NULL)\r
     {\r
@@ -877,8 +950,15 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nat
     }\r
     g_obj_discoverListener = (jobject) env->NewGlobalRef(jDiscoverListener);\r
 \r
-    OIC::Service::NSConsumerService::getInstance()->start(onDiscoverProvider);\r
-    LOGD ("ConsumerService_StartConsumer - OUT");\r
+    OIC::Service::NSResult result  = OIC::Service::NSConsumerService::getInstance()->start(\r
+                                         onDiscoverProvider);\r
+\r
+    if (result !=  OIC::Service::NSResult::OK)\r
+    {\r
+        ThrowNSException((int) result, "Fail to start ConsumerService");\r
+        return;\r
+    }\r
+    NS_LOGD ("ConsumerService_StartConsumer - OUT");\r
     return;\r
 \r
 }\r
@@ -886,7 +966,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nat
 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeStop\r
 (JNIEnv *env, jobject jObj)\r
 {\r
-    LOGD ("ConsumerService_StopConsumer - IN");\r
+    NS_LOGD ("ConsumerService_StopConsumer - IN");\r
 \r
     env->DeleteGlobalRef(g_obj_postListener);\r
     env->DeleteGlobalRef(g_obj_syncListener);\r
@@ -896,35 +976,87 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nat
     g_obj_syncListener = NULL;\r
     g_obj_discoverListener = NULL;\r
     g_obj_acceptListener = NULL;\r
-    OIC::Service::NSConsumerService::getInstance()->stop();\r
-    LOGD ("ConsumerService_StopConsumer - OUT");\r
+    OIC::Service::NSResult result  = OIC::Service::NSConsumerService::getInstance()->stop();\r
+\r
+    if (result !=  OIC::Service::NSResult::OK)\r
+    {\r
+        ThrowNSException((int) result, "Fail to Stop ConsumerService");\r
+        return;\r
+    }\r
+    NS_LOGD ("ConsumerService_StopConsumer - OUT");\r
     return;\r
 }\r
 \r
-JNIEXPORT jint JNICALL\r
+JNIEXPORT void JNICALL\r
 Java_org_iotivity_service_ns_consumer_ConsumerService_nativeEnableRemoteService\r
 (JNIEnv *env, jobject jObj, jstring jServerAddress)\r
 {\r
-    LOGD ("ConsumerService_EnableRemoteService - IN");\r
+    NS_LOGD ("ConsumerService_EnableRemoteService - IN");\r
     if (!jServerAddress)\r
     {\r
-        ThrowNSException(NS_ERROR, "EnableRemoteService server address NULL");\r
-        return (jint) OIC::Service::NSResult::ERROR;\r
+        ThrowNSException(JNI_INVALID_VALUE, "EnableRemoteService server address NULL");\r
+        return;\r
     }\r
     const char *serverAddress = env->GetStringUTFChars(jServerAddress, 0);\r
-    OIC::Service::NSResult res =\r
+    OIC::Service::NSResult result =\r
         OIC::Service::NSConsumerService::getInstance()->enableRemoteService(std::string(serverAddress));\r
+\r
+    if (result !=  OIC::Service::NSResult::OK)\r
+    {\r
+        ThrowNSException((int) result, "Fail to EnableRemoteService");\r
+        return;\r
+    }\r
     env->ReleaseStringUTFChars(jServerAddress, serverAddress);\r
-    LOGD ("ConsumerService_EnableRemoteService - OUT");\r
-    return (jint) res;\r
+    NS_LOGD ("ConsumerService_EnableRemoteService - OUT");\r
+    return;\r
+}\r
+\r
+JNIEXPORT void JNICALL\r
+Java_org_iotivity_service_ns_consumer_ConsumerService_nativeSubscribeMQService\r
+(JNIEnv *env, jobject jObj, jstring jserverAddress, jstring jTopicName)\r
+{\r
+    NS_LOGD ("ConsumerService: nativeSubscribeMQService - IN");\r
+    if (!jserverAddress)\r
+    {\r
+        ThrowNSException(JNI_INVALID_VALUE, "Server Address Can't be NULL");\r
+        return;\r
+    }\r
+    if (!jTopicName)\r
+    {\r
+        ThrowNSException(JNI_INVALID_VALUE, "TopicName Can't be NULL");\r
+        return;\r
+    }\r
+\r
+    const char *address = env->GetStringUTFChars( jserverAddress, NULL);\r
+    std::string servAddress(address);\r
+    const char *topic = env->GetStringUTFChars( jTopicName, NULL);\r
+    std::string topicName(topic);\r
+\r
+    OIC::Service::NSResult result  =\r
+        OIC::Service::NSConsumerService::getInstance()->subscribeMQService(\r
+            servAddress, topicName);\r
+    if (result !=  OIC::Service::NSResult::OK)\r
+    {\r
+        ThrowNSException((int) result, "Fail to Subscribe to MQ Service");\r
+        return;\r
+    }\r
+    env->ReleaseStringUTFChars(jserverAddress, address);\r
+    env->ReleaseStringUTFChars(jTopicName, topic);\r
+    NS_LOGD ("ConsumerService: nativeSubscribeMQService - OUT");\r
+    return;\r
 }\r
 \r
 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nativeRescanProvider\r
 (JNIEnv *env, jobject jObj)\r
 {\r
-    LOGD ("ConsumerService_RescanProvider - IN");\r
-    OIC::Service::NSConsumerService::getInstance()->rescanProvider();\r
-    LOGD ("ConsumerService_RescanProvider - OUT");\r
+    NS_LOGD ("ConsumerService_RescanProvider - IN");\r
+    OIC::Service::NSResult result  = OIC::Service::NSConsumerService::getInstance()->rescanProvider();\r
+    if (result !=  OIC::Service::NSResult::OK)\r
+    {\r
+        ThrowNSException((int) result, "Fail to RescanProvider");\r
+        return;\r
+    }\r
+    NS_LOGD ("ConsumerService_RescanProvider - OUT");\r
     return;\r
 \r
 }\r
@@ -932,89 +1064,156 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_ConsumerService_nat
 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSubscribe\r
 (JNIEnv *env, jobject jObj)\r
 {\r
-    LOGD ("Provider_Subscribe -IN");\r
+    NS_LOGD ("Provider_Subscribe -IN");\r
+    OIC::Service::NSResult result  = OIC::Service::NSResult::ERROR;\r
     jclass providerClass = env->GetObjectClass(jObj);\r
     if (!providerClass)\r
     {\r
-        ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
+        ThrowNSException(JNI_INVALID_VALUE, "Failed to Get ObjectClass for Provider");\r
         return ;\r
     }\r
 \r
     jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J");\r
     if (!nativeHandle)\r
     {\r
-        ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
+        ThrowNSException(JNI_INVALID_VALUE, "Failed to get nativeHandle for Provider");\r
         return ;\r
     }\r
     jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
     if (jProvider)\r
     {\r
-        LOGD ("calling subscribe on mNativeHandle");\r
-        OIC::Service::NSProvider *provider = (OIC::Service::NSProvider *) (jProvider);\r
-        provider->subscribe();\r
+        NS_LOGD ("calling subscribe on mNativeHandle");\r
+        JniSharedObjectHolder<OIC::Service::NSProvider> *objectHolder =\r
+            reinterpret_cast<JniSharedObjectHolder<OIC::Service::NSProvider> *>(jProvider);\r
+        try\r
+        {\r
+            result  = objectHolder->get()->subscribe();\r
+        }\r
+        catch (OIC::Service::NSException ex)\r
+        {\r
+            ThrowNSException(NATIVE_EXCEPTION, ex.what());\r
+            return;\r
+        }\r
     }\r
     else\r
     {\r
-        OIC::Service::NSProvider *provider = getNativeProvider(env, jObj);\r
-        if (provider == nullptr)\r
+        NS_LOGE ("Couldn't find Provider");\r
+        ThrowNSException(JNI_NO_NATIVE_POINTER, "Fail to find native Provider");\r
+    }\r
+    if (result !=  OIC::Service::NSResult::OK)\r
+    {\r
+        ThrowNSException((int) result, "Fail to Subscribe Provider");\r
+        return;\r
+    }\r
+    NS_LOGD ("Provider_Subscribe -OUT");\r
+    return;\r
+}\r
+\r
+JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeUnsubscribe\r
+(JNIEnv *env, jobject jObj)\r
+{\r
+    NS_LOGD ("Provider_UnSubscribe -IN");\r
+    OIC::Service::NSResult result  = OIC::Service::NSResult::ERROR;\r
+    jclass providerClass = env->GetObjectClass(jObj);\r
+    if (!providerClass)\r
+    {\r
+        ThrowNSException(JNI_INVALID_VALUE, "Failed to Get ObjectClass for Provider");\r
+        return ;\r
+    }\r
+\r
+    jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J");\r
+    if (!nativeHandle)\r
+    {\r
+        ThrowNSException(JNI_INVALID_VALUE, "Failed to get nativeHandle for Provider");\r
+        return ;\r
+    }\r
+    jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
+    if (jProvider)\r
+    {\r
+        NS_LOGD ("calling subscribe on mNativeHandle");\r
+        JniSharedObjectHolder<OIC::Service::NSProvider> *objectHolder =\r
+            reinterpret_cast<JniSharedObjectHolder<OIC::Service::NSProvider> *>(jProvider);\r
+        try\r
+        {\r
+            result  = objectHolder->get()->unsubscribe();\r
+        }\r
+        catch (OIC::Service::NSException ex)\r
         {\r
-            ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
+            ThrowNSException(NATIVE_EXCEPTION, ex.what());\r
             return;\r
         }\r
-        LOGD ("calling subscribe on ProviderID");\r
-        provider->subscribe();\r
     }\r
-    LOGD ("Provider_Subscribe -OUT");\r
+    else\r
+    {\r
+        NS_LOGE ("Couldn't find Provider");\r
+        ThrowNSException(JNI_NO_NATIVE_POINTER, "Fail to find native Provider");\r
+    }\r
+    if (result !=  OIC::Service::NSResult::OK)\r
+    {\r
+        ThrowNSException((int) result, "Fail to UnSubscribe Provider");\r
+        return;\r
+    }\r
+    NS_LOGD ("Provider_UnSubscribe -OUT");\r
     return;\r
 }\r
 \r
 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSendSyncInfo\r
 (JNIEnv *env, jobject jObj, jlong jMessageId, jint jSyncType)\r
 {\r
-    LOGD ("Provider_SendSyncInfo - IN");\r
+    NS_LOGD ("Provider_SendSyncInfo - IN");\r
+    OIC::Service::NSResult result  = OIC::Service::NSResult::ERROR;\r
     if (!jMessageId)\r
     {\r
-        ThrowNSException(NS_ERROR, "MessageId cannot be 0");\r
+        ThrowNSException(JNI_INVALID_VALUE, "MessageId cannot be 0");\r
         return ;\r
     }\r
 \r
     jclass providerClass = env->GetObjectClass(jObj);\r
     if (!providerClass)\r
     {\r
-        ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
+        ThrowNSException(JNI_INVALID_VALUE, "Failed to Get ObjectClass for Provider");\r
         return ;\r
     }\r
 \r
     jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J");\r
     if (!nativeHandle)\r
     {\r
-        ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
+        ThrowNSException(JNI_INVALID_VALUE, "Failed to get nativeHandle for Provider");\r
         return ;\r
     }\r
     uint64_t messageId = (uint64_t) jMessageId;\r
 \r
-    LOGD("!!!!!!jMessageId: %lld", jMessageId);\r
-    LOGD("!!!!!!messageId: %lld", messageId);\r
+    NS_LOGD ("!!!!!!jMessageId: %lld", jMessageId);\r
+    NS_LOGD ("!!!!!!messageId: %lld", messageId);\r
 \r
     jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
     if (jProvider)\r
     {\r
-        LOGD ("calling SendSyncInfo on mNativeHandle");\r
-        OIC::Service::NSProvider *provider = (OIC::Service::NSProvider *) (jProvider);\r
-        provider->sendSyncInfo(messageId, (OIC::Service::NSSyncInfo::NSSyncType)jSyncType);\r
-    }\r
-    else\r
-    {\r
-        OIC::Service::NSProvider *provider = getNativeProvider(env, jObj);\r
-        if (provider == nullptr)\r
+        NS_LOGD ("calling SendSyncInfo on mNativeHandle");\r
+        JniSharedObjectHolder<OIC::Service::NSProvider> *objectHolder =\r
+            reinterpret_cast<JniSharedObjectHolder<OIC::Service::NSProvider> *>(jProvider);\r
+        try\r
         {\r
-            ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
+            result  = objectHolder->get()->sendSyncInfo(messageId,\r
+                      (OIC::Service::NSSyncInfo::NSSyncType)jSyncType);\r
+        }\r
+        catch (OIC::Service::NSException ex)\r
+        {\r
+            ThrowNSException(NATIVE_EXCEPTION, ex.what());\r
             return;\r
         }\r
-        LOGD ("calling SendSyncInfo on ProviderID");\r
-        provider->sendSyncInfo(messageId, (OIC::Service::NSSyncInfo::NSSyncType)jSyncType);\r
     }\r
-    LOGD ("Provider_SendSyncInfo - OUT");\r
+    else\r
+    {\r
+        NS_LOGE ("Couldn't find Provider");\r
+        ThrowNSException(JNI_NO_NATIVE_POINTER, "Fail to find native Provider");\r
+    }\r
+    if (result !=  OIC::Service::NSResult::OK)\r
+    {\r
+        ThrowNSException((int) result, "Fail to Send sync info");\r
+        return;\r
+    }\r
+    NS_LOGD ("Provider_SendSyncInfo - OUT");\r
     return;\r
 }\r
 \r
@@ -1022,30 +1221,30 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSend
 JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSetListener\r
 (JNIEnv *env, jobject jObj, jobject jAcceptListener, jobject jPostListener, jobject jSyncListener)\r
 {\r
-    LOGD ("Provider_SetListener - IN");\r
+    NS_LOGD ("Provider_SetListener - IN");\r
     if (!jPostListener || !jSyncListener || !jAcceptListener)\r
     {\r
-        ThrowNSException(NS_ERROR, "Listener cannot be null");\r
+        ThrowNSException(JNI_INVALID_VALUE, "Listener cannot be null");\r
         return ;\r
     }\r
 \r
     jclass providerClass = env->GetObjectClass(jObj);\r
     if (!providerClass)\r
     {\r
-        ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
+        ThrowNSException(JNI_INVALID_VALUE, "Failed to Get ObjectClass for Provider");\r
         return ;\r
     }\r
 \r
     jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J");\r
     if (!nativeHandle)\r
     {\r
-        ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
+        ThrowNSException(JNI_INVALID_VALUE, "Failed to get nativeHandle for Provider");\r
         return ;\r
     }\r
     jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
     if (jProvider)\r
     {\r
-        LOGD ("calling SetListener on mNativeHandle");\r
+        NS_LOGD ("calling SetListener on mNativeHandle");\r
         if (g_obj_acceptListener != NULL)\r
         {\r
             env->DeleteGlobalRef(g_obj_acceptListener);\r
@@ -1062,234 +1261,248 @@ JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeSetL
         g_obj_postListener = (jobject) env->NewGlobalRef(jPostListener);\r
         g_obj_syncListener = (jobject) env->NewGlobalRef(jSyncListener);\r
 \r
-        OIC::Service::NSProvider *provider = (OIC::Service::NSProvider *) (jProvider);\r
-        provider->setListener(onProviderState, onMessagePosted, onSyncInfoReceived);\r
+        JniSharedObjectHolder<OIC::Service::NSProvider> *objectHolder =\r
+            reinterpret_cast<JniSharedObjectHolder<OIC::Service::NSProvider> *>(jProvider);\r
+        objectHolder->get()->setListener(onProviderState, onMessagePosted, onSyncInfoReceived);\r
     }\r
     else\r
     {\r
-        OIC::Service::NSProvider *provider = getNativeProvider(env, jObj);\r
-        if (provider == nullptr)\r
-        {\r
-            ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
-            return;\r
-        }\r
-        LOGD ("calling SetListener on ProviderID");\r
-        if (g_obj_acceptListener != NULL)\r
-        {\r
-            env->DeleteGlobalRef(g_obj_acceptListener);\r
-        }\r
-        if (g_obj_postListener != NULL)\r
-        {\r
-            env->DeleteGlobalRef(g_obj_postListener);\r
-        }\r
-        if (g_obj_syncListener != NULL)\r
-        {\r
-            env->DeleteGlobalRef(g_obj_syncListener);\r
-        }\r
-        g_obj_acceptListener = (jobject) env->NewGlobalRef(jAcceptListener);\r
-        g_obj_postListener = (jobject) env->NewGlobalRef(jPostListener);\r
-        g_obj_syncListener = (jobject) env->NewGlobalRef(jSyncListener);\r
-\r
-        provider->setListener(onProviderState, onMessagePosted, onSyncInfoReceived);\r
+        NS_LOGE ("Couldn't find Provider");\r
+        ThrowNSException(JNI_NO_NATIVE_POINTER, "Fail to find native Provider");\r
     }\r
-    LOGD ("Provider_SetListener - OUT");\r
+    NS_LOGD ("Provider_SetListener - OUT");\r
     return;\r
 }\r
 \r
 JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeGetTopicList\r
 (JNIEnv *env, jobject jObj)\r
 {\r
-    LOGD("Provider_nativeGetTopicList - IN");\r
+    NS_LOGD ("Provider_nativeGetTopicList - IN");\r
     jclass providerClass = env->GetObjectClass(jObj);\r
     if (!providerClass)\r
     {\r
-        ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
+        ThrowNSException(JNI_INVALID_VALUE, "Failed to Get ObjectClass for Provider");\r
         return NULL;\r
     }\r
 \r
     jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J");\r
     if (!nativeHandle)\r
     {\r
-        ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
+        ThrowNSException(JNI_INVALID_VALUE, "Failed to get nativeHandle for Provider");\r
         return NULL;\r
     }\r
     jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
-    OIC::Service::NSTopicsList *topicList;\r
+    std::shared_ptr<OIC::Service::NSTopicsList> topicList = nullptr;\r
     if (jProvider)\r
     {\r
-        LOGD ("calling subscribe on mNativeHandle");\r
-        OIC::Service::NSProvider *provider = (OIC::Service::NSProvider *) (jProvider);\r
-        topicList = provider->getTopicList();\r
-    }\r
-    else\r
-    {\r
-        OIC::Service::NSProvider *provider = getNativeProvider(env, jObj);\r
-        if (provider == nullptr)\r
+        NS_LOGD ("calling subscribe on mNativeHandle");\r
+        JniSharedObjectHolder<OIC::Service::NSProvider> *objectHolder =\r
+            reinterpret_cast<JniSharedObjectHolder<OIC::Service::NSProvider> *>(jProvider);\r
+        try\r
         {\r
-            ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
+            topicList = objectHolder->get()->getTopicList();\r
+        }\r
+        catch (OIC::Service::NSException ex)\r
+        {\r
+            ThrowNSException(NATIVE_EXCEPTION, ex.what());\r
             return NULL;\r
         }\r
-        LOGD ("calling subscribe on ProviderID");\r
-        topicList = provider->getTopicList();\r
+    }\r
+    else\r
+    {\r
+        NS_LOGE ("Couldn't find Provider");\r
+        ThrowNSException(JNI_NO_NATIVE_POINTER, "Fail to find native Provider");\r
     }\r
     if (topicList == nullptr)\r
     {\r
-        ThrowNSException(NS_ERROR, "Topic List doesn't exist");\r
+        ThrowNSException(JNI_INVALID_VALUE, "Topic List doesn't exist");\r
         return NULL;\r
     }\r
 \r
     jobject obj_topicList = getJavaTopicsList(env, topicList);\r
 \r
-    LOGD("Provider_nativeGetTopicList - OUT");\r
+    NS_LOGD ("Provider_nativeGetTopicList - OUT");\r
     return obj_topicList;\r
 }\r
 \r
-JNIEXPORT jint JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeUpdateTopicList\r
+JNIEXPORT void JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeUpdateTopicList\r
 (JNIEnv *env, jobject jObj, jobject jTopicsList)\r
 {\r
-    LOGD("Provider_nativeUpdateTopicList -IN");\r
+    NS_LOGD ("Provider_nativeUpdateTopicList -IN");\r
     if (!jTopicsList)\r
     {\r
-        LOGI("Fail to update Interest Topics - Topic List is null");\r
-        ThrowNSException(NS_ERROR, "TopicList cannot be null");\r
-        return (jint) OIC::Service::NSResult::ERROR;\r
+        ThrowNSException(JNI_INVALID_VALUE, "TopicList cannot be null");\r
+        return;\r
     }\r
-    OIC::Service::NSTopicsList *nsTopicsList = getNativeTopicsList(env, jTopicsList);\r
+    std::shared_ptr<OIC::Service::NSTopicsList> nsTopicsList = getNativeTopicsList(env, jTopicsList);\r
     if (nsTopicsList == nullptr)\r
     {\r
-        ThrowNSException(NS_ERROR, "NSTopicList cannot be created ");\r
-        return (jint) OIC::Service::NSResult::ERROR;\r
+        ThrowNSException(JNI_INVALID_VALUE, "NSTopicList cannot be created ");\r
+        return;\r
     }\r
 \r
     jclass providerClass = env->GetObjectClass(jObj);\r
     if (!providerClass)\r
     {\r
-        ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
-        return  (jint) OIC::Service::NSResult::ERROR;\r
+        ThrowNSException(JNI_INVALID_VALUE, "Failed to Get ObjectClass for Provider");\r
+        return;\r
     }\r
 \r
     jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J");\r
     if (!nativeHandle)\r
     {\r
-        ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
-        return  (jint) OIC::Service::NSResult::ERROR;\r
+        ThrowNSException(JNI_INVALID_VALUE, "Failed to get nativeHandle for Provider");\r
+        return;\r
     }\r
     jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
-    OIC::Service::NSResult result;\r
+    OIC::Service::NSResult result = OIC::Service::NSResult::ERROR;\r
     if (jProvider)\r
     {\r
-        LOGD ("calling subscribe on mNativeHandle");\r
-        OIC::Service::NSProvider *provider = (OIC::Service::NSProvider *) (jProvider);\r
-        result = provider->updateTopicList(nsTopicsList);\r
+        NS_LOGD ("calling subscribe on mNativeHandle");\r
+        JniSharedObjectHolder<OIC::Service::NSProvider> *objectHolder =\r
+            reinterpret_cast<JniSharedObjectHolder<OIC::Service::NSProvider> *>(jProvider);\r
+        try\r
+        {\r
+            result = objectHolder->get()->updateTopicList(nsTopicsList);\r
+        }\r
+        catch (OIC::Service::NSException ex)\r
+        {\r
+            ThrowNSException(NATIVE_EXCEPTION, ex.what());\r
+            return;\r
+        }\r
     }\r
     else\r
     {\r
-        OIC::Service::NSProvider *provider = getNativeProvider(env, jObj);\r
-        if (provider == nullptr)\r
-        {\r
-            ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
-            return (jint) OIC::Service::NSResult::ERROR;\r
-        }\r
-        LOGD ("calling subscribe on ProviderID");\r
-        result = provider->updateTopicList(nsTopicsList);\r
+        NS_LOGE ("Couldn't find Provider");\r
+        ThrowNSException(JNI_NO_NATIVE_POINTER, "Fail to find native Provider");\r
     }\r
     if (result !=  OIC::Service::NSResult::OK)\r
     {\r
-        LOGI("Fail to Update Interest Topics");\r
+        ThrowNSException((int) result, "Fail to Update Interest Topics");\r
+        return;\r
     }\r
-    LOGD("Provider_nativeUpdateTopicList -OUT");\r
-    return (jint) result;\r
+    NS_LOGD ("Provider_nativeUpdateTopicList -OUT");\r
+    return;\r
 }\r
 \r
 JNIEXPORT jobject JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeGetProviderState\r
 (JNIEnv *env, jobject jObj)\r
 {\r
-    LOGD("Provider_nativeGetProviderState - IN");\r
+    NS_LOGD ("Provider_nativeGetProviderState - IN");\r
     jclass providerClass = env->GetObjectClass(jObj);\r
     if (!providerClass)\r
     {\r
-        ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
+        ThrowNSException(JNI_INVALID_VALUE, "Failed to Get ObjectClass for Provider");\r
         return NULL;\r
     }\r
 \r
     jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J");\r
     if (!nativeHandle)\r
     {\r
-        ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
+        ThrowNSException(JNI_INVALID_VALUE, "Failed to get nativeHandle for Provider");\r
         return NULL;\r
     }\r
     jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
-    OIC::Service::NSProviderState state;\r
+    OIC::Service::NSProviderState state = OIC::Service::NSProviderState::DENY;\r
     if (jProvider)\r
     {\r
-        LOGD ("calling getProviderState on mNativeHandle");\r
-        OIC::Service::NSProvider *provider = (OIC::Service::NSProvider *) (jProvider);\r
-        state = provider->getProviderState();\r
-    }\r
-    else\r
-    {\r
-        OIC::Service::NSProvider *provider = getNativeProvider(env, jObj);\r
-        if (provider == nullptr)\r
+        NS_LOGD ("calling getProviderState on mNativeHandle");\r
+        JniSharedObjectHolder<OIC::Service::NSProvider> *objectHolder =\r
+            reinterpret_cast<JniSharedObjectHolder<OIC::Service::NSProvider> *>(jProvider);\r
+        try\r
+        {\r
+            state = objectHolder->get()->getProviderState();\r
+        }\r
+        catch (OIC::Service::NSException ex)\r
         {\r
-            ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
+            ThrowNSException(NATIVE_EXCEPTION, ex.what());\r
             return NULL;\r
         }\r
-        LOGD ("calling getProviderState on ProviderID");\r
-        state = provider->getProviderState();\r
+    }\r
+    else\r
+    {\r
+        NS_LOGE ("Couldn't find Provider");\r
+        ThrowNSException(JNI_NO_NATIVE_POINTER, "Fail to find native Provider");\r
     }\r
     jobject obj_state = getJavaProviderState(env, state);\r
 \r
-    LOGD("Provider_nativeGetProviderState - OUT");\r
+    NS_LOGD ("Provider_nativeGetProviderState - OUT");\r
     return obj_state;\r
 }\r
 \r
 JNIEXPORT jboolean JNICALL Java_org_iotivity_service_ns_consumer_Provider_nativeIsSubscribed\r
 (JNIEnv *env, jobject jObj)\r
 {\r
-    LOGD("nativeIsSubscribed - IN");\r
+    NS_LOGD ("nativeIsSubscribed - IN");\r
     jclass providerClass = env->GetObjectClass(jObj);\r
     if (!providerClass)\r
     {\r
-        ThrowNSException(NS_ERROR, "Failed to Get ObjectClass for Provider");\r
+        ThrowNSException(JNI_INVALID_VALUE, "Failed to Get ObjectClass for Provider");\r
         return (jboolean)false;\r
     }\r
 \r
     jfieldID nativeHandle = env->GetFieldID(providerClass, "mNativeHandle", "J");\r
     if (!nativeHandle)\r
     {\r
-        ThrowNSException(NS_ERROR, "Failed to get nativeHandle for Provider");\r
+        ThrowNSException(JNI_INVALID_VALUE, "Failed to get nativeHandle for Provider");\r
         return (jboolean)false;\r
     }\r
     jlong jProvider = env->GetLongField(jObj, nativeHandle);\r
     if (jProvider)\r
     {\r
-        LOGD ("calling isSubscribe on mNativeHandle");\r
-        OIC::Service::NSProvider *provider = (OIC::Service::NSProvider *) (jProvider);\r
-        return (jboolean) provider->isSubscribed();\r
-    }\r
-    else\r
-    {\r
-        OIC::Service::NSProvider *provider = getNativeProvider(env, jObj);\r
-        if (provider == nullptr)\r
+        NS_LOGD ("calling isSubscribe on mNativeHandle");\r
+        JniSharedObjectHolder<OIC::Service::NSProvider> *objectHolder =\r
+            reinterpret_cast<JniSharedObjectHolder<OIC::Service::NSProvider> *>(jProvider);\r
+        try\r
+        {\r
+            return (jboolean) objectHolder->get()->isSubscribed();\r
+        }\r
+        catch (OIC::Service::NSException ex)\r
         {\r
-            ThrowNSException(NS_ERROR, "Provider with Given Id doesn't exist");\r
+            ThrowNSException(NATIVE_EXCEPTION, ex.what());\r
             return (jboolean)false;\r
         }\r
-        LOGD ("calling isSubscribe on ProviderID");\r
-        return (jboolean) provider->isSubscribed();\r
+    }\r
+    else\r
+    {\r
+        NS_LOGE ("Couldn't find Provider");\r
+        ThrowNSException(JNI_NO_NATIVE_POINTER, "Fail to find native Provider");\r
     }\r
 }\r
 \r
+JNIEXPORT void JNICALL\r
+Java_org_iotivity_service_ns_consumer_Provider_nativeDispose\r
+(JNIEnv *env, jobject object)\r
+{\r
+    jclass cls_provider = (jclass) (env->NewLocalRef(g_cls_Provider));\r
+    if (!cls_provider)\r
+    {\r
+        NS_LOGE ("Failed to Get ObjectClass for Provider");\r
+        return;\r
+    }\r
+    jfieldID nativeHandle = env->GetFieldID(cls_provider, "mNativeHandle", "J");\r
+    if (!nativeHandle)\r
+    {\r
+        NS_LOGE ("Failed to get nativeHandle for Provider");\r
+        return;\r
+    }\r
+    jlong handle = env->GetLongField(object, nativeHandle);\r
+    JniSharedObjectHolder<OIC::Service::NSProvider> *objectHolder =\r
+        reinterpret_cast<JniSharedObjectHolder<OIC::Service::NSProvider> *>(handle);\r
+    delete objectHolder;\r
+    return;\r
+}\r
+\r
 // JNI OnLoad\r
 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)\r
 {\r
-    LOGD("ConsumerService_JNI_OnLoad");\r
+    NS_LOGD ("ConsumerService_JNI_OnLoad");\r
     g_jvm_consumer = jvm;\r
 \r
-    JNIEnv *env;\r
+    JNIEnv *env = NULL;\r
     if (jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)\r
     {\r
-        LOGE("Failed to get the environment using GetEnv()");\r
+        NS_LOGE ("Failed to get the environment using GetEnv()");\r
         return JNI_ERR;\r
     }\r
 \r
@@ -1297,13 +1510,13 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)
                               "org/iotivity/service/ns/common/Message");\r
     if (!localMessage)\r
     {\r
-        LOGE("Failed to get local Message class");\r
+        NS_LOGE ("Failed to get local Message class");\r
         return JNI_ERR;\r
     }\r
     g_cls_Message = (jclass) (env->NewGlobalRef(localMessage));\r
     if (!g_cls_Message)\r
     {\r
-        LOGE("Failed to set Global Message reference");\r
+        NS_LOGE ("Failed to set Global Message reference");\r
         return JNI_ERR;\r
     }\r
 \r
@@ -1311,13 +1524,13 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)
                                "org/iotivity/service/ns/consumer/Provider");\r
     if (!localProvider)\r
     {\r
-        LOGE("Failed to get local Provider class");\r
+        NS_LOGE ("Failed to get local Provider class");\r
         return JNI_ERR;\r
     }\r
     g_cls_Provider = (jclass) (env->NewGlobalRef(localProvider));\r
     if (!g_cls_Provider)\r
     {\r
-        LOGE("Failed to set Global Provider reference");\r
+        NS_LOGE ("Failed to set Global Provider reference");\r
         return JNI_ERR;\r
     }\r
 \r
@@ -1325,13 +1538,13 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)
                                "org/iotivity/service/ns/common/SyncInfo");\r
     if (!localSyncInfo)\r
     {\r
-        LOGE("Failed to get local SyncInfo class");\r
+        NS_LOGE ("Failed to get local SyncInfo class");\r
         return JNI_ERR;\r
     }\r
     g_cls_SyncInfo = (jclass) (env->NewGlobalRef(localSyncInfo));\r
     if (!g_cls_SyncInfo)\r
     {\r
-        LOGE("Failed to set Global NSSyncInfo reference");\r
+        NS_LOGE ("Failed to set Global NSSyncInfo reference");\r
         return JNI_ERR;\r
     }\r
 \r
@@ -1339,13 +1552,13 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)
                                "org/iotivity/service/ns/common/SyncInfo$SyncType");\r
     if (!localSyncType)\r
     {\r
-        LOGE("Failed to get local SyncType enum");\r
+        NS_LOGE ("Failed to get local SyncType enum");\r
         return JNI_ERR;\r
     }\r
     g_cls_SyncType = (jclass) (env->NewGlobalRef(localSyncType));\r
     if (!g_cls_SyncType)\r
     {\r
-        LOGE("Failed to set Global SyncType reference");\r
+        NS_LOGE ("Failed to set Global SyncType reference");\r
         return JNI_ERR;\r
     }\r
 \r
@@ -1353,26 +1566,26 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)
                                     "org/iotivity/service/ns/common/MediaContents");\r
     if (!localMediaContents)\r
     {\r
-        LOGE("Failed to get local MediaContents class");\r
+        NS_LOGE ("Failed to get local MediaContents class");\r
         return JNI_ERR;\r
     }\r
     g_cls_MediaContents = (jclass) (env->NewGlobalRef(localMediaContents));\r
     if (!g_cls_MediaContents)\r
     {\r
-        LOGE("Failed to set Global MediaContents reference");\r
+        NS_LOGE ("Failed to set Global MediaContents reference");\r
         return JNI_ERR;\r
     }\r
     jclass localTopicState = env->FindClass(\r
                                  "org/iotivity/service/ns/common/Topic$TopicState");\r
     if (!localTopicState)\r
     {\r
-        LOGE("Failed to get local TopicState enum");\r
+        NS_LOGE ("Failed to get local TopicState enum");\r
         return JNI_ERR;\r
     }\r
     g_cls_TopicState = (jclass) (env->NewGlobalRef(localTopicState));\r
     if (!g_cls_TopicState)\r
     {\r
-        LOGE("Failed to set Global TopicState reference");\r
+        NS_LOGE ("Failed to set Global TopicState reference");\r
         return JNI_ERR;\r
     }\r
 \r
@@ -1380,13 +1593,13 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)
                             "org/iotivity/service/ns/common/Topic");\r
     if (!localTopic)\r
     {\r
-        LOGE("Failed to get local TopicState enum");\r
+        NS_LOGE ("Failed to get local TopicState enum");\r
         return JNI_ERR;\r
     }\r
     g_cls_Topic = (jclass) (env->NewGlobalRef(localTopic));\r
     if (!g_cls_Topic)\r
     {\r
-        LOGE("Failed to set Global Topic reference");\r
+        NS_LOGE ("Failed to set Global Topic reference");\r
         return JNI_ERR;\r
     }\r
 \r
@@ -1394,13 +1607,13 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)
                                   "org/iotivity/service/ns/common/Message$MessageType");\r
     if (!localMessageType)\r
     {\r
-        LOGE("Failed to get local Message Type class");\r
+        NS_LOGE ("Failed to get local Message Type class");\r
         return JNI_ERR;\r
     }\r
     g_cls_Message_Type = (jclass) (env->NewGlobalRef(localMessageType));\r
     if (!g_cls_Message_Type)\r
     {\r
-        LOGE("Failed to set Global Message Type reference");\r
+        NS_LOGE ("Failed to set Global Message Type reference");\r
         return JNI_ERR;\r
     }\r
 \r
@@ -1408,13 +1621,13 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)
                                     "org/iotivity/service/ns/consumer/Provider$ProviderState");\r
     if (!localProviderState)\r
     {\r
-        LOGE("Failed to get localProviderState  Type class");\r
+        NS_LOGE ("Failed to get localProviderState  Type class");\r
         return JNI_ERR;\r
     }\r
     g_cls_ProviderState = (jclass) (env->NewGlobalRef(localProviderState));\r
     if (!g_cls_ProviderState)\r
     {\r
-        LOGE("Failed to set Global ProviderState Type reference");\r
+        NS_LOGE ("Failed to set Global ProviderState Type reference");\r
         return JNI_ERR;\r
     }\r
 \r
@@ -1422,33 +1635,33 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)
                                  "org/iotivity/service/ns/common/TopicsList");\r
     if (!localTopicsList)\r
     {\r
-        LOGE("Failed to get local Topic class");\r
+        NS_LOGE ("Failed to get local Topic class");\r
         return JNI_ERR;\r
     }\r
     g_cls_TopicsList = (jclass) (env->NewGlobalRef(localTopicsList));\r
     if (!g_cls_TopicsList)\r
     {\r
-        LOGE("Failed to set Global TopicsList reference");\r
+        NS_LOGE ("Failed to set Global TopicsList reference");\r
         return JNI_ERR;\r
     }\r
     //OcRepresentation\r
     jclass localOcRepresentation = env->FindClass("org/iotivity/base/OcRepresentation");\r
     if (!localOcRepresentation)\r
     {\r
-        LOGE("Failed to get local OcRepresentation class");\r
+        NS_LOGE ("Failed to get local OcRepresentation class");\r
         return JNI_ERR;\r
     }\r
     g_cls_OcRepresentation = (jclass) env->NewGlobalRef(localOcRepresentation);\r
     if (!g_cls_OcRepresentation)\r
     {\r
-        LOGE("Failed to set Global OcRepresentation reference");\r
+        NS_LOGE ("Failed to set Global OcRepresentation reference");\r
         return JNI_ERR;\r
     }\r
 \r
     g_mid_OcRepresentation_N_ctor_bool = env->GetMethodID(g_cls_OcRepresentation, "<init>", "(JZ)V");\r
     if (!g_mid_OcRepresentation_N_ctor_bool)\r
     {\r
-        LOGE("Failed to get Global OcRepresentation Constructor reference");\r
+        NS_LOGE ("Failed to get Global OcRepresentation Constructor reference");\r
         return JNI_ERR;\r
     }\r
 \r
@@ -1469,12 +1682,12 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)
 \r
 JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *jvm, void *reserved)\r
 {\r
-    LOGI("ConsumerService_JNI_OnUnload");\r
-    JNIEnv *env;\r
+    NS_LOGI ("ConsumerService_JNI_OnUnload");\r
+    JNIEnv *env = NULL;\r
 \r
     if (jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)\r
     {\r
-        LOGE("Failed to get the environment using GetEnv()");\r
+        NS_LOGE ("Failed to get the environment using GetEnv()");\r
         return ;\r
     }\r
 \r