+//******************************************************************\r
//\r
-// Created by jaesick.shin on 2016-04-26.\r
+// Copyright 2016 Samsung Electronics All Rights Reserved.\r
//\r
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+//\r
+// Licensed under the Apache License, Version 2.0 (the "License");\r
+// you may not use this file except in compliance with the License.\r
+// You may obtain a copy of the License at\r
+//\r
+// http://www.apache.org/licenses/LICENSE-2.0\r
+//\r
+// Unless required by applicable law or agreed to in writing, software\r
+// distributed under the License is distributed on an "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+// See the License for the specific language governing permissions and\r
+// limitations under the License.\r
+//\r
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
\r
#include <android/log.h>\r
#include <stdio.h>\r
#define LOGE(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)\r
\r
static JavaVM *g_jvm = NULL;\r
-static jobject g_obj = NULL;\r
+static jobject g_obj_subscriptionListener = NULL;\r
+static jobject g_obj_syncListener = NULL;\r
\r
JNIEXPORT jint JNI_OnLoad(JavaVM *jvm, void *reserved)\r
{\r
}\r
\r
JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSStartProvider(\r
- JNIEnv * env, jobject jObj, jboolean jAccess)\r
+ JNIEnv * env, jobject jObj, jboolean jAccess, jobject jSubscriptionListener,\r
+ jobject jSyncListener)\r
{\r
- LOGI("JNI TEST - NSStartProvider...");\r
+ LOGI("NSStartProvider...");\r
\r
- g_obj = jObj;\r
+ if (!jSubscriptionListener || !jSyncListener)\r
+ {\r
+ LOGI("Fail to set listeners");\r
+ //return (jint) NS_ERROR;\r
+ }\r
\r
- //JNIlogPrintedCallback(env, jObj, "NSStartProvider");\r
+ g_obj_subscriptionListener = (jobject) (*env)->NewGlobalRef(env, jSubscriptionListener);\r
+ g_obj_syncListener = (jobject) (*env)->NewGlobalRef(env, jSyncListener);\r
\r
+ // check access policy\r
NSAccessPolicy access = NS_ACCEPTER_PROVIDER;\r
- if(NSStartProvider(access, NSSubscribeRequestCb, NSSyncCb) == 0)\r
- {\r
- LOGI("JNI TEST - Success to start NSProvider service");\r
- }\r
- else\r
+\r
+ if (NSStartProvider(access, NSSubscribeRequestCb, NSSyncCb) != NS_OK)\r
{\r
- LOGE("JNI TEST - Fail to start NSProvider service");\r
+ LOGE("Fail to start NSProvider service");\r
+ return (jint) NS_ERROR;\r
}\r
- //NSStartProvider(access, NULL, NULL);\r
\r
- return 0;\r
+ return (jint) NS_OK;\r
}\r
\r
JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSStopProvider(\r
JNIEnv * env, jobject jObj)\r
{\r
- LOGI("JNI TEST - NSStopProvider");\r
- return NSStopProvider();\r
+ LOGI("NSStopProvider");\r
\r
- return 0;\r
+ (*env)->DeleteGlobalRef(env, g_obj_subscriptionListener);\r
+ (*env)->DeleteGlobalRef(env, g_obj_syncListener);\r
+\r
+ if (NSStopProvider() != NS_OK)\r
+ {\r
+ LOGE("Fail to stop NSProvider service");\r
+ return (jint) NS_ERROR;\r
+ }\r
+\r
+ return (jint) NS_OK;\r
}\r
\r
JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSSendNotification(\r
JNIEnv * env, jobject jObj, jobject jMsg)\r
{\r
- LOGI("JNI TEST - NSSendNotification");\r
-\r
-// bool isAttached = false;\r
-// //JNIEnv* env;\r
-// jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);\r
-// if (JNI_OK != res)\r
-// {\r
-// LOGI("AttachCurrentThread for JNIEnv pointer");\r
-// res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);\r
-//\r
-// if (JNI_OK != res)\r
-// {\r
-// LOGE("AttachCurrentThread has failed");\r
-// return -1;\r
-// }\r
-// isAttached = true;\r
-// }\r
-\r
- jclass cls = (*env)->GetObjectClass(env, jMsg);\r
-\r
- // Message ID\r
- jfieldID fid_id = (*env)->GetFieldID(env, cls, "id", "Ljava/lang/String;");\r
- if (fid_id == NULL)\r
- {\r
- LOGI("JNI TEST - Error: jfieldID for message id is null");\r
- return 0;\r
- }\r
- jstring jmsgId = (*env)->GetObjectField(env, jMsg, fid_id);\r
- const char * messageId = (*env)->GetStringUTFChars(env, jmsgId, NULL);\r
- if (messageId == NULL)\r
- {\r
- printf("JNI TEST - Error: messageId is null\n");\r
- return 0;\r
- }\r
- LOGI("JNI TEST - Message ID: %s\n", messageId);\r
- JNIlogPrintedCallback(env, jObj, messageId);\r
-\r
- (*env)->ReleaseStringUTFChars(env, jmsgId, messageId);\r
+ LOGI("NSSendNotification");\r
\r
- // Message Title\r
- jfieldID fid_title = (*env)->GetFieldID(env, cls, "title", "Ljava/lang/String;");\r
- if (fid_title == NULL)\r
+ if (!jMsg)\r
{\r
- LOGE("JNI TEST - Error: jfieldID for message id is null");\r
- return 0;\r
+ LOGI("Fail to send notification - Message is null");\r
+ return (jint) NS_ERROR;\r
}\r
- jstring jmsgTitle = (*env)->GetObjectField(env, jMsg, fid_title);\r
- const char * messageTitle = (*env)->GetStringUTFChars(env, jmsgTitle, NULL);\r
- if (messageTitle == NULL)\r
- {\r
- printf("JNI TEST - Error: messageTitle is null\n");\r
- return 0;\r
- }\r
- LOGI("JNI TEST - Message Title: %s\n", messageTitle);\r
- (*env)->ReleaseStringUTFChars(env, jmsgTitle, messageTitle);\r
\r
- // Message Body\r
- jfieldID fid_body = (*env)->GetFieldID(env, cls, "body", "Ljava/lang/String;");\r
- if (fid_body == NULL)\r
- {\r
- LOGE("JNI TEST - Error: jfieldID for message id is null");\r
- return 0;\r
- }\r
- jstring jmsgBody = (*env)->GetObjectField(env, jMsg, fid_body);\r
- const char * messageBody = (*env)->GetStringUTFChars(env, jmsgBody, NULL);\r
- if (messageBody == NULL)\r
- {\r
- printf("JNI TEST - Error: messageBody is null\n");\r
- return 0;\r
- }\r
- LOGI("JNI TEST - Message Body: %s\n", messageBody);\r
- (*env)->ReleaseStringUTFChars(env, jmsgBody, messageBody);\r
+ NSMessage * nsMsg = NSGetMessage(env, jMsg);\r
\r
-// if (isAttached)\r
-// {\r
-// (*g_jvm)->DetachCurrentThread(g_jvm);\r
-// }\r
+ LOGI("JNI TEST - NSSendNotification");\r
+ NSSendNotification(nsMsg);\r
\r
- return 0;\r
+ return (jint) NS_OK;\r
}\r
\r
JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSProviderReadCheck(\r
return 0;\r
}\r
\r
-void JNIlogPrintedCallback(JNIEnv * env, jobject jObj, const char * log)\r
+void NSSubscribeRequestCb(NSConsumer *consumer)\r
{\r
- static jmethodID cb = NULL;\r
- //jclass cls = (*env)->FindClass(env, "com/sec/notiproviderexample/ProviderExample");\r
- jclass cls = (*env)->GetObjectClass(env, jObj);\r
- if (cls == NULL)\r
- {\r
- LOGE("JNI TEST - Error: cannot find callback class");\r
- }\r
+ LOGI("Subscription requested by consumer");\r
\r
- if (cb == NULL)\r
+ JNIEnv * env;\r
+ jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);\r
+ if (JNI_OK != res)\r
{\r
- cb = (*env)->GetMethodID(env, cls, "onLogPrinted", "(Ljava/lang/String;)V");\r
- if (cb == NULL)\r
+ if (res == JNI_EDETACHED)\r
{\r
- LOGE("JNI TEST - Error: cannot get callback method");\r
+ if ((*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL) != JNI_OK)\r
+ {\r
+ LOGE("Failed to get the environment");\r
+ return;\r
+ }\r
+ else\r
+ {\r
+ LOGE("Success to get the environment");\r
+ }\r
+ }\r
+ else\r
+ {\r
+ LOGE("Failed to get the environment using GetEnv()");\r
return;\r
}\r
- LOGI("JNI TEST - Get callback method - onLogPrinted");\r
-\r
- jstring msg = (*env)->NewStringUTF(env, log);\r
- LOGI("print: %s", log);\r
-\r
- (*env)->CallVoidMethod(env, jObj, cb, msg);\r
}\r
-}\r
\r
-void JNISubscribeRequestCallback(JNIEnv * env, jobject jObj, char * consumer)\r
-{\r
- static jmethodID cb = NULL;\r
- //jclass cls = (*env)->FindClass(env, "com/sec/notiproviderexample/ProviderExample");\r
- jclass cls = (*env)->GetObjectClass(env, jObj);\r
- if (cls == NULL)\r
+ jclass cls = (*env)->GetObjectClass(env, g_obj_subscriptionListener);\r
+ if (!cls)\r
{\r
- LOGE("JNI TEST - Error: cannot find callback class");\r
+ LOGE("Failed to Get ObjectClass");\r
+ return;\r
}\r
-\r
- if (cb == NULL)\r
+ jmethodID mid = (*env)->GetMethodID(env, cls, "OnNSSubscribedEvent", "(Ljava/lang/String;)V");\r
+ if (!mid)\r
{\r
- cb = (*env)->GetMethodID(env, cls, "onSubscribeRequest", "(Ljava/lang/String;)V");\r
- if (cb == NULL)\r
- {\r
- LOGE("JNI TEST - Error: cannot get callback method");\r
- return;\r
- }\r
- LOGI("JNI TEST - Get callback method - onSubscribeRequest");\r
-\r
- jstring msg = (*env)->NewStringUTF(env, consumer);\r
- LOGI("print: %s", consumer);\r
-\r
- (*env)->CallVoidMethod(env, jObj, cb, msg);\r
+ LOGE("Failed to Get MethodID");\r
+ return;\r
}\r
-}\r
\r
-void JNIMessageSyncCallback(JNIEnv * env, jobject jObj, char * message)\r
-{\r
- static jmethodID cb = NULL;\r
- //jclass cls = (*env)->FindClass(env, "com/sec/notiproviderexample/ProviderExample");\r
- jclass cls = (*env)->GetObjectClass(env, jObj);\r
- if (cls == NULL)\r
- {\r
- LOGE("JNI TEST - Error: cannot find callback class");\r
- }\r
+ //(*env)->CallVoidMethod(env, g_obj_subscriptionListener, mid);\r
\r
- if (cb == NULL)\r
- {\r
- cb = (*env)->GetMethodID(env, cls, "onMessageSync", "(Ljava/lang/String;)V");\r
- if (cb == NULL)\r
- {\r
- LOGE("JNI TEST - Error: cannot get callback method");\r
- return;\r
- }\r
- LOGI("JNI TEST - Get callback method - onMessageSync");\r
+ (*g_jvm)->DetachCurrentThread(g_jvm);\r
\r
- jstring msg = (*env)->NewStringUTF(env, message);\r
- LOGI("print: %s", message);\r
+ NSAccept(consumer, true);\r
\r
- (*env)->CallVoidMethod(env, jObj, cb, msg);\r
- }\r
+ return;\r
}\r
\r
-void NSSubscribeRequestCb(NSConsumer *consumer)\r
+void NSSyncCb(NSProvider *provider, NSSync *sync)\r
{\r
- LOGI("JNI TEST - consumer requested to subscribe");\r
-\r
- char *cid = consumer->mId;\r
- LOGI("JNI TEST - NS_ Consumer ID: %s\n", cid);\r
+ LOGI("Sync requested");\r
\r
- bool isAttached = false;\r
- JNIEnv* env;\r
+ JNIEnv * env;\r
jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);\r
if (JNI_OK != res)\r
{\r
- LOGI("AttachCurrentThread for JNIEnv pointer");\r
- res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);\r
-\r
- if (JNI_OK != res)\r
+ if (JNI_EDETACHED)\r
+ {\r
+ if ((*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL) < 0)\r
+ {\r
+ LOGE("Failed to get the environment");\r
+ return;\r
+ }\r
+ else\r
+ {\r
+ LOGE("Success to get the environment");\r
+ }\r
+ }\r
+ else\r
{\r
- LOGE("AttachCurrentThread has failed");\r
+ LOGE("Failed to get the environment using GetEnv()");\r
return;\r
}\r
- isAttached = true;\r
}\r
\r
- // callback to app\r
- JNISubscribeRequestCallback(env, g_obj, cid);\r
+ LOGI("Sync ID : %s\n", sync->mMessageId);\r
+ LOGI("Sync STATE : %d\n", sync->mState);\r
+\r
+ jstring strMessageId = (*env)->NewStringUTF(env, sync->mMessageId);\r
\r
- if (isAttached)\r
+ jclass cls = (*env)->GetObjectClass(env, g_obj_syncListener);\r
+ if (!cls)\r
{\r
- (*g_jvm)->DetachCurrentThread(g_jvm);\r
+ LOGE("Failed to Get ObjectClass");\r
+ return;\r
+ }\r
+ jmethodID mid = (*env)->GetMethodID(env, cls, "OnNSSynchronizedEvent",\r
+ "(Ljava/lang/String;I)V");\r
+ if (!mid)\r
+ {\r
+ LOGE("Failed to Get MethodID");\r
+ return;\r
}\r
\r
- NSAccept(consumer, true);\r
+ //(*env)->CallVoidMethod(env, g_obj_syncListener, mid, strMessageId, (jint) sync->mState);\r
+\r
+ (*g_jvm)->DetachCurrentThread(g_jvm);\r
+\r
+ return;\r
+\r
}\r
\r
-void NSSyncCb(NSProvider *provider, NSSync *sync)\r
+NSMessage * NSGetMessage(JNIEnv * env, jobject jMsg)\r
{\r
- LOGI("JNI TEST - sync requested");\r
- LOGI("JNI TEST - NS_ Sync MessageID: %s\n", sync->mMessageId);\r
- LOGI("JNI TEST - NS_ Sync State: %d\n", sync->mState);\r
+ LOGI("NSGetMessage");\r
\r
- bool isAttached = false;\r
- JNIEnv* env;\r
- jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);\r
- if (JNI_OK != res)\r
- {\r
- LOGI("AttachCurrentThread for JNIEnv pointer");\r
- res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);\r
+ jclass cls = (*env)->GetObjectClass(env, jMsg);\r
\r
- if (JNI_OK != res)\r
- {\r
- LOGE("AttachCurrentThread has failed");\r
- return;\r
- }\r
- isAttached = true;\r
+ // Message ID\r
+ jfieldID fid_id = (*env)->GetFieldID(env, cls, "id", "Ljava/lang/String;");\r
+ if (fid_id == NULL)\r
+ {\r
+ LOGI("Error: jfieldID for message id is null");\r
+ return (jint) NS_ERROR;\r
+ }\r
+ jstring jmsgId = (*env)->GetObjectField(env, jMsg, fid_id);\r
+ const char * messageId = (*env)->GetStringUTFChars(env, jmsgId, NULL);\r
+ if (messageId == NULL)\r
+ {\r
+ printf("Error: messageId is null\n");\r
+ return (jint) NS_ERROR;\r
}\r
+ LOGI("Message ID: %s\n", messageId);\r
\r
- // callback to app\r
- JNIMessageSyncCallback(env, g_obj, sync->mMessageId);\r
+ // Message Title\r
+ jfieldID fid_title = (*env)->GetFieldID(env, cls, "title", "Ljava/lang/String;");\r
+ if (fid_title == NULL)\r
+ {\r
+ LOGE("Error: jfieldID for message id is null");\r
+ return (jint) NS_ERROR;\r
+ }\r
+ jstring jmsgTitle = (*env)->GetObjectField(env, jMsg, fid_title);\r
+ const char * messageTitle = (*env)->GetStringUTFChars(env, jmsgTitle, NULL);\r
+ if (messageTitle == NULL)\r
+ {\r
+ printf("Error: messageTitle is null\n");\r
+ return (jint) NS_ERROR;\r
+ }\r
+ LOGI("Message Title: %s\n", messageTitle);\r
\r
- if (isAttached)\r
+ // Message Body\r
+ jfieldID fid_body = (*env)->GetFieldID(env, cls, "body", "Ljava/lang/String;");\r
+ if (fid_body == NULL)\r
{\r
- (*g_jvm)->DetachCurrentThread(g_jvm);\r
+ LOGE("Error: jfieldID for message id is null");\r
+ return (jint) NS_ERROR;\r
}\r
+ jstring jmsgBody = (*env)->GetObjectField(env, jMsg, fid_body);\r
+ const char * messageBody = (*env)->GetStringUTFChars(env, jmsgBody, NULL);\r
+ if (messageBody == NULL)\r
+ {\r
+ printf("Error: messageBody is null\n");\r
+ return (jint) NS_ERROR;\r
+ }\r
+ LOGI("Message Body: %s\n", messageBody);\r
+\r
+ NSMessage * nsMsg = (NSMessage *) malloc(sizeof(NSMessage));\r
+\r
+ nsMsg->mId = strdup(messageId);\r
+ nsMsg->mTitle = strdup(messageTitle);\r
+ nsMsg->mContentText = strdup(messageBody);\r
+\r
+ return nsMsg;\r
\r
}\r
-/* DO NOT EDIT THIS FILE - it is machine generated */\r
+//******************************************************************\r
+//\r
+// Copyright 2016 Samsung Electronics All Rights Reserved.\r
+//\r
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+//\r
+// Licensed under the Apache License, Version 2.0 (the "License");\r
+// you may not use this file except in compliance with the License.\r
+// You may obtain a copy of the License at\r
+//\r
+// http://www.apache.org/licenses/LICENSE-2.0\r
+//\r
+// Unless required by applicable law or agreed to in writing, software\r
+// distributed under the License is distributed on an "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+// See the License for the specific language governing permissions and\r
+// limitations under the License.\r
+//\r
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
+\r
#include <jni.h>\r
#include "NSProviderInterface.h"\r
#include "NSCommon.h"\r
-/* Header for class com_sec_notiproviderjni_IoTNotification */\r
\r
#ifndef NOTIFICATION_JNI_H\r
#define NOTIFICATION_JNI_H\r
#ifdef __cplusplus\r
-extern "C" {\r
+extern "C"\r
+{\r
#endif\r
\r
-/*\r
- * Class: com_sec_notiproviderjni_IoTNotification\r
- * Method: stringFromJNI\r
- * Signature: ()Ljava/lang/String;\r
- */\r
- JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSStartProvider\r
- (JNIEnv *, jobject, jboolean);\r
-\r
- JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSStopProvider\r
- (JNIEnv *, jobject);\r
-\r
- JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSSendNotification\r
- (JNIEnv *, jobject, jobject);\r
-\r
- JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSProviderReadCheck\r
- (JNIEnv *, jobject, jobject);\r
+ JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSStartProvider(\r
+ JNIEnv *, jobject, jboolean, jobject, jobject);\r
\r
- JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSAccept\r
- (JNIEnv *, jobject, jobject, jboolean);\r
+ JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSStopProvider(\r
+ JNIEnv *, jobject);\r
\r
- void JNIlogPrintedCallback(JNIEnv*, jobject, const char*);\r
+ JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSSendNotification(\r
+ JNIEnv *, jobject, jobject);\r
\r
- void JNISubscribeRequestCallback(JNIEnv*, jobject, char*);\r
+ JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSProviderReadCheck(\r
+ JNIEnv *, jobject, jobject);\r
\r
- void JNIMessageSyncCallback(JNIEnv*, jobject, char*);\r
+ JNIEXPORT jint JNICALL Java_org_iotivity_service_notification_IoTNotification_NSAccept(JNIEnv *,\r
+ jobject, jobject, jboolean);\r
\r
- void NSSubscribeRequestCb(NSConsumer*);\r
+ void NSSubscribeRequestCb(NSConsumer*);\r
\r
- void NSSyncCb(NSProvider*, NSSync*);\r
+ void NSSyncCb(NSProvider*, NSSync*);\r
\r
+ NSMessage * NSGetMessage(JNIEnv *, jobject);\r
\r
#ifdef __cplusplus\r
}\r