6 #include "caleserver.h"
11 #include "oic_malloc.h"
12 #include "uthreadpool.h" /* for thread pool */
14 #include "uarraylist.h"
15 #include "com_iotivity_jar_CALeInterface.h"
18 #define TAG PCF("CA_LE_CLIENT")
20 static const char *METHODID_OBJECTNONPARAM = "()Landroid/bluetooth/BluetoothAdapter;";
21 static const char *METHODID_STRINGNONPARAM = "()Ljava/lang/String;";
22 static const char *CLASSPATH_BT_ADPATER = "android/bluetooth/BluetoothAdapter";
23 static const char *CLASSPATH_BT_UUID = "java/util/UUID";
24 static const char *CLASSPATH_BT_GATT = "android/bluetooth/BluetoothGatt";
26 static const char *IOTIVITY_GATT_SERVIE_UUID = "713d0000-503e-4c75-ba94-3148f18d941e";
27 static const char *IOTIVITY_GATT_TX_UUID = "713d0003-503e-4c75-ba94-3148f18d941e";
28 static const char *IOTIVITY_GATT_RX_UUID = "713d0002-503e-4c75-ba94-3148f18d941e";
30 static const uint32_t STATE_CONNECTED = 2;
31 static const uint32_t STATE_DISCONNECTED = 0;
32 static const uint32_t GATT_SUCCESS = 0;
34 static const uint32_t MAX_PDU_BUFFER = 1400;
37 static u_arraylist_t *gdeviceList = NULL;
38 static u_arraylist_t *gGattObjectList = NULL;
39 static CAPacketReceiveCallback gPacketReceiveCallback = NULL;
40 static u_thread_pool_t gThreadPoolHandle = NULL;
41 static jobject gLeScanCallback;
42 static jobject gLeGattCallback;
43 static jobject gContext;
44 static jobjectArray gUUIDList;
45 static jboolean gIsStartServer;
46 static jboolean gIsFinishSendData;
48 static jbyteArray gSendBuffer;
49 static uint32_t gTargetCnt = 0;
50 static uint32_t gCurrentSentCnt = 0;
52 /** mutex for synchrnoization **/
53 static u_mutex gThreadMutex;
54 /** conditional mutex for synchrnoization **/
55 static u_cond gThreadCond;
57 ////////////////////////////////////////////////////////////////////////////////////////////////////
58 //FIXME getting context
59 void CALEClientJNISetContext(JNIEnv *env, jobject context)
61 OIC_LOG_V(DEBUG, TAG, "CALEClientJNISetContext");
65 OIC_LOG_V(DEBUG, TAG, "context is null");
69 gContext = (*env)->NewGlobalRef(env, context);
72 void CALeCreateJniInterfaceObject()
74 OIC_LOG_V(DEBUG, TAG, "CALeCreateJniInterfaceObject");
76 jboolean isAttached = FALSE;
78 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
81 OIC_LOG_V(DEBUG, TAG, "Could not get JNIEnv pointer");
82 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
86 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
92 jclass LeJniInterface = (*env)->FindClass(env, "com/iotivity/jar/CALeInterface");
95 OIC_LOG_V(DEBUG, TAG, "Could not get CALeInterface class");
99 jmethodID LeInterfaceConstructorMethod =
100 (*env)->GetMethodID(env, LeJniInterface, "<init>", "(Landroid/content/Context;)V");
101 if (!LeInterfaceConstructorMethod)
103 OIC_LOG_V(DEBUG, TAG, "Could not get CALeInterface constructor method");
107 (*env)->NewObject(env, LeJniInterface, LeInterfaceConstructorMethod, gContext);
108 OIC_LOG_V(DEBUG, TAG, "Create CALeInterface instance");
111 (*g_jvm)->DetachCurrentThread(g_jvm);
114 JNIEXPORT jint JNI_OnLoad(JavaVM *jvm, void *reserved)
116 OIC_LOG_V(DEBUG, TAG, "JNI_OnLoad in calecore");
119 if((*jvm)->GetEnv(jvm, (void**)&env, JNI_VERSION_1_6) != JNI_OK)
123 g_jvm = jvm; /* cache the JavaVM pointer */
125 //JVM required for WifiCore to work with JNI interface
127 CALeServerJniInit(env, jvm);
128 CAEDRCoreJniInit(env, jvm);
130 return JNI_VERSION_1_6;
133 void JNI_OnUnload(JavaVM *jvm, void *reserved)
135 OIC_LOG_V(DEBUG, TAG, "JNI_OnUnload in calecore");
138 if((*jvm)->GetEnv(jvm, (void**)&env, JNI_VERSION_1_6) != JNI_OK)
146 JNIEXPORT void JNICALL Java_com_iotivity_jar_CALeInterface_CARegisterLeScanCallback(JNIEnv *env,
147 jobject obj, jobject callback)
149 OIC_LOG_V(DEBUG, TAG, "CARegisterLeScanCallback");
151 gLeScanCallback = (*env)->NewGlobalRef(env, callback);
154 JNIEXPORT void JNICALL Java_com_iotivity_jar_CALeInterface_CARegisterLeGattCallback(JNIEnv *env,
155 jobject obj, jobject callback)
157 OIC_LOG_V(DEBUG, TAG, "CARegisterLeGattCallback");
159 gLeGattCallback = (*env)->NewGlobalRef(env, callback);
162 JNIEXPORT void JNICALL Java_com_iotivity_jar_CALeInterface_CALeScanCallback (JNIEnv *env,
163 jobject obj, jobject device, jint rssi, jbyteArray scanRecord)
165 CANativeAddScanDeviceToList(env, device);
169 * Class: com_iotivity_jar_CALeInterface
170 * Method: CALeGattConnectionStateChangeCallback
171 * Signature: (Landroid/bluetooth/BluetoothGatt;II)V
173 JNIEXPORT void JNICALL Java_com_iotivity_jar_CALeInterface_CALeGattConnectionStateChangeCallback
174 (JNIEnv *env, jobject obj, jobject gatt, jint status, jint newstate)
176 OIC_LOG_V(DEBUG, TAG, "CALeGattConnectionStateChangeCallback - status %d, newstate %d", status, newstate);
178 if(GATT_SUCCESS == status && STATE_CONNECTED == newstate) // le connected
181 CANativeAddGattobjToList(env, gatt);
182 CANativeLEDiscoverServices(env, gatt);
185 else if (GATT_SUCCESS == status && STATE_DISCONNECTED == newstate) // le disconnected
187 // CANativeLEStartScan();
190 //CANativeGattClose(env, gatt); // 20150105
191 //CANativeRemoveGattObj(env, gatt); // 20150105
196 CANativeSendFinsih(env, gatt);
201 * Class: com_iotivity_jar_CALeInterface
202 * Method: CALeGattServicesDiscoveredCallback
203 * Signature: (Landroid/bluetooth/BluetoothGatt;I)V
205 JNIEXPORT void JNICALL Java_com_iotivity_jar_CALeInterface_CALeGattServicesDiscoveredCallback
206 (JNIEnv *env, jobject obj, jobject gatt, jint status)
208 OIC_LOG_V(DEBUG, TAG, "CALeGattServicesDiscoveredCallback - status %d: ", status);
210 if(0 != status) // discovery error
212 CANativeSendFinsih(env, gatt);
216 // read Characteristic
217 // CANativeReadCharacteristic(env, gatt);
219 jboolean ret_rx = CANativeSetCharacteristicNoti(env, gatt, IOTIVITY_GATT_RX_UUID);
220 if(!ret_rx) // SetCharacteristicNoti is failed
222 CANativeSendFinsih(env, gatt);
226 // jstring data = (*env)->NewStringUTF(env, "HelloWorld");
227 jobject jni_obj_character = CANativeCreateGattCharacteristic(env, gatt, gSendBuffer);
228 if(!jni_obj_character)
230 CANativeSendFinsih(env, gatt);
235 jboolean ret = CANativeLESendData(env, gatt, jni_obj_character);
238 CANativeSendFinsih(env, gatt);
244 * Class: com_iotivity_jar_CALeInterface
245 * Method: CALeGattCharacteristicReadCallback
246 * Signature: (Landroid/bluetooth/BluetoothGatt;Landroid/bluetooth/BluetoothGattCharacteristic;I)V
248 JNIEXPORT void JNICALL Java_com_iotivity_jar_CALeInterface_CALeGattCharacteristicReadCallback
249 (JNIEnv *env, jobject obj, jobject gatt, jobject characteristic, jbyteArray data, jint status)
251 OIC_LOG_V(DEBUG, TAG, "CALeGattCharacteristicReadCallback - status : %d", status);
255 * Class: com_iotivity_jar_CALeInterface
256 * Method: CALeGattCharacteristicWritjclasseCallback
257 * Signature: (Landroid/bluetooth/BluetoothGatt;Landroid/bluetooth/BluetoothGattCharacteristic;I)V
259 JNIEXPORT void JNICALL Java_com_iotivity_jar_CALeInterface_CALeGattCharacteristicWriteCallback
260 (JNIEnv *env, jobject obj, jobject gatt, jobject characteristic, jbyteArray data, jint status)
262 OIC_LOG_V(DEBUG, TAG, "CALeGattCharacteristicWriteCallback - status : %d", status);
265 char* wroteData = (char*)(*env)->GetByteArrayElements(env, data, &isCopy);
267 jstring jni_address = CANativeGetAddressFromGattObj(env, gatt);
268 const char* address = (*env)->GetStringUTFChars(env, jni_address, NULL);
270 OIC_LOG_V(DEBUG, TAG, "CALeGattCharacteristicWriteCallback - write data : %s", wroteData);
273 CANativeSendFinsih(env, gatt);
276 if(0 != status) // error case
278 CANativeSendFinsih(env, gatt);
283 * Class: com_iotivity_jar_CALeInterface
284 * Method: CALeGattCharacteristicChangedCallback
285 * Signature: (Landroid/bluetooth/BluetoothGatt;Landroid/bluetooth/BluetoothGattCharacteristic;)V
287 JNIEXPORT void JNICALL Java_com_iotivity_jar_CALeInterface_CALeGattCharacteristicChangedCallback
288 (JNIEnv *env, jobject obj, jobject gatt, jobject characteristic, jbyteArray data)
290 OIC_LOG_V(DEBUG, TAG, "CALeGattCharacteristicChangedCallback");
292 // get Byte Array and covert to char*
293 jint length = (*env)->GetArrayLength(env, data);
296 jbyte *jni_byte_responseData = (char*)(*env)->GetByteArrayElements(env, data, &isCopy);
298 char responseData[MAX_PDU_BUFFER];
299 memset(responseData, 0, MAX_PDU_BUFFER);
300 strncpy(responseData, (char*)jni_byte_responseData, length);
301 responseData[length] = '\0';
302 (*env)->ReleaseByteArrayElements(env, data, (jbyte*)jni_byte_responseData, JNI_ABORT);
304 jstring jni_address = CANativeGetAddressFromGattObj(env, gatt);
305 const char* address = (*env)->GetStringUTFChars(env, jni_address, NULL);
307 OIC_LOG_V(DEBUG, TAG, "CALeGattCharacteristicChangedCallback - data. : %s, %d", responseData, length);
310 gPacketReceiveCallback(address, responseData);
312 // LE disconnect and finish BLE write routine
313 CANativeSendFinsih(env, gatt);
317 * Class: com_iotivity_jar_CALeInterface
318 * Method: CALeGattDescriptorReadCallback
319 * Signature: (Landroid/bluetooth/BluetoothGatt;Landroid/bluetooth/BluetoothGattDescriptor;I)V
321 JNIEXPORT void JNICALL Java_com_iotivity_jar_CALeInterface_CALeGattDescriptorReadCallback
322 (JNIEnv *env, jobject obj, jobject gatt, jobject descriptor, jint status)
324 OIC_LOG_V(DEBUG, TAG, "CALeGattDescriptorReadCallback - status %d: ", status);
328 * Class: com_iotivity_jar_CALeInterface
329 * Method: CALeGattDescriptorWriteCallback
330 * Signature: (Landroid/bluetooth/BluetoothGatt;Landroid/bluetooth/BluetoothGattDescriptor;I)V
332 JNIEXPORT void JNICALL Java_com_iotivity_jar_CALeInterface_CALeGattDescriptorWriteCallback
333 (JNIEnv *env, jobject obj, jobject gatt, jobject descriptor, jint status)
335 OIC_LOG_V(DEBUG, TAG, "CALeGattDescriptorWriteCallback - status %d: ", status);
339 * Class: com_iotivity_jar_CALeInterface
340 * Method: CALeGattReliableWriteCompletedCallback
341 * Signature: (Landroid/bluetooth/BluetoothGatt;I)V
343 JNIEXPORT void JNICALL Java_com_iotivity_jar_CALeInterface_CALeGattReliableWriteCompletedCallback
344 (JNIEnv *env, jobject obj, jobject gatt, jint status)
346 OIC_LOG_V(DEBUG, TAG, "CALeGattReliableWriteCompletedCallback - status %d: ", status);
350 * Class: com_iotivity_jar_CALeInterface
351 * Method: CALeGattReadRemoteRssiCallback
352 * Signature: (Landroid/bluetooth/BluetoothGatt;II)V
354 JNIEXPORT void JNICALL Java_com_iotivity_jar_CALeInterface_CALeGattReadRemoteRssiCallback
355 (JNIEnv *env, jobject obj, jobject gatt, jint rssi, jint status)
357 OIC_LOG_V(DEBUG, TAG, "CALeGattReadRemoteRssiCallback - rssi %d, status %d: ", rssi, status);
361 void CALEInitialize(u_thread_pool_t handle)
363 OIC_LOG(DEBUG, TAG, "CALEInitialize");
365 gThreadPoolHandle = handle;
367 // init mutex for send logic
368 gThreadMutex = u_mutex_new();
369 gThreadCond = u_cond_new();
371 CANativeCreateUUIDList();
373 CALeCreateJniInterfaceObject(); /* create java CALeInterface instance*/
378 OIC_LOG(DEBUG, TAG, "CALETerminate");
380 jboolean isAttached = FALSE;
382 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
385 OIC_LOG_V(DEBUG, TAG, "Could not get JNIEnv pointer");
386 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
390 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
396 CANativeLEDisconnectAll(env);
400 CANativeLEStopScanImpl(env, gLeScanCallback);
406 (*env)->DeleteGlobalRef(env, gLeScanCallback);
411 (*env)->DeleteGlobalRef(env, gLeGattCallback);
416 (*env)->DeleteGlobalRef(env, gContext);
421 (*env)->DeleteGlobalRef(env, gSendBuffer);
426 (*env)->DeleteGlobalRef(env, gUUIDList);
429 CANativeRemoveAllDevices(env);
430 CANativeRemoveAllGattObjsList(env);
431 gIsStartServer = FALSE;
432 gIsFinishSendData = FALSE;
435 (*g_jvm)->DetachCurrentThread(g_jvm);
437 // delete mutex object
438 u_mutex_free(gThreadMutex);
440 u_cond_signal(gThreadCond);
441 u_cond_free(gThreadCond);
444 void CANativeSendFinsih(JNIEnv *env, jobject gatt)
446 OIC_LOG_V(DEBUG, TAG, "CANativeSendFinsih");
450 CANativeLEDisconnect(env, gatt);
452 CANativeupdateSendCnt(env);
455 int32_t CALESendUnicastMessage(const char* address, const char* data, uint32_t dataLen)
457 OIC_LOG_V(DEBUG, TAG, "CALESendUnicastMessage(%s, %s)", address, data);
459 CALESendUnicastMessageImpl(address, data, dataLen);
463 int32_t CALESendMulticastMessage(const char* data, uint32_t dataLen)
465 OIC_LOG_V(DEBUG, TAG, "CALESendMulticastMessage(%s)", data);
467 jboolean isAttached = FALSE;
469 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
472 OIC_LOG_V(DEBUG, TAG, "Could not get JNIEnv pointer");
473 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
477 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
483 CALESendMulticastMessageImpl(env, data, dataLen);
486 (*g_jvm)->DetachCurrentThread(g_jvm);
491 int32_t CALEStartUnicastServer(const char* address)
493 OIC_LOG_V(DEBUG, TAG, "CALEStartUnicastServer(%s)", address);
498 int32_t CALEStartMulticastServer()
500 OIC_LOG_V(DEBUG, TAG, "CALEStartMulticastServer");
504 OIC_LOG_V(DEBUG, TAG, "server is already started..it will be skipped");
508 jboolean isAttached = FALSE;
510 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
513 OIC_LOG_V(DEBUG, TAG, "Could not get JNIEnv pointer");
514 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
518 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
524 gIsStartServer = TRUE;
526 CANativeLEStartScan();
529 (*g_jvm)->DetachCurrentThread(g_jvm);
534 int32_t CALEStopUnicastServer(int32_t serverID)
536 OIC_LOG(DEBUG, TAG, "CALEStopUnicastServer");
541 int32_t CALEStopMulticastServer(int32_t serverID)
543 OIC_LOG(DEBUG, TAG, "CALEStopMulticastServer");
544 gIsStartServer = FALSE;
545 CANativeLEStopScan();
549 void CALESetCallback(CAPacketReceiveCallback callback)
551 gPacketReceiveCallback = callback;
554 CAResult_t CALEGetInterfaceInfo(char **address)
556 CALEGetLocalAddress(address);
560 void CALEGetLocalAddress(char** address)
562 jboolean isAttached = FALSE;
564 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
567 OIC_LOG_V(DEBUG, TAG, "Could not get JNIEnv pointer");
568 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
571 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
577 jstring jni_address = CALEGetLocalDeviceAddress(env);
580 const char* localAddress = (*env)->GetStringUTFChars(env, jni_address, NULL);
581 *address = (char*)OICMalloc(strlen(localAddress) + 1);
582 if (*address == NULL)
586 memcpy(*address, localAddress, strlen(localAddress));
589 OIC_LOG_V(DEBUG, TAG, "Local Address : %s", *address);
591 (*g_jvm)->DetachCurrentThread(g_jvm);
594 int32_t CALESendUnicastMessageImpl(const char* address, const char* data, uint32_t dataLen)
596 OIC_LOG_V(DEBUG, TAG, "CALESendUnicastMessageImpl, address: %s, data: %s", address, data);
598 jboolean isAttached = FALSE;
600 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
603 OIC_LOG_V(DEBUG, TAG, "Could not get JNIEnv pointer");
604 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
607 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
613 OIC_LOG(DEBUG, TAG, "[BLE][Native] set byteArray for data");
616 (*env)->DeleteGlobalRef(env, gSendBuffer);
618 jbyteArray jni_arr = (*env)->NewByteArray(env, dataLen);
619 (*env)->SetByteArrayRegion(env, jni_arr, 0, dataLen, (jbyte*)data);
620 gSendBuffer = (jbyteArray)(*env)->NewGlobalRef(env, jni_arr);
622 // connect to gatt server
623 CANativeLEStopScanImpl(env, gLeScanCallback);
626 jobject jni_obj_bluetoothDevice = NULL;
627 if(gContext && gdeviceList)
630 for (index = 0; index < u_arraylist_length(gdeviceList); index++)
632 jobject jarrayObj = (jobject) u_arraylist_get(gdeviceList, index);
635 OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
639 jstring jni_setAddress = CALEGetAddressFromBTDevice(env, jarrayObj);
642 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_setAddress is null");
645 const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
647 if(!strcmp(setAddress, address))
649 jni_obj_bluetoothDevice = jarrayObj;
654 if(jni_obj_bluetoothDevice)
656 jboolean autoConnect = FALSE;
657 CANativeLEConnect(env, jni_obj_bluetoothDevice, gContext, autoConnect, gLeGattCallback);
662 (*g_jvm)->DetachCurrentThread(g_jvm);
667 int32_t CALESendMulticastMessageImpl(JNIEnv *env, const char* data, uint32_t dataLen)
669 OIC_LOG_V(DEBUG, TAG, "CASendMulticastMessageImpl, send to, data: %s, %d", data, dataLen);
673 OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceList is null");
676 OIC_LOG(DEBUG, TAG, "set wait");
679 gIsFinishSendData = FALSE;
681 OIC_LOG(DEBUG, TAG, "[BLE][Native] set byteArray for data");
684 (*env)->DeleteGlobalRef(env, gSendBuffer);
686 jbyteArray jni_arr = (*env)->NewByteArray(env, dataLen);
687 (*env)->SetByteArrayRegion(env, jni_arr, 0, dataLen, (jbyte*)data);
688 gSendBuffer = (jbyteArray)(*env)->NewGlobalRef(env, jni_arr);
690 // connect to gatt server
691 CANativeLEStopScanImpl(env, gLeScanCallback);
695 CANativeRemoveAllGattObjsList(env);
696 CANativeCreateGattObjList(env);
698 gTargetCnt = u_arraylist_length(gdeviceList);
702 while (index < u_arraylist_length(gdeviceList)) {
703 jobject jarrayObj = (jobject) u_arraylist_get(gdeviceList, index);
706 OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
710 if(0 <= CANativeLEConnect(env, jarrayObj, gContext, FALSE, gLeGattCallback))
712 // connection failure
718 // wait for finish to send data through "CALeGattServicesDiscoveredCallback"
719 if(!gIsFinishSendData)
721 u_mutex_lock(gThreadMutex);
722 u_cond_wait(gThreadCond, gThreadMutex);
723 OIC_LOG(DEBUG, TAG, "unset wait");
724 u_mutex_unlock(gThreadMutex);
727 // start LE Scan again
729 CANativeLEStartScan();
735 jstring CANativeGetAddressFromGattObj(JNIEnv *env, jobject gatt)
739 OIC_LOG(DEBUG, TAG, "[BLE][Native] gatt is null");
743 jclass jni_cid_gattdevice_list = (*env)->FindClass(env, CLASSPATH_BT_GATT);
744 if(!jni_cid_gattdevice_list)
746 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_cid_gattdevice_list is null");
750 jmethodID jni_mid_getDevice = (*env)->GetMethodID(env, jni_cid_gattdevice_list, "getDevice",
751 "()Landroid/bluetooth/BluetoothDevice;");
752 if(!jni_mid_getDevice)
754 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_mid_getDevice is null");
758 jobject jni_obj_device = (*env)->CallObjectMethod(env, gatt, jni_mid_getDevice);
761 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_obj_device is null");
765 jstring jni_address = CALEGetAddressFromBTDevice(env, jni_obj_device);
768 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_address is null");
778 void CANativeGattClose(JNIEnv *env, jobject bluetoothGatt)
781 OIC_LOG(DEBUG, TAG, "[BLE][Native] GATT CLOSE");
783 // get BluetoothGatt class
784 OIC_LOG(DEBUG, TAG, "[BLE][Native] get BluetoothGatt class");
785 jclass jni_cid_BluetoothGatt = (*env)->FindClass(env, CLASSPATH_BT_GATT);
786 if(!jni_cid_BluetoothGatt)
788 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_cid_BluetoothGatt is null");
792 jmethodID jni_mid_closeGatt = (*env)->GetMethodID(env, jni_cid_BluetoothGatt, "close","()V");
793 if(!jni_mid_closeGatt)
795 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_mid_closeGatt is null");
799 // call disconnect gatt method
800 OIC_LOG(DEBUG, TAG, "[BLE][Native] request close Gatt");
801 (*env)->CallVoidMethod(env, bluetoothGatt, jni_mid_closeGatt);
804 void CANativeLEStartScan()
808 OIC_LOG_V(DEBUG, TAG, "server is not started yet..scan will be passed");
812 jboolean isAttached = FALSE;
814 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
817 OIC_LOG_V(DEBUG, TAG, "Could not get JNIEnv pointer");
819 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
822 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
828 OIC_LOG(DEBUG, TAG, "[BLE][Native] CANativeLEStartScan");
830 // scan gatt server with UUID
831 if(gLeScanCallback && gUUIDList)
833 CANativeLEStartScanWithUUIDImpl(env, gUUIDList, gLeScanCallback);
837 (*g_jvm)->DetachCurrentThread(g_jvm);
841 void CANativeLEStartScanImpl(JNIEnv *env, jobject callback)
843 if(!CALEIsEnableBTAdapter(env))
845 OIC_LOG(DEBUG, TAG, "[BLE][Native] BT adpater is not enable");
849 // get default bt adapter class
850 jclass jni_cid_BTAdapter = (*env)->FindClass(env, CLASSPATH_BT_ADPATER);
851 if(!jni_cid_BTAdapter)
853 OIC_LOG(DEBUG, TAG, "[BLE][Native] getState From BTAdapter: jni_cid_BTAdapter is null");
857 // get remote bt adapter method
858 jmethodID jni_mid_getDefaultAdapter = (*env)->GetStaticMethodID(env, jni_cid_BTAdapter, "getDefaultAdapter", METHODID_OBJECTNONPARAM);
859 if(!jni_mid_getDefaultAdapter)
861 OIC_LOG(DEBUG, TAG, "[BLE][Native] getState From BTAdapter: jni_mid_getDefaultAdapter is null");
865 // get start le scan method
866 jmethodID jni_mid_startLeScan = (*env)->GetMethodID(env, jni_cid_BTAdapter, "startLeScan",
867 "(Landroid/bluetooth/BluetoothAdapter$LeScanCallback;)Z");
868 if(!jni_mid_startLeScan)
870 OIC_LOG(DEBUG, TAG, "[BLE][Native] startLeScan: jni_mid_startLeScan is null");
874 // gat bt adapter object
875 jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter, jni_mid_getDefaultAdapter);
876 if(!jni_obj_BTAdapter)
878 OIC_LOG(DEBUG, TAG, "[BLE][Native] getState From BTAdapter: jni_obj_BTAdapter is null");
882 // call start le scan method
883 jboolean jni_obj_startLeScan = (*env)->CallBooleanMethod(env, jni_obj_BTAdapter, jni_mid_startLeScan, callback);
884 if(!jni_obj_startLeScan)
886 OIC_LOG(DEBUG, TAG, "[BLE][Native] startLeScan is failed");
891 OIC_LOG(DEBUG, TAG, "[BLE][Native] startLeScan is started");
895 jobject CANativeGetUUIDObject(JNIEnv *env, const char* uuid)
898 jclass jni_cid_uuid = (*env)->FindClass(env, CLASSPATH_BT_UUID);
901 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_cid_uuid is null");
905 jmethodID jni_mid_fromString = (*env)->GetStaticMethodID(env, jni_cid_uuid, "fromString", "(Ljava/lang/String;)Ljava/util/UUID;");
906 if(!jni_mid_fromString)
908 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_mid_fromString is null");
912 jstring jni_uuid = (*env)->NewStringUTF(env, uuid);
913 jobject jni_obj_uuid = (*env)->CallStaticObjectMethod(env, jni_cid_uuid, jni_mid_fromString, jni_uuid);
916 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_obj_uuid is null");
923 void CANativeLEStartScanWithUUIDImpl(JNIEnv *env, jobjectArray uuids, jobject callback)
925 // get default bt adapter class
926 OIC_LOG(DEBUG, TAG, "[BLE][Native] get default bt adapter class");
928 if(!CALEIsEnableBTAdapter(env))
930 OIC_LOG(DEBUG, TAG, "[BLE][Native] BT adpater is not enable");
934 jclass jni_cid_BTAdapter = (*env)->FindClass(env, CLASSPATH_BT_ADPATER);
935 if(!jni_cid_BTAdapter)
937 OIC_LOG(DEBUG, TAG, "[BLE][Native] getState From BTAdapter: jni_cid_BTAdapter is null");
941 // get remote bt adapter method
942 OIC_LOG(DEBUG, TAG, "[BLE][Native] get remote bt adapter method");
943 jmethodID jni_mid_getDefaultAdapter = (*env)->GetStaticMethodID(env, jni_cid_BTAdapter, "getDefaultAdapter", METHODID_OBJECTNONPARAM);
944 if(!jni_mid_getDefaultAdapter)
946 OIC_LOG(DEBUG, TAG, "[BLE][Native] getState From BTAdapter: jni_mid_getDefaultAdapter is null");
950 // get start le scan method
951 OIC_LOG(DEBUG, TAG, "[BLE][Native] get start le scan method");
952 jmethodID jni_mid_startLeScan = (*env)->GetMethodID(env, jni_cid_BTAdapter, "startLeScan",
953 "([Ljava/util/UUID;Landroid/bluetooth/BluetoothAdapter$LeScanCallback;)Z");
954 if(!jni_mid_startLeScan)
956 OIC_LOG(DEBUG, TAG, "[BLE][Native] startLeScan: jni_mid_startLeScan is null");
960 // get bt adapter object
961 OIC_LOG(DEBUG, TAG, "[BLE][Native] get bt adapter object");
962 jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter, jni_mid_getDefaultAdapter);
963 if(!jni_obj_BTAdapter)
965 OIC_LOG(DEBUG, TAG, "[BLE][Native] getState From BTAdapter: jni_obj_BTAdapter is null");
969 // call start le scan method
970 OIC_LOG(DEBUG, TAG, "[BLE][Native] call start le scan service method");
971 jboolean jni_obj_startLeScan = (*env)->CallBooleanMethod(env, jni_obj_BTAdapter, jni_mid_startLeScan, uuids, callback);
972 if(!jni_obj_startLeScan)
974 OIC_LOG(DEBUG, TAG, "[BLE][Native] startLeScan With UUID is failed");
979 OIC_LOG(DEBUG, TAG, "[BLE][Native] startLeScan With UUID is started");
983 void CANativeLEStopScan()
985 jboolean isAttached = FALSE;
987 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
990 OIC_LOG_V(DEBUG, TAG, "Could not get JNIEnv pointer");
991 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
994 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
1000 CANativeLEStopScanImpl(env, gLeScanCallback);
1003 (*g_jvm)->DetachCurrentThread(g_jvm);
1007 void CANativeLEStopScanImpl(JNIEnv *env, jobject callback)
1009 OIC_LOG(DEBUG, TAG, "[BLE][Native] CANativeLEStopScan");
1011 if(!CALEIsEnableBTAdapter(env))
1013 OIC_LOG(DEBUG, TAG, "[BLE][Native] BT adpater is not enable");
1017 // get default bt adapter class
1018 jclass jni_cid_BTAdapter = (*env)->FindClass(env, CLASSPATH_BT_ADPATER);
1019 if(!jni_cid_BTAdapter)
1021 OIC_LOG(DEBUG, TAG, "[BLE][Native] getState From BTAdapter: jni_cid_BTAdapter is null");
1025 // get remote bt adapter method
1026 jmethodID jni_mid_getDefaultAdapter = (*env)->GetStaticMethodID(env, jni_cid_BTAdapter, "getDefaultAdapter", METHODID_OBJECTNONPARAM);
1027 if(!jni_mid_getDefaultAdapter)
1029 OIC_LOG(DEBUG, TAG, "[BLE][Native] getState From BTAdapter: jni_mid_getDefaultAdapter is null");
1033 // get start le scan method
1034 jmethodID jni_mid_stopLeScan = (*env)->GetMethodID(env, jni_cid_BTAdapter, "stopLeScan",
1035 "(Landroid/bluetooth/BluetoothAdapter$LeScanCallback;)V");
1036 if(!jni_mid_stopLeScan)
1038 OIC_LOG(DEBUG, TAG, "[BLE][Native] stopLeScan: jni_mid_stopLeScan is null");
1042 // gat bt adapter object
1043 jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter, jni_mid_getDefaultAdapter);
1044 if(!jni_obj_BTAdapter)
1046 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_obj_BTAdapter is null");
1050 OIC_LOG(DEBUG, TAG, "[BLE][Native] CALL API - request to stop LE Scan");
1051 // call start le scan method
1052 (*env)->CallVoidMethod(env, jni_obj_BTAdapter, jni_mid_stopLeScan, callback);
1055 int32_t CANativeLEConnect(JNIEnv *env, jobject bluetoothDevice, jobject context,
1056 jboolean autoconnect, jobject callback)
1058 if(!CALEIsEnableBTAdapter(env))
1060 OIC_LOG(DEBUG, TAG, "[BLE][Native] BT adpater is not enable");
1064 jstring jni_address = CALEGetAddressFromBTDevice(env, bluetoothDevice);
1065 const char * addr = (*env)->GetStringUTFChars(env, jni_address, NULL);
1066 OIC_LOG_V(DEBUG, TAG, "[BLE][Native] request connectGatt to %s", addr);
1070 // get BluetoothDevice class
1071 OIC_LOG(DEBUG, TAG, "[BLE][Native] get BluetoothDevice class");
1072 jclass jni_cid_BluetoothDevice = (*env)->FindClass(env, "android/bluetooth/BluetoothDevice");
1073 if(!jni_cid_BluetoothDevice)
1075 OIC_LOG(DEBUG, TAG, "[BLE][Native] bleConnect: jni_cid_BluetoothDevice is null");
1079 // get connectGatt method
1080 OIC_LOG(DEBUG, TAG, "[BLE][Native] get connectGatt method");
1081 jmethodID jni_mid_connectGatt = (*env)->GetMethodID(env, jni_cid_BluetoothDevice,
1083 "(Landroid/content/Context;ZLandroid/bluetooth/BluetoothGattCallback;)Landroid/bluetooth/BluetoothGatt;");
1084 if(!jni_mid_connectGatt)
1086 OIC_LOG(DEBUG, TAG, "[BLE][Native] bleConnect: jni_mid_connectGatt is null");
1090 OIC_LOG(DEBUG, TAG, "[BLE][Native] Call object method - connectGatt");
1091 jobject jni_obj_connectGatt = (*env)->CallObjectMethod(env, bluetoothDevice,
1092 jni_mid_connectGatt, NULL, autoconnect, callback);
1093 if(!jni_obj_connectGatt)
1095 OIC_LOG(DEBUG, TAG, "[BLE][Native] CALL API - connectGatt was failed.obj will be removed");
1096 CANativeRemoveDevice(env, jni_address);
1097 CANativeupdateSendCnt(env);
1102 OIC_LOG(DEBUG, TAG, "[BLE][Native] CALL API - connecting..");
1107 void CANativeLEDisconnect(JNIEnv *env, jobject bluetoothGatt)
1109 if(!CALEIsEnableBTAdapter(env))
1111 OIC_LOG(DEBUG, TAG, "[BLE][Native] BT adpater is not enable");
1116 OIC_LOG(DEBUG, TAG, "[BLE][Native] GATT DISCONNECT");
1118 // get BluetoothGatt class
1119 OIC_LOG(DEBUG, TAG, "[BLE][Native] get BluetoothGatt classjobject bluetoothGatt");
1120 jclass jni_cid_BluetoothGatt = (*env)->FindClass(env, CLASSPATH_BT_GATT);
1121 if(!jni_cid_BluetoothGatt)
1123 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_cid_BluetoothGatt is null");
1127 OIC_LOG(DEBUG, TAG, "[BLE][Native] get gatt disconnect method");
1128 jmethodID jni_mid_disconnectGatt = (*env)->GetMethodID(env, jni_cid_BluetoothGatt,
1129 "disconnect","()V");
1130 if(!jni_mid_disconnectGatt)
1132 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_mid_disconnectGatt is null");
1136 // call disconnect gatt method
1137 OIC_LOG(DEBUG, TAG, "[BLE][Native] CALL API - request disconnectGatt");
1138 (*env)->CallVoidMethod(env, bluetoothGatt, jni_mid_disconnectGatt);
1142 void CANativeLEDisconnectAll(JNIEnv *env)
1144 OIC_LOG_V(DEBUG, TAG, "CANativeLEDisconnectAll");
1146 if(!gGattObjectList)
1148 OIC_LOG(DEBUG, TAG, "[BLE][Native] gGattObjectList is null");
1153 for (index = 0; index < u_arraylist_length(gGattObjectList); index++)
1155 jobject jarrayObj = (jobject) u_arraylist_get(gGattObjectList, index);
1158 OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
1161 CANativeLEDisconnect(env, jarrayObj);
1164 OICFree(gGattObjectList);
1165 gGattObjectList = NULL;
1169 void CANativeLEDiscoverServices(JNIEnv *env, jobject bluetoothGatt)
1171 if(!CALEIsEnableBTAdapter(env))
1173 OIC_LOG(DEBUG, TAG, "[BLE][Native] BT adpater is not enable");
1177 // GATT SERVICE DISCOVERY
1178 OIC_LOG(DEBUG, TAG, "[BLE][Native] GATT SERVICE DISCOVERY");
1180 // get BluetoothGatt class
1181 OIC_LOG(DEBUG, TAG, "[BLE][Native] get BluetoothGatt class");
1182 jclass jni_cid_BluetoothGatt = (*env)->FindClass(env, CLASSPATH_BT_GATT);
1183 if(!jni_cid_BluetoothGatt)
1185 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_cid_BluetoothGatt is null");
1189 OIC_LOG(DEBUG, TAG, "[BLE][Native] discovery gatt services method");
1190 jmethodID jni_mid_discoverServices = (*env)->GetMethodID(env, jni_cid_BluetoothGatt,
1191 "discoverServices","()Z");
1192 if(!jni_mid_discoverServices)
1194 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_mid_discoverServices is null");
1197 // call disconnect gatt method
1198 OIC_LOG(DEBUG, TAG, "[BLE][Native] CALL API - request discovery gatt services");
1199 (*env)->CallBooleanMethod(env, bluetoothGatt, jni_mid_discoverServices);
1202 jboolean CANativeLESendData(JNIEnv *env, jobject bluetoothGatt, jobject gattCharacteristic)
1204 if(!CALEIsEnableBTAdapter(env))
1206 OIC_LOG(DEBUG, TAG, "[BLE][Native] BT adpater is not enable");
1210 // WRITE GATT CHARACTERISTIC
1211 OIC_LOG(DEBUG, TAG, "[BLE][Native] WRITE GATT CHARACTERISTIC");
1213 // get BluetoothGatt class
1214 OIC_LOG(DEBUG, TAG, "[BLE][Native] get BluetoothGatt class");
1215 jclass jni_cid_BluetoothGatt = (*env)->FindClass(env, CLASSPATH_BT_GATT);
1216 if(!jni_cid_BluetoothGatt)
1218 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_cid_BluetoothGatt is null");
1222 OIC_LOG(DEBUG, TAG, "[BLE][Native] write characteristic method");
1223 jmethodID jni_mid_writeCharacteristic = (*env)->GetMethodID(env, jni_cid_BluetoothGatt,
1224 "writeCharacteristic", "(Landroid/bluetooth/BluetoothGattCharacteristic;)Z");
1225 if(!jni_mid_writeCharacteristic)
1227 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_mid_writeCharacteristic is null");
1231 // call disconnect gatt method
1232 OIC_LOG(DEBUG, TAG, "[BLE][Native] CALL API - request to write gatt characteristic");
1233 jboolean ret = (jboolean)(*env)->CallBooleanMethod(env, bluetoothGatt, jni_mid_writeCharacteristic, gattCharacteristic);
1236 OIC_LOG(DEBUG, TAG, "[BLE][Native] writeCharacteristic is success");
1240 OIC_LOG(DEBUG, TAG, "[BLE][Native] writeCharacteristic is failed");
1246 void CANativeReadCharacteristic(JNIEnv *env, jobject bluetoothGatt)
1249 if(!CALEIsEnableBTAdapter(env))
1251 OIC_LOG(DEBUG, TAG, "[BLE][Native] BT adpater is not enable");
1255 jclass jni_cid_BluetoothGatt = (*env)->FindClass(env, CLASSPATH_BT_GATT);
1256 if(!jni_cid_BluetoothGatt)
1258 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_cid_BluetoothGatt is null");
1262 jstring jni_uuid = (*env)->NewStringUTF(env, IOTIVITY_GATT_RX_UUID);
1263 jobject jni_obj_GattCharacteristic = CANativeGetGattService(env, bluetoothGatt, jni_uuid);
1264 if(!jni_obj_GattCharacteristic)
1266 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_obj_GattCharacteristic is null");
1270 OIC_LOG(DEBUG, TAG, "[BLE][Native] read characteristic method");
1271 jmethodID jni_mid_readCharacteristic = (*env)->GetMethodID(env, jni_cid_BluetoothGatt, "readCharacteristic", "(Landroid/bluetooth/BluetoothGattCharacteristic;)Z");
1272 if(!jni_mid_readCharacteristic)
1274 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_mid_readCharacteristic is null");
1278 // call disconnect gatt method
1279 OIC_LOG(DEBUG, TAG, "[BLE][Native] CALL API - request to read gatt characteristic");
1280 jboolean ret = (*env)->CallBooleanMethod(env, bluetoothGatt, jni_mid_readCharacteristic, jni_obj_GattCharacteristic);
1283 OIC_LOG(DEBUG, TAG, "[BLE][Native] readCharacteristic is success");
1287 OIC_LOG(DEBUG, TAG, "[BLE][Native] readCharacteristic is failed");
1291 jboolean CANativeSetCharacteristicNoti(JNIEnv *env, jobject bluetoothGatt, const char* uuid)
1293 if(!CALEIsEnableBTAdapter(env))
1295 OIC_LOG(DEBUG, TAG, "[BLE][Native] BT adpater is not enable");
1299 // get BluetoothGatt class
1300 OIC_LOG(DEBUG, TAG, "[BLE][Native] CANativeSetCharacteristicNoti");
1301 jclass jni_cid_BluetoothGatt = (*env)->FindClass(env, CLASSPATH_BT_GATT);
1302 if(!jni_cid_BluetoothGatt)
1304 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_cid_BluetoothGatt is null");
1308 jstring jni_uuid = (*env)->NewStringUTF(env, uuid);
1309 jobject jni_obj_GattCharacteristic = CANativeGetGattService(env, bluetoothGatt, jni_uuid);
1310 if(!jni_obj_GattCharacteristic)
1312 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_obj_GattCharacteristic is null");
1316 // set Characteristic Notification
1317 jmethodID jni_mid_setNotification = (*env)->GetMethodID(env, jni_cid_BluetoothGatt, "setCharacteristicNotification",
1318 "(Landroid/bluetooth/BluetoothGattCharacteristic;Z)Z");
1319 if(!jni_mid_setNotification)
1321 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_mid_getService is null");
1325 jboolean enable = TRUE;
1326 jboolean ret = (*env)->CallBooleanMethod(env, bluetoothGatt, jni_mid_setNotification, jni_obj_GattCharacteristic, enable);
1329 OIC_LOG(DEBUG, TAG, "[BLE][Native] CALL API - setCharacteristicNotification is success");
1334 OIC_LOG(DEBUG, TAG, "[BLE][Native] CALL API - setCharacteristicNotification is failed");
1339 jobject CANativeGetGattService(JNIEnv *env, jobject bluetoothGatt, jstring characterUUID)
1341 if(!CALEIsEnableBTAdapter(env))
1343 OIC_LOG(DEBUG, TAG, "[BLE][Native] BT adpater is not enable");
1347 // get BluetoothGatt class
1348 OIC_LOG(DEBUG, TAG, "[BLE][Native] CANativeGetGattService");
1349 jclass jni_cid_BluetoothGatt = (*env)->FindClass(env, CLASSPATH_BT_GATT);
1350 if(!jni_cid_BluetoothGatt)
1352 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_cid_BluetoothGatt is null");
1356 jmethodID jni_mid_getService = (*env)->GetMethodID(env, jni_cid_BluetoothGatt, "getService",
1357 "(Ljava/util/UUID;)Landroid/bluetooth/BluetoothGattService;");
1358 if(!jni_mid_getService)
1360 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_mid_getService is null");
1364 jobject jni_obj_service_uuid = CANativeGetUUIDObject(env, IOTIVITY_GATT_SERVIE_UUID);
1365 if(!jni_obj_service_uuid)
1367 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_obj_service_uuid is null");
1371 // get bluetooth gatt service
1372 OIC_LOG(DEBUG, TAG, "[BLE][Native] request to get service");
1373 jobject jni_obj_gattService = (*env)->CallObjectMethod(env, bluetoothGatt, jni_mid_getService, jni_obj_service_uuid);
1375 // get bluetooth gatt service class
1376 jclass jni_cid_BluetoothGattService = (*env)->FindClass(env, "android/bluetooth/BluetoothGattService");
1377 if(!jni_cid_BluetoothGattService)
1379 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_cid_BluetoothGattService is null");
1383 OIC_LOG(DEBUG, TAG, "[BLE][Native] get gatt getCharacteristic method");
1384 jmethodID jni_mid_getCharacteristic = (*env)->GetMethodID(env, jni_cid_BluetoothGattService, "getCharacteristic",
1385 "(Ljava/util/UUID;)Landroid/bluetooth/BluetoothGattCharacteristic;");
1386 if(!jni_mid_getCharacteristic)
1388 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_mid_getCharacteristic is null");
1392 const char* uuid = (*env)->GetStringUTFChars(env, characterUUID, NULL);
1393 jobject jni_obj_tx_uuid = CANativeGetUUIDObject(env, uuid);
1394 if(!jni_obj_tx_uuid)
1396 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_obj_tx_uuid is null");
1400 OIC_LOG(DEBUG, TAG, "[BLE][Native] request to get Characteristic");
1401 jobject jni_obj_GattCharacteristic = (*env)->CallObjectMethod(env, jni_obj_gattService, jni_mid_getCharacteristic, jni_obj_tx_uuid);
1403 return jni_obj_GattCharacteristic;
1406 jobject CANativeCreateGattCharacteristic(JNIEnv *env, jobject bluetoothGatt, jbyteArray data)
1408 if(!CALEIsEnableBTAdapter(env))
1410 OIC_LOG(DEBUG, TAG, "[BLE][Native] BT adpater is not enable");
1414 OIC_LOG(DEBUG, TAG, "[BLE][Native] CANativeCreateGattCharacteristic");
1415 jstring jni_uuid = (*env)->NewStringUTF(env, IOTIVITY_GATT_TX_UUID);
1416 jobject jni_obj_GattCharacteristic = CANativeGetGattService(env, bluetoothGatt, jni_uuid);
1417 if(!jni_obj_GattCharacteristic)
1419 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_obj_GattCharacteristic is null");
1423 jclass jni_cid_BTGattCharacteristic = (*env)->FindClass(env, "android/bluetooth/BluetoothGattCharacteristic");
1424 if(!jni_cid_BTGattCharacteristic)
1426 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_cid_BTGattCharacteristic is null");
1430 OIC_LOG(DEBUG, TAG, "[BLE][Native] set value in Characteristic");
1431 jmethodID jni_mid_setValue = (*env)->GetMethodID(env, jni_cid_BTGattCharacteristic, "setValue",
1433 if(!jni_mid_setValue)
1435 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_mid_setValue is null");
1439 jboolean ret = (*env)->CallBooleanMethod(env, jni_obj_GattCharacteristic, jni_mid_setValue, data);
1442 OIC_LOG(DEBUG, TAG, "[BLE][Native] the locally stored value has been set");
1443 return jni_obj_GattCharacteristic;
1447 OIC_LOG(DEBUG, TAG, "[BLE][Native] the locally stored value hasn't been set");
1452 jbyteArray CANativeGetValueFromCharacteristic(JNIEnv *env, jobject characteristic)
1454 if(!CALEIsEnableBTAdapter(env))
1456 OIC_LOG(DEBUG, TAG, "[BLE][Native] BT adpater is not enable");
1460 jclass jni_cid_BTGattCharacteristic = (*env)->FindClass(env, "android/bluetooth/BluetoothGattCharacteristic");
1461 if(!jni_cid_BTGattCharacteristic)
1463 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_cid_BTGattCharacteristic is null");
1467 OIC_LOG(DEBUG, TAG, "[BLE][Native] get value in Characteristic");
1468 jmethodID jni_mid_getValue = (*env)->GetMethodID(env, jni_cid_BTGattCharacteristic, "getValue",
1470 if(!jni_mid_getValue)
1472 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_mid_getValue is null");
1476 jbyteArray jni_obj_data_array = (*env)->CallObjectMethod(env, characteristic, jni_mid_getValue);
1477 return jni_obj_data_array;
1481 void CANativeCreateUUIDList()
1483 jboolean isAttached = FALSE;
1485 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
1488 OIC_LOG_V(DEBUG, TAG, "Could not get JNIEnv pointer");
1489 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
1493 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
1499 // create new object array
1500 jclass jni_cid_uuid_list = (*env)->FindClass(env, CLASSPATH_BT_UUID);
1501 if(!jni_cid_uuid_list)
1503 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_cid_uuid_list is null");
1507 jobjectArray jni_obj_uuid_list = (jobjectArray)(*env)->NewObjectArray(env, 1, jni_cid_uuid_list, NULL);
1508 if(!jni_obj_uuid_list)
1510 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_obj_uuid_list is null");
1514 // remove previous list and create list again
1515 CANativeRemoveAllDevices(env);
1516 CANativeCreateScanDeviceList(env);
1519 jobject jni_obj_uuid = CANativeGetUUIDObject(env, IOTIVITY_GATT_SERVIE_UUID);
1520 (*env)->SetObjectArrayElement(env, jni_obj_uuid_list, 0, jni_obj_uuid);
1522 gUUIDList = (jobjectArray)(*env)->NewGlobalRef(env, jni_obj_uuid_list);
1525 (*g_jvm)->DetachCurrentThread(g_jvm);
1528 void CANativeCreateScanDeviceList(JNIEnv *env)
1530 OIC_LOG(DEBUG, TAG, "[BLE][Native] CANativeCreateScanDeviceList");
1532 // create new object array
1533 if (gdeviceList == NULL)
1535 OIC_LOG_V(DEBUG, TAG, "Create device list");
1537 gdeviceList = u_arraylist_create();
1541 void CANativeAddScanDeviceToList(JNIEnv *env, jobject device)
1545 OIC_LOG(DEBUG, TAG, "[BLE][Native] device is null");
1551 OIC_LOG(DEBUG, TAG, "[BLE][Native] gdevice_list is null");
1555 jstring jni_remoteAddress = CALEGetAddressFromBTDevice(env, device);
1556 if(!jni_remoteAddress)
1558 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_remoteAddress is null");
1562 const char* remoteAddress = (*env)->GetStringUTFChars(env, jni_remoteAddress, NULL);
1564 if(!CANativeIsDeviceInList(env, remoteAddress)) {
1565 jobject gdevice = (*env)->NewGlobalRef(env, device);
1566 u_arraylist_add(gdeviceList, gdevice);
1567 OIC_LOG_V(DEBUG, TAG, "Set Object to Array as Element");
1571 jboolean CANativeIsDeviceInList(JNIEnv *env, const char* remoteAddress){
1572 // get address value from device list
1575 for (index = 0; index < u_arraylist_length(gdeviceList); index++)
1577 jobject jarrayObj = (jobject) u_arraylist_get(gdeviceList, index);
1580 OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
1584 jstring jni_setAddress = CALEGetAddressFromBTDevice(env, jarrayObj);
1587 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_setAddress is null");
1591 const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
1593 if(!strcmp(remoteAddress, setAddress))
1595 OIC_LOG_V(DEBUG, TAG, "the device is already set");
1604 OIC_LOG_V(DEBUG, TAG, "there are no the device in list. we can add");
1608 void CANativeRemoveAllDevices(JNIEnv *env)
1610 OIC_LOG_V(DEBUG, TAG, "CANativeRemoveAllDevices");
1614 OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceList is null");
1619 for (index = 0; index < u_arraylist_length(gdeviceList); index++)
1621 jobject jarrayObj = (jobject) u_arraylist_get(gdeviceList, index);
1624 OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
1627 (*env)->DeleteGlobalRef(env, jarrayObj);
1630 OICFree(gdeviceList);
1635 void CANativeRemoveDevice(JNIEnv *env, jstring address)
1637 OIC_LOG_V(DEBUG, TAG, "CANativeRemoveDevice");
1641 OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceList is null");
1646 for (index = 0; index < u_arraylist_length(gdeviceList); index++)
1648 jobject jarrayObj = (jobject) u_arraylist_get(gdeviceList, index);
1651 OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
1655 jstring jni_setAddress = CALEGetAddressFromBTDevice(env, jarrayObj);
1658 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_setAddress is null");
1661 const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
1662 const char* remoteAddress = (*env)->GetStringUTFChars(env, address, NULL);
1664 if(!strcmp(setAddress, remoteAddress))
1666 OIC_LOG_V(DEBUG, TAG, "[BLE][Native] remove object : %s", remoteAddress);
1667 (*env)->DeleteGlobalRef(env, jarrayObj);
1669 CAReorderingDeviceList(index);
1673 OIC_LOG(DEBUG, TAG, "[BLE][Native] there are no target object");
1677 void CAReorderingDeviceList(uint32_t index)
1679 if (index >= gdeviceList->length)
1684 if (index < gdeviceList->length - 1)
1686 memmove(&gdeviceList->data[index], &gdeviceList->data[index + 1],
1687 (gdeviceList->length - index - 1) * sizeof(void *));
1690 gdeviceList->size--;
1691 gdeviceList->length--;
1697 void CANativeCreateGattObjList(JNIEnv *env)
1699 OIC_LOG(DEBUG, TAG, "[BLE][Native] CANativeCreateGattObjList");
1701 // create new object array
1702 if (gGattObjectList == NULL)
1704 OIC_LOG_V(DEBUG, TAG, "Create Gatt object list");
1706 gGattObjectList = u_arraylist_create();
1710 void CANativeAddGattobjToList(JNIEnv *env, jobject gatt)
1712 OIC_LOG(DEBUG, TAG, "[BLE][Native] CANativeAddGattobjToList");
1716 OIC_LOG(DEBUG, TAG, "[BLE][Native] gatt is null");
1720 if(!gGattObjectList)
1722 OIC_LOG(DEBUG, TAG, "[BLE][Native] gGattObjectList is null");
1726 jstring jni_remoteAddress = CANativeGetAddressFromGattObj(env, gatt);
1727 if(!jni_remoteAddress)
1729 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_remoteAddress is null");
1733 const char* remoteAddress = (*env)->GetStringUTFChars(env, jni_remoteAddress, NULL);
1735 if(!CANativeIsGattObjInList(env, remoteAddress))
1737 jobject gGatt = (*env)->NewGlobalRef(env, gatt);
1738 u_arraylist_add(gGattObjectList, gGatt);
1739 OIC_LOG_V(DEBUG, TAG, "Set Object to Array as Element");
1743 jboolean CANativeIsGattObjInList(JNIEnv *env, const char* remoteAddress)
1745 OIC_LOG(DEBUG, TAG, "[BLE][Native] CANativeIsGattObjInList");
1748 for (index = 0; index < u_arraylist_length(gGattObjectList); index++)
1751 jobject jarrayObj = (jobject) u_arraylist_get(gGattObjectList, index);
1754 OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
1758 jstring jni_setAddress = CANativeGetAddressFromGattObj(env, jarrayObj);
1761 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_setAddress is null");
1765 const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
1767 if(!strcmp(remoteAddress, setAddress))
1769 OIC_LOG_V(DEBUG, TAG, "the device is already set");
1778 OIC_LOG_V(DEBUG, TAG, "there are no the gatt obejct in list. we can add");
1782 void CANativeRemoveAllGattObjsList(JNIEnv *env)
1784 OIC_LOG_V(DEBUG, TAG, "CANativeRemoveAllGattObjsList");
1786 if(!gGattObjectList)
1788 OIC_LOG(DEBUG, TAG, "[BLE][Native] gGattObjectList is null");
1793 for (index = 0; index < u_arraylist_length(gGattObjectList); index++)
1795 jobject jarrayObj = (jobject) u_arraylist_get(gGattObjectList, index);
1798 OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
1801 (*env)->DeleteGlobalRef(env, jarrayObj);
1804 OICFree(gGattObjectList);
1805 gGattObjectList = NULL;
1809 void CANativeRemoveGattObj(JNIEnv *env, jobject gatt)
1811 OIC_LOG_V(DEBUG, TAG, "CANativeRemoveGattObj");
1813 if(!gGattObjectList)
1815 OIC_LOG(DEBUG, TAG, "[BLE][Native] gGattObjectList is null");
1820 for (index = 0; index < u_arraylist_length(gGattObjectList); index++)
1822 jobject jarrayObj = (jobject) u_arraylist_get(gGattObjectList, index);
1825 OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
1829 jstring jni_setAddress = CANativeGetAddressFromGattObj(env, jarrayObj);
1832 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_setAddress is null");
1835 const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
1837 jstring jni_remoteAddress = CANativeGetAddressFromGattObj(env, gatt);
1838 if(!jni_remoteAddress)
1840 OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_remoteAddress is null");
1843 const char* remoteAddress = (*env)->GetStringUTFChars(env, jni_remoteAddress, NULL);
1845 if(!strcmp(setAddress, remoteAddress))
1847 OIC_LOG_V(DEBUG, TAG, "[BLE][Native] remove object : %s", remoteAddress);
1848 (*env)->DeleteGlobalRef(env, jarrayObj);
1850 CAReorderingGattList(index);
1854 OIC_LOG(DEBUG, TAG, "[BLE][Native] there are no target object");
1858 void CAReorderingGattList(uint32_t index)
1860 if (index >= gGattObjectList->length)
1865 if (index < gGattObjectList->length - 1)
1867 memmove(&gGattObjectList->data[index], &gGattObjectList->data[index + 1],
1868 (gGattObjectList->length - index - 1) * sizeof(void *));
1871 gGattObjectList->size--;
1872 gGattObjectList->length--;
1876 * Check Sent Count for remove gSendBuffer
1878 void CANativeupdateSendCnt(JNIEnv *env)
1881 u_mutex_lock(gThreadMutex);
1885 if(gTargetCnt <= gCurrentSentCnt)
1888 gCurrentSentCnt = 0;
1892 (*env)->DeleteGlobalRef(env, gSendBuffer);
1895 // notity the thread
1896 u_cond_signal(gThreadCond);
1897 gIsFinishSendData = TRUE;
1898 OIC_LOG(DEBUG, TAG, "set signal for send data");
1901 u_mutex_unlock(gThreadMutex);