1 /* ****************************************************************
3 * Copyright 2016 Samsung Electronics All Rights Reserved.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 ******************************************************************/
21 #include "cabtpairinginterface.h"
22 #include "cabtpairing.h"
27 #define TAG "OIC_CA_BT_PAIRING"
30 * pointer to store JavaVM
32 static JavaVM *g_jvm = NULL;
35 * pointer to store context for android callback interface
37 static jobject g_context = NULL;
38 static jobject g_listener = NULL;
40 static const char CLASSPATH_CONTEXT[] = "android/content/Context";
41 static const char METHODID_CONTEXTNONPARAM[] = "()Landroid/content/Context;";
42 static const char CLASSPATH_BT_PAIRING_INTERFACE[] = "org/iotivity/ca/CaBtPairingInterface";
43 static const char CLASSPATH_BT_ADAPTER[] = "android/bluetooth/BluetoothAdapter";
44 static const char METHODID_OBJECTNONPARAM[] = "()Landroid/bluetooth/BluetoothAdapter;";
45 static const char CLASSPATH_BT_DEVICE[] = "android/bluetooth/BluetoothDevice";
47 static void CABTPaitingCreateJNIInterfaceObject(jobject context)
50 OIC_LOG(INFO, TAG, "OICEDRCreateJNIInterfaceObject");
52 if ((*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6) != JNI_OK)
54 OIC_LOG(ERROR, TAG, "Could not get JNIEnv pointer");
58 //getApplicationContext
59 jclass contextClass = (*env)->FindClass(env, CLASSPATH_CONTEXT);
62 OIC_LOG(ERROR, TAG, "Could not get context object class");
66 jmethodID getApplicationContextMethod = (*env)->GetMethodID(env, contextClass,
67 "getApplicationContext",
68 METHODID_CONTEXTNONPARAM);
69 if (!getApplicationContextMethod)
71 OIC_LOG(ERROR, TAG, "Could not get getApplicationContext method");
75 //Create EDRJniInterface instance
76 jclass EDRJniInterface = (*env)->FindClass(env, CLASSPATH_BT_PAIRING_INTERFACE);
79 OIC_LOG(ERROR, TAG, "Could not get CaEdrInterface class");
83 jmethodID EDRInterfaceConstructorMethod = (*env)->GetMethodID(env, EDRJniInterface, "<init>",
84 "(Landroid/content/Context;)V");
85 if (!EDRInterfaceConstructorMethod)
87 OIC_LOG(ERROR, TAG, "Could not get CaEdrInterface constructor method");
91 (*env)->NewObject(env, EDRJniInterface, EDRInterfaceConstructorMethod, context);
92 OIC_LOG(INFO, TAG, "New Object has been created successfully");
95 CAResult_t CABTPairingInitialize(JNIEnv *env, JavaVM *jvm, jobject context)
97 OIC_LOG(INFO, TAG, "CABTPairingInitialize");
101 OIC_LOG(ERROR, TAG, "context is null");
102 return CA_STATUS_FAILED;
106 g_context = (*env)->NewGlobalRef(env, context);
110 /* create java interface instance*/
111 CABTPaitingCreateJNIInterfaceObject(g_context);
116 void CABTPairingSetFoundDeviceListener(jobject listener)
118 g_listener = listener;
121 CAResult_t CABTPairingStartScan(JNIEnv *env)
123 OIC_LOG(INFO, TAG, "CABTPairingStartScan");
126 OIC_LOG(ERROR, TAG, "parameter is null");
127 return CA_STATUS_FAILED;
130 CABTPairingStopScan(env);
132 // get default bt adapter class
133 jclass jni_cid_BTAdapter = (*env)->FindClass(env, CLASSPATH_BT_ADAPTER);
134 if (!jni_cid_BTAdapter)
136 OIC_LOG(ERROR, TAG, "jni_cid_BTAdapter is null");
137 return CA_STATUS_FAILED;
140 // get remote bt adapter method ID
141 jmethodID jni_mid_getDefaultAdapter = (*env)->GetStaticMethodID(env, jni_cid_BTAdapter,
143 METHODID_OBJECTNONPARAM);
144 if (!jni_mid_getDefaultAdapter)
146 OIC_LOG(ERROR, TAG, "jni_mid_getDefaultAdapter is null");
147 return CA_STATUS_FAILED;
150 // get startDiscovery() method ID
151 jmethodID jni_mid_startDiscovery = (*env)->GetMethodID(env, jni_cid_BTAdapter, "startDiscovery",
153 if (!jni_mid_startDiscovery)
155 OIC_LOG(ERROR, TAG, "jni_mid_startDiscovery is null");
156 return CA_STATUS_FAILED;
159 // get bluetooth adapter object
160 jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter,
161 jni_mid_getDefaultAdapter);
162 if (!jni_obj_BTAdapter)
164 OIC_LOG(ERROR, TAG, "jni_obj_BTAdapter is null");
165 return CA_STATUS_FAILED;
168 // call startDiscovery() method
169 jboolean jni_obj_startDiscovery = (*env)->CallBooleanMethod(env, jni_obj_BTAdapter,
170 jni_mid_startDiscovery);
171 if (!jni_obj_startDiscovery)
173 OIC_LOG(ERROR, TAG, "startDiscovery has failed");
174 return CA_STATUS_FAILED;
178 OIC_LOG(INFO, TAG, "startDiscovery has started");
183 CAResult_t CABTPairingStopScan(JNIEnv *env)
185 OIC_LOG(INFO, TAG, "CABTPairingStopScan");
188 OIC_LOG(ERROR, TAG, "parameter is null");
189 return CA_STATUS_FAILED;
192 // get default bt adapter class
193 jclass jni_cid_BTAdapter = (*env)->FindClass(env, CLASSPATH_BT_ADAPTER);
194 if (!jni_cid_BTAdapter)
196 OIC_LOG(ERROR, TAG, "jni_cid_BTAdapter is null");
197 return CA_STATUS_FAILED;
200 // get remote bt adapter method ID
201 jmethodID jni_mid_getDefaultAdapter = (*env)->GetStaticMethodID(env, jni_cid_BTAdapter,
203 METHODID_OBJECTNONPARAM);
204 if (!jni_mid_getDefaultAdapter)
206 OIC_LOG(ERROR, TAG, "jni_mid_getDefaultAdapter is null");
207 return CA_STATUS_FAILED;
210 // get cancelDiscovery() method ID
211 jmethodID jni_mid_cancelDiscovery = (*env)->GetMethodID(env, jni_cid_BTAdapter, "cancelDiscovery",
213 if (!jni_mid_cancelDiscovery)
215 OIC_LOG(ERROR, TAG, "jni_mid_cancelDiscovery is null");
216 return CA_STATUS_FAILED;
219 // gat bt adapter object
220 jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter,
221 jni_mid_getDefaultAdapter);
222 if (!jni_obj_BTAdapter)
224 OIC_LOG(ERROR, TAG, "jni_obj_BTAdapter is null");
225 return CA_STATUS_FAILED;
228 // call cancelDiscovery() method
229 jboolean jni_obj_cancelDiscovery = (*env)->CallBooleanMethod(env, jni_obj_BTAdapter,
230 jni_mid_cancelDiscovery);
231 if (!jni_obj_cancelDiscovery)
233 OIC_LOG(ERROR, TAG, "cancelDiscovery has failed");
234 return CA_STATUS_FAILED;
238 OIC_LOG(INFO, TAG, "cancelDiscovery has started");
243 CAResult_t CABTPairingCreateBond(JNIEnv *env, jobject device)
245 OIC_LOG(INFO, TAG, "CABTPairingCreateBond");
248 OIC_LOG(ERROR, TAG, "parameter is null");
249 return CA_STATUS_FAILED;
252 // get default bt adapter class
253 jclass jni_cid_BTDevice = (*env)->FindClass(env, CLASSPATH_BT_DEVICE);
254 if (!jni_cid_BTDevice)
256 OIC_LOG(ERROR, TAG, "jni_cid_BTDevice is null");
257 return CA_STATUS_FAILED;
260 // get createBond() method ID
261 jmethodID jni_mid_createBond = (*env)->GetMethodID(env, jni_cid_BTDevice, "createBond",
263 if (!jni_mid_createBond)
265 OIC_LOG(ERROR, TAG, "jni_mid_createBond is null");
266 return CA_STATUS_FAILED;
269 // call createBond() method
270 jboolean jni_obj_createBond = (*env)->CallBooleanMethod(env, device, jni_mid_createBond);
271 if (!jni_obj_createBond)
273 OIC_LOG(ERROR, TAG, "createBond has failed");
274 return CA_STATUS_FAILED;
278 OIC_LOG(INFO, TAG, "createBond has started");
283 JNIEXPORT void JNICALL
284 Java_org_iotivity_ca_CaBtPairingInterface_oicEdrStateChangedCallback(JNIEnv *env, jobject obj,
287 OIC_LOG(INFO, TAG, "oicEdrStateChangedCallback");
290 OIC_LOG(ERROR, TAG, "parameter is null");
294 // STATE_ON:12, STATE_OFF:10
295 jclass jni_cid_BTAdapter = (*env)->FindClass(env, CLASSPATH_BT_ADAPTER);
296 if (!jni_cid_BTAdapter)
298 OIC_LOG(ERROR, TAG, "jni_cid_BTAdapter is null");
302 jfieldID id_state_on = (*env)->GetStaticFieldID(env, jni_cid_BTAdapter, "STATE_ON", "I");
305 OIC_LOG(ERROR, TAG, "id_state_on is null");
309 jfieldID id_state_off = (*env)->GetStaticFieldID(env, jni_cid_BTAdapter, "STATE_OFF", "I");
312 OIC_LOG(ERROR, TAG, "id_state_off is null");
316 jint state_on = (*env)->GetStaticIntField(env, jni_cid_BTAdapter, id_state_on);
317 jint state_off = (*env)->GetStaticIntField(env, jni_cid_BTAdapter, id_state_off);
319 if (state_on == status)
321 OIC_LOG(INFO, TAG, "oicEdrStateChangedCallback : state_on");
323 else if (state_off == status)
325 OIC_LOG(INFO, TAG, "oicEdrStateChangedCaloicEdrFoundDeviceCallbacklback : state_off");
329 JNIEXPORT void JNICALL
330 Java_org_iotivity_ca_CaBtPairingInterface_oicEdrBondStateChangedCallback(JNIEnv *env, jobject obj,
333 OIC_LOG(INFO, TAG, "oicEdrBondStateChangedCallback");
339 JNIEXPORT void JNICALL
340 Java_org_iotivity_ca_CaBtPairingInterface_oicEdrFoundDeviceCallback(JNIEnv *env, jobject obj,
343 if (!env || !obj || !device)
353 jclass jni_cls_listener = (*env)->GetObjectClass(env, g_listener);
354 if (!jni_cls_listener)
356 OIC_LOG(ERROR, TAG, "could not get jni_cls_listener");
360 jmethodID jni_mid_listener = (*env)->GetMethodID(env, jni_cls_listener, "onBtDeviceFound",
361 "(Landroid/bluetooth/BluetoothDevice;)V");
362 if (!jni_mid_listener)
364 OIC_LOG(ERROR, TAG, "could not get Method ID");
368 (*env)->CallVoidMethod(env, g_listener, jni_mid_listener, device);