com_android_bluetooth_btservice_AdapterService.cpp revision 6eb32d5f7c30f04da45c3da0974bbb63725a0978
1ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh/* 2ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * Copyright (C) 2012 The Android Open Source Project 3ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * 4ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * Licensed under the Apache License, Version 2.0 (the "License"); 5ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * you may not use this file except in compliance with the License. 6ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * You may obtain a copy of the License at 7ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * 8ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * http://www.apache.org/licenses/LICENSE-2.0 9ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * 10ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * Unless required by applicable law or agreed to in writing, software 11ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * distributed under the License is distributed on an "AS IS" BASIS, 12ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * See the License for the specific language governing permissions and 14ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * limitations under the License. 15ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh */ 16ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 17ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh#define LOG_TAG "BluetoothServiceJni" 186c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie#include "com_android_bluetooth.h" 19cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie#include "hardware/bt_sock.h" 20ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh#include "utils/Log.h" 21ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh#include "utils/misc.h" 22ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh#include "cutils/properties.h" 23ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh#include "android_runtime/AndroidRuntime.h" 24dc8c533e030e6b8625da3dc75c8f768a3242fe16Ruben Brunk#include "android_runtime/Log.h" 25ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 26ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh#include <string.h> 27ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh#include <pthread.h> 28ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 29ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh#include <sys/stat.h> 30ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh#include <fcntl.h> 31ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 32ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshnamespace android { 33ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 346c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie#define ADDITIONAL_NREFS 50 35ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jmethodID method_stateChangeCallback; 36ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jmethodID method_adapterPropertyChangedCallback; 37ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jmethodID method_devicePropertyChangedCallback; 38ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jmethodID method_deviceFoundCallback; 39ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jmethodID method_pinRequestCallback; 40ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jmethodID method_sspRequestCallback; 41ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jmethodID method_bondStateChangeCallback; 4201a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamystatic jmethodID method_aclStateChangeCallback; 43ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jmethodID method_discoveryStateChangeCallback; 441e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavatistatic jmethodID method_setWakeAlarm; 451e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavatistatic jmethodID method_acquireWakeLock; 461e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavatistatic jmethodID method_releaseWakeLock; 47f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadhamstatic jmethodID method_energyInfo; 48ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 49ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic const bt_interface_t *sBluetoothInterface = NULL; 50cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xiestatic const btsock_interface_t *sBluetoothSocketInterface = NULL; 51ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic JNIEnv *callbackEnv = NULL; 52ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 531e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavatistatic jobject sJniAdapterServiceObj; 54ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jobject sJniCallbacksObj; 55ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jfieldID sJniCallbacksField; 56ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 57cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie 586c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xieconst bt_interface_t* getBluetoothInterface() { 596c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie return sBluetoothInterface; 606c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie} 616c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie 626c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew XieJNIEnv* getCallbackEnv() { 63b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom return callbackEnv; 646c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie} 656c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie 666c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xievoid checkAndClearExceptionFromCallback(JNIEnv* env, 67ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh const char* methodName) { 68ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (env->ExceptionCheck()) { 69c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("An exception was thrown by callback '%s'.", methodName); 70ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh LOGE_EX(env); 71ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh env->ExceptionClear(); 72ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 73ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 74ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 75ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic bool checkCallbackThread() { 76ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh JNIEnv* env = AndroidRuntime::getJNIEnv(); 77676cb1bdd1c14c7af56562bab51f168e7f8f6d62Matthew Xie if (callbackEnv != env || callbackEnv == NULL) { 78c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("Callback env check fail: env: %p, callback: %p", env, callbackEnv); 79676cb1bdd1c14c7af56562bab51f168e7f8f6d62Matthew Xie return false; 80676cb1bdd1c14c7af56562bab51f168e7f8f6d62Matthew Xie } 81ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return true; 82ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 83ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 84ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic void adapter_state_change_callback(bt_state_t status) { 85ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!checkCallbackThread()) { 86c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); 87ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return; 88ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 89c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGV("%s: Status is: %d", __FUNCTION__, status); 90ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 91ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh callbackEnv->CallVoidMethod(sJniCallbacksObj, method_stateChangeCallback, (jint)status); 92ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 93ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__); 94ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 95ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 96ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic int get_properties(int num_properties, bt_property_t *properties, jintArray *types, 97ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jobjectArray *props) { 98edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M jbyteArray propVal; 99ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh for (int i = 0; i < num_properties; i++) { 100b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom propVal = callbackEnv->NewByteArray(properties[i].len); 101b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom if (propVal == NULL) goto Fail; 102b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom 103b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom callbackEnv->SetByteArrayRegion(propVal, 0, properties[i].len, 104b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom (jbyte*)properties[i].val); 105b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom callbackEnv->SetObjectArrayElement(*props, i, propVal); 106b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom // Delete reference to propVal 107b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom callbackEnv->DeleteLocalRef(propVal); 108b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom callbackEnv->SetIntArrayRegion(*types, i, 1, (jint *)&properties[i].type); 109ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 110ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return 0; 111ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar GaneshFail: 112ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (propVal) callbackEnv->DeleteLocalRef(propVal); 113c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("Error while allocation of array in %s", __FUNCTION__); 114ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return -1; 115ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 116ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 117ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic void adapter_properties_callback(bt_status_t status, int num_properties, 118ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh bt_property_t *properties) { 119ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jobjectArray props; 120ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jintArray types; 121edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M jbyteArray val; 122edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M jclass mclass; 123edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M 124ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!checkCallbackThread()) { 125c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); 126ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return; 127ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 128ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 129c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGV("%s: Status is: %d, Properties: %d", __FUNCTION__, status, num_properties); 130ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 131ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (status != BT_STATUS_SUCCESS) { 132c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("%s: Status %d is incorrect", __FUNCTION__, status); 133ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return; 134ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 135ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 136edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M val = (jbyteArray) callbackEnv->NewByteArray(num_properties); 137edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M if (val == NULL) { 138e469f16e5a7d99471d7db1b216d422e8d12cc4cfMatthew Xie ALOGE("%s: Error allocating byteArray", __FUNCTION__); 139edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M return; 140edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M } 141edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M 142edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M mclass = callbackEnv->GetObjectClass(val); 143edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M 144edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M /* (BT) Initialize the jobjectArray and jintArray here itself and send the 145edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M initialized array pointers alone to get_properties */ 146edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M 147edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M props = callbackEnv->NewObjectArray(num_properties, mclass, 148edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M NULL); 149edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M if (props == NULL) { 150e469f16e5a7d99471d7db1b216d422e8d12cc4cfMatthew Xie ALOGE("%s: Error allocating object Array for properties", __FUNCTION__); 151edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M return; 152edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M } 153edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M 154edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M types = (jintArray)callbackEnv->NewIntArray(num_properties); 155edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M 156edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M if (types == NULL) { 157e469f16e5a7d99471d7db1b216d422e8d12cc4cfMatthew Xie ALOGE("%s: Error allocating int Array for values", __FUNCTION__); 158edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M return; 159edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M } 160edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M // Delete the reference to val and mclass 161edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M callbackEnv->DeleteLocalRef(mclass); 162edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M callbackEnv->DeleteLocalRef(val); 163edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M 164ff68148a7fb74947ea5e7a337161108363cbe9f5Jaikumar Ganesh if (get_properties(num_properties, properties, &types, &props) < 0) { 165ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (props) callbackEnv->DeleteLocalRef(props); 166ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (types) callbackEnv->DeleteLocalRef(types); 167ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return; 168ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 169ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 170ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh callbackEnv->CallVoidMethod(sJniCallbacksObj, method_adapterPropertyChangedCallback, types, 171ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh props); 172ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__); 1736c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie callbackEnv->DeleteLocalRef(props); 1746c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie callbackEnv->DeleteLocalRef(types); 175ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return; 176ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 177ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 178ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 179ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic void remote_device_properties_callback(bt_status_t status, bt_bdaddr_t *bd_addr, 180ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int num_properties, bt_property_t *properties) { 181ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!checkCallbackThread()) { 182c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); 183ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return; 184ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 185ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 186c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGV("%s: Status is: %d, Properties: %d", __FUNCTION__, status, num_properties); 187ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 188ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (status != BT_STATUS_SUCCESS) { 189c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("%s: Status %d is incorrect", __FUNCTION__, status); 190ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return; 191ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 192ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 1936c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie callbackEnv->PushLocalFrame(ADDITIONAL_NREFS); 1946c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie 1956c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie jobjectArray props; 1966c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie jbyteArray addr; 1976c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie jintArray types; 198edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M jbyteArray val; 199edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M jclass mclass; 200edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M 201edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M val = (jbyteArray) callbackEnv->NewByteArray(num_properties); 202edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M if (val == NULL) { 203e469f16e5a7d99471d7db1b216d422e8d12cc4cfMatthew Xie ALOGE("%s: Error allocating byteArray", __FUNCTION__); 204edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M return; 205edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M } 206edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M 207edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M mclass = callbackEnv->GetObjectClass(val); 208edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M 209edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M /* Initialize the jobjectArray and jintArray here itself and send the 210edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M initialized array pointers alone to get_properties */ 211edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M 212edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M props = callbackEnv->NewObjectArray(num_properties, mclass, 213edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M NULL); 214edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M if (props == NULL) { 215e469f16e5a7d99471d7db1b216d422e8d12cc4cfMatthew Xie ALOGE("%s: Error allocating object Array for properties", __FUNCTION__); 216edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M return; 217edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M } 218edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M 219edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M types = (jintArray)callbackEnv->NewIntArray(num_properties); 220edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M 221edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M if (types == NULL) { 222e469f16e5a7d99471d7db1b216d422e8d12cc4cfMatthew Xie ALOGE("%s: Error allocating int Array for values", __FUNCTION__); 223edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M return; 224edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M } 225edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M // Delete the reference to val and mclass 226edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M callbackEnv->DeleteLocalRef(mclass); 227edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M callbackEnv->DeleteLocalRef(val); 2286c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie 229ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh addr = callbackEnv->NewByteArray(sizeof(bt_bdaddr_t)); 230ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (addr == NULL) goto Fail; 231ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (addr) callbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte*)bd_addr); 232ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 233ff68148a7fb74947ea5e7a337161108363cbe9f5Jaikumar Ganesh if (get_properties(num_properties, properties, &types, &props) < 0) { 234ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (props) callbackEnv->DeleteLocalRef(props); 235ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (types) callbackEnv->DeleteLocalRef(types); 2366c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie callbackEnv->PopLocalFrame(NULL); 237ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return; 238ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 239ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 240ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh callbackEnv->CallVoidMethod(sJniCallbacksObj, method_devicePropertyChangedCallback, addr, 241ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh types, props); 242ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__); 2436c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie callbackEnv->DeleteLocalRef(props); 2446c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie callbackEnv->DeleteLocalRef(types); 245edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M callbackEnv->DeleteLocalRef(addr); 2466c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie callbackEnv->PopLocalFrame(NULL); 247ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return; 248ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 249ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar GaneshFail: 250c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("Error while allocation byte array in %s", __FUNCTION__); 251ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 252ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 253ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 254ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic void device_found_callback(int num_properties, bt_property_t *properties) { 255ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jbyteArray addr = NULL; 256ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int addr_index; 257ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 258ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh for (int i = 0; i < num_properties; i++) { 259ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (properties[i].type == BT_PROPERTY_BDADDR) { 260ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh addr = callbackEnv->NewByteArray(properties[i].len); 261ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (addr) { 262ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh callbackEnv->SetByteArrayRegion(addr, 0, properties[i].len, 263ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh (jbyte*)properties[i].val); 264ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh addr_index = i; 265ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } else { 266c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("Address is NULL (unable to allocate) in %s", __FUNCTION__); 267ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return; 268ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 269ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 270ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 271ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (addr == NULL) { 272c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("Address is NULL in %s", __FUNCTION__); 273ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return; 274ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 275ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 276c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGV("%s: Properties: %d, Address: %s", __FUNCTION__, num_properties, 277ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh (const char *)properties[addr_index].val); 278ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 279ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh remote_device_properties_callback(BT_STATUS_SUCCESS, (bt_bdaddr_t *)properties[addr_index].val, 280ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh num_properties, properties); 281ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 282ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh callbackEnv->CallVoidMethod(sJniCallbacksObj, method_deviceFoundCallback, addr); 283ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__); 2846c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie callbackEnv->DeleteLocalRef(addr); 285ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 286ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 287ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic void bond_state_changed_callback(bt_status_t status, bt_bdaddr_t *bd_addr, 288ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh bt_bond_state_t state) { 289ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jbyteArray addr; 290ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int i; 291ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!checkCallbackThread()) { 292c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); 293ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return; 294ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 295ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!bd_addr) { 296c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("Address is null in %s", __FUNCTION__); 297ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return; 298ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 299ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh addr = callbackEnv->NewByteArray(sizeof(bt_bdaddr_t)); 300ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (addr == NULL) { 301c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("Address allocation failed in %s", __FUNCTION__); 302ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return; 303ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 304ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh callbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte *)bd_addr); 305ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 306ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh callbackEnv->CallVoidMethod(sJniCallbacksObj, method_bondStateChangeCallback, (jint) status, 307ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh addr, (jint)state); 308ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__); 3096c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie callbackEnv->DeleteLocalRef(addr); 310ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 311ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 31201a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamystatic void acl_state_changed_callback(bt_status_t status, bt_bdaddr_t *bd_addr, 31301a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy bt_acl_state_t state) 31401a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy{ 31501a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy jbyteArray addr; 31601a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy int i; 31701a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy if (!checkCallbackThread()) { 318e469f16e5a7d99471d7db1b216d422e8d12cc4cfMatthew Xie ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); 31901a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy return; 32001a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy } 32101a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy if (!bd_addr) { 322e469f16e5a7d99471d7db1b216d422e8d12cc4cfMatthew Xie ALOGE("Address is null in %s", __FUNCTION__); 32301a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy return; 32401a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy } 32501a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy addr = callbackEnv->NewByteArray(sizeof(bt_bdaddr_t)); 32601a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy if (addr == NULL) { 327e469f16e5a7d99471d7db1b216d422e8d12cc4cfMatthew Xie ALOGE("Address allocation failed in %s", __FUNCTION__); 32801a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy return; 32901a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy } 33001a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy callbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte *)bd_addr); 33101a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy 33201a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy callbackEnv->CallVoidMethod(sJniCallbacksObj, method_aclStateChangeCallback, (jint) status, 33301a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy addr, (jint)state); 33401a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__); 33501a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy callbackEnv->DeleteLocalRef(addr); 33601a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy} 33701a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy 338ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic void discovery_state_changed_callback(bt_discovery_state_t state) { 339ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jbyteArray addr; 340ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!checkCallbackThread()) { 341c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); 342ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return; 343ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 344ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 345c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGV("%s: DiscoveryState:%d ", __FUNCTION__, state); 346ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 347ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh callbackEnv->CallVoidMethod(sJniCallbacksObj, method_discoveryStateChangeCallback, 348ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh (jint)state); 349ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 350ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__); 351ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 352ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 353244e9c62a85a4b94e21bf1a8dee456e22bc767c4Casper Bondestatic void pin_request_callback(bt_bdaddr_t *bd_addr, bt_bdname_t *bdname, uint32_t cod, 354244e9c62a85a4b94e21bf1a8dee456e22bc767c4Casper Bonde bool min_16_digits) { 355ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jbyteArray addr, devname; 356ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!checkCallbackThread()) { 357c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); 358ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return; 359ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 360ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!bd_addr) { 361c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("Address is null in %s", __FUNCTION__); 362ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return; 363ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 364ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 365ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh addr = callbackEnv->NewByteArray(sizeof(bt_bdaddr_t)); 366ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (addr == NULL) goto Fail; 36761c4100eb0606f8ba630f5c45d07a88d612fbc85Matthew Xie callbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte*)bd_addr); 368ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 369ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh devname = callbackEnv->NewByteArray(sizeof(bt_bdname_t)); 370ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (devname == NULL) goto Fail; 371ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 372ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh callbackEnv->SetByteArrayRegion(devname, 0, sizeof(bt_bdname_t), (jbyte*)bdname); 373ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 374244e9c62a85a4b94e21bf1a8dee456e22bc767c4Casper Bonde callbackEnv->CallVoidMethod(sJniCallbacksObj, method_pinRequestCallback, addr, devname, cod, 375244e9c62a85a4b94e21bf1a8dee456e22bc767c4Casper Bonde min_16_digits); 376ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 377ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__); 3786c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie callbackEnv->DeleteLocalRef(addr); 3796c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie callbackEnv->DeleteLocalRef(devname); 380ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return; 381ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 382ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar GaneshFail: 383ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (addr) callbackEnv->DeleteLocalRef(addr); 384ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (devname) callbackEnv->DeleteLocalRef(devname); 385c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("Error while allocating in: %s", __FUNCTION__); 386ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 387ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 388ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic void ssp_request_callback(bt_bdaddr_t *bd_addr, bt_bdname_t *bdname, uint32_t cod, 389ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh bt_ssp_variant_t pairing_variant, uint32_t pass_key) { 390ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jbyteArray addr, devname; 391ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!checkCallbackThread()) { 392c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); 393ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return; 394ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 395ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!bd_addr) { 396c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("Address is null in %s", __FUNCTION__); 397ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return; 398ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 399ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 400ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh addr = callbackEnv->NewByteArray(sizeof(bt_bdaddr_t)); 401ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (addr == NULL) goto Fail; 402ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh callbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte *)bd_addr); 403ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 404ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh devname = callbackEnv->NewByteArray(sizeof(bt_bdname_t)); 405ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (devname == NULL) goto Fail; 406ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh callbackEnv->SetByteArrayRegion(devname, 0, sizeof(bt_bdname_t), (jbyte*)bdname); 407ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 408ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh callbackEnv->CallVoidMethod(sJniCallbacksObj, method_sspRequestCallback, addr, devname, cod, 409ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh (jint) pairing_variant, pass_key); 410ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 411ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__); 4126c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie callbackEnv->DeleteLocalRef(addr); 4136c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie callbackEnv->DeleteLocalRef(devname); 414ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return; 415ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 416ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar GaneshFail: 417ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (addr) callbackEnv->DeleteLocalRef(addr); 418ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (devname) callbackEnv->DeleteLocalRef(devname); 419ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 420c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("Error while allocating in: %s", __FUNCTION__); 421ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 422ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 423ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic void callback_thread_event(bt_cb_thread_evt event) { 424ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh JavaVM* vm = AndroidRuntime::getJavaVM(); 425ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (event == ASSOCIATE_JVM) { 426ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh JavaVMAttachArgs args; 427ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh char name[] = "BT Service Callback Thread"; 428b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom args.version = JNI_VERSION_1_6; 429ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh args.name = name; 430ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh args.group = NULL; 431ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh vm->AttachCurrentThread(&callbackEnv, &args); 432c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGV("Callback thread attached: %p", callbackEnv); 433ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } else if (event == DISASSOCIATE_JVM) { 434ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!checkCallbackThread()) { 435c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); 436ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return; 437ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 438ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh vm->DetachCurrentThread(); 439ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 440ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 441ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 44203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void dut_mode_recv_callback (uint16_t opcode, uint8_t *buf, uint8_t len) { 44303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 44403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 44503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void le_test_mode_recv_callback (bt_status_t status, uint16_t packet_count) { 44603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta 44703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta ALOGV("%s: status:%d packet_count:%d ", __FUNCTION__, status, packet_count); 44803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta} 449f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham 450f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadhamstatic void energy_info_recv_callback(bt_activity_energy_info *p_energy_info) 451f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham{ 452f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham if (!checkCallbackThread()) { 453f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); 454f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham return; 455f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham } 456f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham 457d981566d5912bfd66fc265508e5b0c43dce76f82Prerepa Viswanadham callbackEnv->CallVoidMethod(sJniAdapterServiceObj, method_energyInfo, p_energy_info->status, 458f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham p_energy_info->ctrl_state, p_energy_info->tx_time, p_energy_info->rx_time, 459f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham p_energy_info->idle_time, p_energy_info->energy_used); 460f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham 461f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__); 462f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham} 463f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham 4641e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavatistatic bt_callbacks_t sBluetoothCallbacks = { 465ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh sizeof(sBluetoothCallbacks), 466ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh adapter_state_change_callback, 467ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh adapter_properties_callback, 468ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh remote_device_properties_callback, 469ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh device_found_callback, 470ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh discovery_state_changed_callback, 471ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh pin_request_callback, 472ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh ssp_request_callback, 473ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh bond_state_changed_callback, 47401a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy acl_state_changed_callback, 475ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh callback_thread_event, 47603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta dut_mode_recv_callback, 477f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham le_test_mode_recv_callback, 478f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham energy_info_recv_callback 479ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}; 480ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 4811e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati// The callback to call when the wake alarm fires. 4821e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavatistatic alarm_cb sAlarmCallback; 4831e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati 4841e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati// The data to pass to the wake alarm callback. 4851e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavatistatic void *sAlarmCallbackData; 4861e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati 487beccdc6d1647c56c91ddfd14f7990371168fb870Sharvil Nanavatistatic JavaVMAttachArgs sAttachArgs = { 488beccdc6d1647c56c91ddfd14f7990371168fb870Sharvil Nanavati .version = JNI_VERSION_1_6, 489beccdc6d1647c56c91ddfd14f7990371168fb870Sharvil Nanavati .name = "bluedroid wake/alarm thread", 490beccdc6d1647c56c91ddfd14f7990371168fb870Sharvil Nanavati .group = NULL 491beccdc6d1647c56c91ddfd14f7990371168fb870Sharvil Nanavati}; 492beccdc6d1647c56c91ddfd14f7990371168fb870Sharvil Nanavati 4935a60e47497f21f64e6d79420dc4c56c1907df22akschulzstatic bool set_wake_alarm_callout(uint64_t delay_millis, bool should_wake, 4945a60e47497f21f64e6d79420dc4c56c1907df22akschulz alarm_cb cb, void *data) { 4951e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati JNIEnv *env; 4961e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati JavaVM *vm = AndroidRuntime::getJavaVM(); 4971e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati jint status = vm->GetEnv((void **)&env, JNI_VERSION_1_6); 4981e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati 4991e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati if (status != JNI_OK && status != JNI_EDETACHED) { 5001e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati ALOGE("%s unable to get environment for JNI call", __func__); 5011e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati return false; 5021e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati } 5031e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati 504beccdc6d1647c56c91ddfd14f7990371168fb870Sharvil Nanavati if (status == JNI_EDETACHED && vm->AttachCurrentThread(&env, &sAttachArgs) != 0) { 5051e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati ALOGE("%s unable to attach thread to VM", __func__); 5061e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati return false; 5071e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati } 5081e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati 509717be4e8209e4c24d8a1e395f65f86aee5bb0e69Andre Eisenbach sAlarmCallback = cb; 510717be4e8209e4c24d8a1e395f65f86aee5bb0e69Andre Eisenbach sAlarmCallbackData = data; 511717be4e8209e4c24d8a1e395f65f86aee5bb0e69Andre Eisenbach 5121e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati jboolean jshould_wake = should_wake ? JNI_TRUE : JNI_FALSE; 5135a60e47497f21f64e6d79420dc4c56c1907df22akschulz jboolean ret = env->CallBooleanMethod(sJniAdapterServiceObj, method_setWakeAlarm, 5145a60e47497f21f64e6d79420dc4c56c1907df22akschulz (jlong)delay_millis, jshould_wake); 515717be4e8209e4c24d8a1e395f65f86aee5bb0e69Andre Eisenbach if (!ret) { 516717be4e8209e4c24d8a1e395f65f86aee5bb0e69Andre Eisenbach sAlarmCallback = NULL; 517717be4e8209e4c24d8a1e395f65f86aee5bb0e69Andre Eisenbach sAlarmCallbackData = NULL; 5181e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati } 5191e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati 5201e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati if (status == JNI_EDETACHED) { 5211e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati vm->DetachCurrentThread(); 5221e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati } 5231e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati 5241e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati return !!ret; 5251e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati} 5261e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati 5271e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavatistatic int acquire_wake_lock_callout(const char *lock_name) { 5281e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati JNIEnv *env; 5291e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati JavaVM *vm = AndroidRuntime::getJavaVM(); 5301e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati jint status = vm->GetEnv((void **)&env, JNI_VERSION_1_6); 5311e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati if (status != JNI_OK && status != JNI_EDETACHED) { 5321e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati ALOGE("%s unable to get environment for JNI call", __func__); 5331e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati return BT_STATUS_FAIL; 5341e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati } 535beccdc6d1647c56c91ddfd14f7990371168fb870Sharvil Nanavati if (status == JNI_EDETACHED && vm->AttachCurrentThread(&env, &sAttachArgs) != 0) { 5361e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati ALOGE("%s unable to attach thread to VM", __func__); 5371e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati return BT_STATUS_FAIL; 5381e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati } 5391e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati 5401e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati jboolean ret = JNI_FALSE; 5411e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati jstring lock_name_jni = env->NewStringUTF(lock_name); 5421e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati if (lock_name_jni) { 5431e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati ret = env->CallBooleanMethod(sJniAdapterServiceObj, method_acquireWakeLock, lock_name_jni); 5441e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati env->DeleteLocalRef(lock_name_jni); 5451e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati } else { 5461e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati ALOGE("%s unable to allocate string: %s", __func__, lock_name); 5471e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati } 5481e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati 5491e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati if (status == JNI_EDETACHED) { 5501e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati vm->DetachCurrentThread(); 5511e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati } 5521e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati 5531e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati return ret ? BT_STATUS_SUCCESS : BT_STATUS_FAIL; 5541e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati} 5551e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati 5561e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavatistatic int release_wake_lock_callout(const char *lock_name) { 5571e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati JNIEnv *env; 5581e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati JavaVM *vm = AndroidRuntime::getJavaVM(); 5591e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati jint status = vm->GetEnv((void **)&env, JNI_VERSION_1_6); 5601e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati 5611e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati if (status != JNI_OK && status != JNI_EDETACHED) { 5621e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati ALOGE("%s unable to get environment for JNI call", __func__); 5631e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati return BT_STATUS_FAIL; 5641e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati } 565beccdc6d1647c56c91ddfd14f7990371168fb870Sharvil Nanavati if (status == JNI_EDETACHED && vm->AttachCurrentThread(&env, &sAttachArgs) != 0) { 5661e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati ALOGE("%s unable to attach thread to VM", __func__); 5671e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati return BT_STATUS_FAIL; 5681e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati } 5691e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati jboolean ret = JNI_FALSE; 5701e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati jstring lock_name_jni = env->NewStringUTF(lock_name); 5711e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati if (lock_name_jni) { 5721e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati ret = env->CallBooleanMethod(sJniAdapterServiceObj, method_releaseWakeLock, lock_name_jni); 5731e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati env->DeleteLocalRef(lock_name_jni); 5741e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati } else { 5751e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati ALOGE("%s unable to allocate string: %s", __func__, lock_name); 5761e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati } 5771e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati if (status == JNI_EDETACHED) { 5781e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati vm->DetachCurrentThread(); 5791e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati } 5801e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati return ret ? BT_STATUS_SUCCESS : BT_STATUS_FAIL; 5811e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati} 5821e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati 5831e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati// Called by Java code when alarm is fired. A wake lock is held by the caller 5841e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati// over the duration of this callback. 5851e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavatistatic void alarmFiredNative(JNIEnv *env, jobject obj) { 586717be4e8209e4c24d8a1e395f65f86aee5bb0e69Andre Eisenbach if (sAlarmCallback) { 587717be4e8209e4c24d8a1e395f65f86aee5bb0e69Andre Eisenbach sAlarmCallback(sAlarmCallbackData); 588717be4e8209e4c24d8a1e395f65f86aee5bb0e69Andre Eisenbach } else { 589717be4e8209e4c24d8a1e395f65f86aee5bb0e69Andre Eisenbach ALOGE("%s() - Alarm fired with callback not set!", __FUNCTION__); 590717be4e8209e4c24d8a1e395f65f86aee5bb0e69Andre Eisenbach } 5911e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati} 5921e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati 5931e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavatistatic bt_os_callouts_t sBluetoothOsCallouts = { 5941e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati sizeof(sBluetoothOsCallouts), 5951e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati set_wake_alarm_callout, 5961e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati acquire_wake_lock_callout, 5971e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati release_wake_lock_callout, 5981e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati}; 5991e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati 600bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde 6012c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta 602ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic void classInitNative(JNIEnv* env, jclass clazz) { 603ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int err; 604ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh hw_module_t* module; 605ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 606ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jclass jniCallbackClass = 607ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh env->FindClass("com/android/bluetooth/btservice/JniCallbacks"); 608ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh sJniCallbacksField = env->GetFieldID(clazz, "mJniCallbacks", 609ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh "Lcom/android/bluetooth/btservice/JniCallbacks;"); 610ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 611ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh method_stateChangeCallback = env->GetMethodID(jniCallbackClass, "stateChangeCallback", "(I)V"); 612ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 613ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh method_adapterPropertyChangedCallback = env->GetMethodID(jniCallbackClass, 614ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh "adapterPropertyChangedCallback", 615ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh "([I[[B)V"); 616ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh method_discoveryStateChangeCallback = env->GetMethodID(jniCallbackClass, 617ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh "discoveryStateChangeCallback", "(I)V"); 618ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 619ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh method_devicePropertyChangedCallback = env->GetMethodID(jniCallbackClass, 620ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh "devicePropertyChangedCallback", 621ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh "([B[I[[B)V"); 622ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh method_deviceFoundCallback = env->GetMethodID(jniCallbackClass, "deviceFoundCallback", "([B)V"); 623ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh method_pinRequestCallback = env->GetMethodID(jniCallbackClass, "pinRequestCallback", 624244e9c62a85a4b94e21bf1a8dee456e22bc767c4Casper Bonde "([B[BIZ)V"); 625ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh method_sspRequestCallback = env->GetMethodID(jniCallbackClass, "sspRequestCallback", 626ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh "([B[BIII)V"); 627ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 628ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh method_bondStateChangeCallback = env->GetMethodID(jniCallbackClass, 629ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh "bondStateChangeCallback", "(I[BI)V"); 630ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 63101a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy method_aclStateChangeCallback = env->GetMethodID(jniCallbackClass, 63201a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy "aclStateChangeCallback", "(I[BI)V"); 6331e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati 6341e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati method_setWakeAlarm = env->GetMethodID(clazz, "setWakeAlarm", "(JZ)Z"); 6351e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati method_acquireWakeLock = env->GetMethodID(clazz, "acquireWakeLock", "(Ljava/lang/String;)Z"); 6361e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati method_releaseWakeLock = env->GetMethodID(clazz, "releaseWakeLock", "(Ljava/lang/String;)Z"); 637f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham method_energyInfo = env->GetMethodID(clazz, "energyInfoCallback", "(IIJJJJ)V"); 6381e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati 639ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh char value[PROPERTY_VALUE_MAX]; 640ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh property_get("bluetooth.mock_stack", value, ""); 641ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 642ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh const char *id = (strcmp(value, "1")? BT_STACK_MODULE_ID : BT_STACK_TEST_MODULE_ID); 643ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 644ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh err = hw_get_module(id, (hw_module_t const**)&module); 645ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 646ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (err == 0) { 647ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh hw_device_t* abstraction; 648ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh err = module->methods->open(module, id, &abstraction); 649ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (err == 0) { 650ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh bluetooth_module_t* btStack = (bluetooth_module_t *)abstraction; 651ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh sBluetoothInterface = btStack->get_bluetooth_interface(); 652ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } else { 653c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("Error while opening Bluetooth library"); 654ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 655ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } else { 656c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("No Bluetooth Library found"); 657ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 658ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 659ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 660ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic bool initNative(JNIEnv* env, jobject obj) { 661c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGV("%s:",__FUNCTION__); 662ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 6631e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati sJniAdapterServiceObj = env->NewGlobalRef(obj); 664ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh sJniCallbacksObj = env->NewGlobalRef(env->GetObjectField(obj, sJniCallbacksField)); 665ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 666ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (sBluetoothInterface) { 667ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int ret = sBluetoothInterface->init(&sBluetoothCallbacks); 668ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (ret != BT_STATUS_SUCCESS) { 6691e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati ALOGE("Error while setting the callbacks: %d\n", ret); 6701e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati sBluetoothInterface = NULL; 6711e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati return JNI_FALSE; 6721e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati } 6731e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati ret = sBluetoothInterface->set_os_callouts(&sBluetoothOsCallouts); 6741e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati if (ret != BT_STATUS_SUCCESS) { 6751e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati ALOGE("Error while setting Bluetooth callouts: %d\n", ret); 6761e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati sBluetoothInterface->cleanup(); 677ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh sBluetoothInterface = NULL; 678ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return JNI_FALSE; 679ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 6801e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati 681cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie if ( (sBluetoothSocketInterface = (btsock_interface_t *) 682cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie sBluetoothInterface->get_profile_interface(BT_PROFILE_SOCKETS_ID)) == NULL) { 683c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("Error getting socket interface"); 684cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie } 6852c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta 686ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return JNI_TRUE; 687ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 688ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return JNI_FALSE; 689ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 690ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 691ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic bool cleanupNative(JNIEnv *env, jobject obj) { 692c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGV("%s:",__FUNCTION__); 693ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 694ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jboolean result = JNI_FALSE; 695ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!sBluetoothInterface) return result; 696ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 697ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh sBluetoothInterface->cleanup(); 698e469f16e5a7d99471d7db1b216d422e8d12cc4cfMatthew Xie ALOGI("%s: return from cleanup",__FUNCTION__); 6996654f5c903de510a70f9e72cd5ad7837b615d93ffredc 700ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh env->DeleteGlobalRef(sJniCallbacksObj); 7011e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati env->DeleteGlobalRef(sJniAdapterServiceObj); 702ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return JNI_TRUE; 703ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 704ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 705ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean enableNative(JNIEnv* env, jobject obj) { 706c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGV("%s:",__FUNCTION__); 707ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 708ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jboolean result = JNI_FALSE; 709ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!sBluetoothInterface) return result; 710ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 711ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int ret = sBluetoothInterface->enable(); 7128812b408f52e55394195c4827eb587a610b054c9Matthew Xie result = (ret == BT_STATUS_SUCCESS || ret == BT_STATUS_DONE) ? JNI_TRUE : JNI_FALSE; 713ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return result; 714ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 715ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 716ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean disableNative(JNIEnv* env, jobject obj) { 717c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGV("%s:",__FUNCTION__); 718ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 719ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jboolean result = JNI_FALSE; 720ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!sBluetoothInterface) return result; 721ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 722ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int ret = sBluetoothInterface->disable(); 723ad9fff218081d2f49471487d37387c764d69ed29YK Jeffrey Chao /* Retrun JNI_FALSE only when BTIF explicitly reports 724ad9fff218081d2f49471487d37387c764d69ed29YK Jeffrey Chao BT_STATUS_FAIL. It is fine for the BT_STATUS_NOT_READY 725ad9fff218081d2f49471487d37387c764d69ed29YK Jeffrey Chao case which indicates that stack had not been enabled. 726ad9fff218081d2f49471487d37387c764d69ed29YK Jeffrey Chao */ 727ad9fff218081d2f49471487d37387c764d69ed29YK Jeffrey Chao result = (ret == BT_STATUS_FAIL) ? JNI_FALSE : JNI_TRUE; 728ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return result; 729ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 730ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 731ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean startDiscoveryNative(JNIEnv* env, jobject obj) { 732c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGV("%s:",__FUNCTION__); 733ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 734ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jboolean result = JNI_FALSE; 735ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!sBluetoothInterface) return result; 736ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 737ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int ret = sBluetoothInterface->start_discovery(); 738ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE; 739ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return result; 740ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 741ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 742ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean cancelDiscoveryNative(JNIEnv* env, jobject obj) { 743c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGV("%s:",__FUNCTION__); 744ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 745ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jboolean result = JNI_FALSE; 746ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!sBluetoothInterface) return result; 747ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 748ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int ret = sBluetoothInterface->cancel_discovery(); 749ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE; 750ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return result; 751ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 752ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 753db681f3973bd8a088a878fd6f41d4330cdbc5522Andre Eisenbachstatic jboolean createBondNative(JNIEnv* env, jobject obj, jbyteArray address, jint transport) { 754c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGV("%s:",__FUNCTION__); 755ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 756ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jbyte *addr; 757ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jboolean result = JNI_FALSE; 758ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 759ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!sBluetoothInterface) return result; 760ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 761ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh addr = env->GetByteArrayElements(address, NULL); 762ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (addr == NULL) { 763ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jniThrowIOException(env, EINVAL); 764ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return result; 765ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 766ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 767db681f3973bd8a088a878fd6f41d4330cdbc5522Andre Eisenbach int ret = sBluetoothInterface->create_bond((bt_bdaddr_t *)addr, transport); 768b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom env->ReleaseByteArrayElements(address, addr, 0); 769ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE; 770ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 771ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return result; 772ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 773ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 774ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean removeBondNative(JNIEnv* env, jobject obj, jbyteArray address) { 775c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGV("%s:",__FUNCTION__); 776ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 777ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jbyte *addr; 778ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jboolean result; 779ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!sBluetoothInterface) return JNI_FALSE; 780ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 781ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh addr = env->GetByteArrayElements(address, NULL); 782ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (addr == NULL) { 783ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jniThrowIOException(env, EINVAL); 784ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return JNI_FALSE; 785ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 786ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 787ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int ret = sBluetoothInterface->remove_bond((bt_bdaddr_t *)addr); 788b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom env->ReleaseByteArrayElements(address, addr, 0); 789ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE; 790ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 791ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return result; 792ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 793ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 794ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean cancelBondNative(JNIEnv* env, jobject obj, jbyteArray address) { 795c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGV("%s:",__FUNCTION__); 796ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 797ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jbyte *addr; 798ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jboolean result; 799ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!sBluetoothInterface) return JNI_FALSE; 800ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 801ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh addr = env->GetByteArrayElements(address, NULL); 802ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (addr == NULL) { 803ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jniThrowIOException(env, EINVAL); 804ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return JNI_FALSE; 805ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 806ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 807ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int ret = sBluetoothInterface->cancel_bond((bt_bdaddr_t *)addr); 808b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom env->ReleaseByteArrayElements(address, addr, 0); 809ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE; 810ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 811ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return result; 812ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 813ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 8141e3e1ddf939bf71616245e1e100964568053d665Andre Eisenbachstatic int getConnectionStateNative(JNIEnv* env, jobject obj, jbyteArray address) { 8153636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach ALOGV("%s:",__FUNCTION__); 8163636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach if (!sBluetoothInterface) return JNI_FALSE; 8173636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach 8183636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach jbyte *addr = env->GetByteArrayElements(address, NULL); 8193636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach if (addr == NULL) { 8203636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach jniThrowIOException(env, EINVAL); 8213636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach return JNI_FALSE; 8223636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach } 8233636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach 8243636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach int ret = sBluetoothInterface->get_connection_state((bt_bdaddr_t *)addr); 8253636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach env->ReleaseByteArrayElements(address, addr, 0); 8263636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach 8271e3e1ddf939bf71616245e1e100964568053d665Andre Eisenbach return ret; 8283636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach} 8293636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach 830ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean pinReplyNative(JNIEnv *env, jobject obj, jbyteArray address, jboolean accept, 831ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jint len, jbyteArray pinArray) { 832c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGV("%s:",__FUNCTION__); 833ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 834ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jbyte *addr, *pinPtr = NULL; 835ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jboolean result = JNI_FALSE; 836ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!sBluetoothInterface) return result; 837ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 838ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh addr = env->GetByteArrayElements(address, NULL); 839ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (addr == NULL) { 840ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jniThrowIOException(env, EINVAL); 841ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return result; 842ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 843ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 844ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (accept) { 845ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh pinPtr = env->GetByteArrayElements(pinArray, NULL); 846ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (pinPtr == NULL) { 847ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jniThrowIOException(env, EINVAL); 848b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom env->ReleaseByteArrayElements(address, addr, 0); 849ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return result; 850ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 851ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 852ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 853ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int ret = sBluetoothInterface->pin_reply((bt_bdaddr_t*)addr, accept, len, 854ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh (bt_pin_code_t *) pinPtr); 855b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom env->ReleaseByteArrayElements(address, addr, 0); 856b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom env->ReleaseByteArrayElements(pinArray, pinPtr, 0); 857ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE; 858ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 859ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return result; 860ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 861ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 862ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean sspReplyNative(JNIEnv *env, jobject obj, jbyteArray address, 863581bb31a8165ff0f9c7d638cfe4a81aaaafa2dedJaikumar Ganesh jint type, jboolean accept, jint passkey) { 864c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGV("%s:",__FUNCTION__); 865ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 866ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jbyte *addr; 867ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jboolean result = JNI_FALSE; 868ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!sBluetoothInterface) return result; 869ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 870ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh addr = env->GetByteArrayElements(address, NULL); 871ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (addr == NULL) { 872ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jniThrowIOException(env, EINVAL); 873ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return result; 874ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 875ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 876581bb31a8165ff0f9c7d638cfe4a81aaaafa2dedJaikumar Ganesh int ret = sBluetoothInterface->ssp_reply((bt_bdaddr_t *)addr, 877581bb31a8165ff0f9c7d638cfe4a81aaaafa2dedJaikumar Ganesh (bt_ssp_variant_t) type, accept, passkey); 878b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom env->ReleaseByteArrayElements(address, addr, 0); 879ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE; 880ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 881ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return result; 882ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 883ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 884ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean setAdapterPropertyNative(JNIEnv *env, jobject obj, jint type, jbyteArray value) { 885c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGV("%s:",__FUNCTION__); 886ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 887ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jbyte *val; 888ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jboolean result = JNI_FALSE; 889ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!sBluetoothInterface) return result; 890ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 891ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh val = env->GetByteArrayElements(value, NULL); 892ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh bt_property_t prop; 893ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh prop.type = (bt_property_type_t) type; 894ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh prop.len = env->GetArrayLength(value); 895ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh prop.val = val; 896ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 897ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int ret = sBluetoothInterface->set_adapter_property(&prop); 898b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom env->ReleaseByteArrayElements(value, val, 0); 899ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE; 900ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 901ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return result; 902ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 903ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 904ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean getAdapterPropertiesNative(JNIEnv *env, jobject obj) { 905c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGV("%s:",__FUNCTION__); 906ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 907ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jboolean result = JNI_FALSE; 908ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!sBluetoothInterface) return result; 909ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 910ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int ret = sBluetoothInterface->get_adapter_properties(); 911ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE; 912ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 913ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return result; 914ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 915ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 916ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean getAdapterPropertyNative(JNIEnv *env, jobject obj, jint type) { 917c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGV("%s:",__FUNCTION__); 918ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 919ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jboolean result = JNI_FALSE; 920ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!sBluetoothInterface) return result; 921ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 922ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int ret = sBluetoothInterface->get_adapter_property((bt_property_type_t) type); 923ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE; 924ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 925ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return result; 926ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 927ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 928ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean getDevicePropertyNative(JNIEnv *env, jobject obj, jbyteArray address, jint type) { 929c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGV("%s:",__FUNCTION__); 930ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 931ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jbyte *addr = NULL; 932ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jboolean result = JNI_FALSE; 933ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!sBluetoothInterface) return result; 934ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 935ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh addr = env->GetByteArrayElements(address, NULL); 936ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (addr == NULL) { 937ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jniThrowIOException(env, EINVAL); 938ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return result; 939ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 940ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 941ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int ret = sBluetoothInterface->get_remote_device_property((bt_bdaddr_t *)addr, 942ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh (bt_property_type_t) type); 943b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom env->ReleaseByteArrayElements(address, addr, 0); 944ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE; 945ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 946ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return result; 947ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 948ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 949ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean setDevicePropertyNative(JNIEnv *env, jobject obj, jbyteArray address, 950ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jint type, jbyteArray value) { 951c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGV("%s:",__FUNCTION__); 952ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 953ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jbyte *val, *addr; 954ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jboolean result = JNI_FALSE; 955ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (!sBluetoothInterface) return result; 956ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 957ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh val = env->GetByteArrayElements(value, NULL); 958ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (val == NULL) { 959ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jniThrowIOException(env, EINVAL); 960ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return result; 961ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 962ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 963ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh addr = env->GetByteArrayElements(address, NULL); 964ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh if (addr == NULL) { 965b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom env->ReleaseByteArrayElements(value, val, 0); 966ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh jniThrowIOException(env, EINVAL); 967ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return result; 968ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh } 969ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 970ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 971ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh bt_property_t prop; 972ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh prop.type = (bt_property_type_t) type; 973ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh prop.len = env->GetArrayLength(value); 974ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh prop.val = val; 975ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 976ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh int ret = sBluetoothInterface->set_remote_device_property((bt_bdaddr_t *)addr, &prop); 977b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom env->ReleaseByteArrayElements(value, val, 0); 978b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom env->ReleaseByteArrayElements(address, addr, 0); 979ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 980ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE; 981ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 982ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return result; 983ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 984ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 985c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredcstatic jboolean getRemoteServicesNative(JNIEnv *env, jobject obj, jbyteArray address) { 986e469f16e5a7d99471d7db1b216d422e8d12cc4cfMatthew Xie ALOGV("%s:",__FUNCTION__); 987c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc 988c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc jbyte *addr = NULL; 989c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc jboolean result = JNI_FALSE; 990c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc if (!sBluetoothInterface) return result; 991c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc 992c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc addr = env->GetByteArrayElements(address, NULL); 993c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc if (addr == NULL) { 994c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc jniThrowIOException(env, EINVAL); 995c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc return result; 996c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc } 997c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc 998c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc int ret = sBluetoothInterface->get_remote_services((bt_bdaddr_t *)addr); 999b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom env->ReleaseByteArrayElements(address, addr, 0); 1000c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE; 1001c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc return result; 1002c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc} 1003c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc 1004cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xiestatic int connectSocketNative(JNIEnv *env, jobject object, jbyteArray address, jint type, 1005cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie jbyteArray uuidObj, jint channel, jint flag) { 1006cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie jbyte *addr = NULL, *uuid = NULL; 1007cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie int socket_fd; 1008cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie bt_status_t status; 1009cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie 1010b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom if (!sBluetoothSocketInterface) return -1; 1011cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie 1012cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie addr = env->GetByteArrayElements(address, NULL); 1013cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie if (!addr) { 1014c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("failed to get Bluetooth device address"); 1015cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie goto Fail; 1016cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie } 1017cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie 1018bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde if(uuidObj != NULL) { 1019bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde uuid = env->GetByteArrayElements(uuidObj, NULL); 1020bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde if (!uuid) { 1021bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde ALOGE("failed to get uuid"); 1022bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde goto Fail; 1023bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde } 1024cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie } 1025cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie 1026cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie if ( (status = sBluetoothSocketInterface->connect((bt_bdaddr_t *) addr, (btsock_type_t) type, 1027cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie (const uint8_t*) uuid, channel, &socket_fd, flag)) != BT_STATUS_SUCCESS) { 1028c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("Socket connection failed: %d", status); 1029cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie goto Fail; 1030cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie } 1031cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie 1032cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie 1033cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie if (socket_fd < 0) { 1034bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde ALOGE("Fail to create file descriptor on socket fd"); 1035cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie goto Fail; 1036cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie } 1037cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie env->ReleaseByteArrayElements(address, addr, 0); 1038cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie env->ReleaseByteArrayElements(uuidObj, uuid, 0); 1039cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie return socket_fd; 1040cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie 1041cc80b2261351dc74ad1bed237b0423c12d340514Matthew XieFail: 1042cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie if (addr) env->ReleaseByteArrayElements(address, addr, 0); 1043cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie if (uuid) env->ReleaseByteArrayElements(uuidObj, uuid, 0); 1044cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie 1045cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie return -1; 1046cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie} 1047cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie 1048cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xiestatic int createSocketChannelNative(JNIEnv *env, jobject object, jint type, 1049244e9c62a85a4b94e21bf1a8dee456e22bc767c4Casper Bonde jstring name_str, jbyteArray uuidObj, 10505a60e47497f21f64e6d79420dc4c56c1907df22akschulz jint channel, jint flag) { 1051bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde const char *service_name = NULL; 1052cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie jbyte *uuid = NULL; 1053cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie int socket_fd; 1054cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie bt_status_t status; 1055cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie 1056b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom if (!sBluetoothSocketInterface) return -1; 1057cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie 10588799f44e07ff7cde70a8d58893e995d3a9fa1e76Matthew Xie ALOGV("%s: SOCK FLAG = %x", __FUNCTION__, flag); 10598799f44e07ff7cde70a8d58893e995d3a9fa1e76Matthew Xie 1060bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde if(name_str != NULL) { 1061bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde service_name = env->GetStringUTFChars(name_str, NULL); 1062bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde } 1063cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie 1064bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde if(uuidObj != NULL) { 1065bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde uuid = env->GetByteArrayElements(uuidObj, NULL); 1066bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde if (!uuid) { 1067bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde ALOGE("failed to get uuid"); 1068bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde goto Fail; 1069bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde } 1070cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie } 1071cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie if ( (status = sBluetoothSocketInterface->listen((btsock_type_t) type, service_name, 1072cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie (const uint8_t*) uuid, channel, &socket_fd, flag)) != BT_STATUS_SUCCESS) { 1073c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("Socket listen failed: %d", status); 1074cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie goto Fail; 1075cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie } 1076cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie 1077cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie if (socket_fd < 0) { 1078c55a9837c004044051b71bb47182ace156691283Matthew Xie ALOGE("Fail to creat file descriptor on socket fd"); 1079cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie goto Fail; 1080cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie } 1081cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie if (service_name) env->ReleaseStringUTFChars(name_str, service_name); 1082cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie if (uuid) env->ReleaseByteArrayElements(uuidObj, uuid, 0); 1083cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie return socket_fd; 1084cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie 1085cc80b2261351dc74ad1bed237b0423c12d340514Matthew XieFail: 1086cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie if (service_name) env->ReleaseStringUTFChars(name_str, service_name); 1087cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie if (uuid) env->ReleaseByteArrayElements(uuidObj, uuid, 0); 1088cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie return -1; 1089cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie} 1090cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie 10919d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xustatic jboolean configHciSnoopLogNative(JNIEnv* env, jobject obj, jboolean enable) { 10929d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu ALOGV("%s:",__FUNCTION__); 10939d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu 10949d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu jboolean result = JNI_FALSE; 10959d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu 10969d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu if (!sBluetoothInterface) return result; 10979d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu 10989d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu int ret = sBluetoothInterface->config_hci_snoop_log(enable); 10999d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu 11009d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE; 11019d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu 11029d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu return result; 11039d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu} 11049d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu 1105f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadhamstatic int readEnergyInfo() 1106f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham{ 1107f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham ALOGV("%s:",__FUNCTION__); 1108f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham jboolean result = JNI_FALSE; 1109f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham if (!sBluetoothInterface) return result; 1110f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham int ret = sBluetoothInterface->read_energy_info(); 1111f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE; 1112f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham return result; 1113f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham} 1114f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham 1115f5f90873574eefe5f50a7b383fcd8fefb961f66cAndre Eisenbachstatic void dumpNative(JNIEnv *env, jobject obj, jobject fdObj) 1116f5f90873574eefe5f50a7b383fcd8fefb961f66cAndre Eisenbach{ 1117f5f90873574eefe5f50a7b383fcd8fefb961f66cAndre Eisenbach ALOGV("%s()", __FUNCTION__); 1118f5f90873574eefe5f50a7b383fcd8fefb961f66cAndre Eisenbach if (!sBluetoothInterface) return; 1119f5f90873574eefe5f50a7b383fcd8fefb961f66cAndre Eisenbach 1120f5f90873574eefe5f50a7b383fcd8fefb961f66cAndre Eisenbach int fd = jniGetFDFromFileDescriptor(env, fdObj); 1121f5f90873574eefe5f50a7b383fcd8fefb961f66cAndre Eisenbach if (fd < 0) return; 1122f5f90873574eefe5f50a7b383fcd8fefb961f66cAndre Eisenbach 1123f5f90873574eefe5f50a7b383fcd8fefb961f66cAndre Eisenbach sBluetoothInterface->dump(fd); 1124f5f90873574eefe5f50a7b383fcd8fefb961f66cAndre Eisenbach} 1125f5f90873574eefe5f50a7b383fcd8fefb961f66cAndre Eisenbach 11266eb32d5f7c30f04da45c3da0974bbb63725a0978Ajay Panickerstatic jboolean factoryResetNative(JNIEnv *env, jobject obj) { 11276eb32d5f7c30f04da45c3da0974bbb63725a0978Ajay Panicker ALOGV("%s:", __FUNCTION__); 11286eb32d5f7c30f04da45c3da0974bbb63725a0978Ajay Panicker if (!sBluetoothInterface) return JNI_FALSE; 11296eb32d5f7c30f04da45c3da0974bbb63725a0978Ajay Panicker int ret = sBluetoothInterface->config_clear(); 11306eb32d5f7c30f04da45c3da0974bbb63725a0978Ajay Panicker return (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE; 11316eb32d5f7c30f04da45c3da0974bbb63725a0978Ajay Panicker} 11326eb32d5f7c30f04da45c3da0974bbb63725a0978Ajay Panicker 1133ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic JNINativeMethod sMethods[] = { 1134b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom /* name, signature, funcPtr */ 1135ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh {"classInitNative", "()V", (void *) classInitNative}, 1136ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh {"initNative", "()Z", (void *) initNative}, 1137ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh {"cleanupNative", "()V", (void*) cleanupNative}, 1138ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh {"enableNative", "()Z", (void*) enableNative}, 1139ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh {"disableNative", "()Z", (void*) disableNative}, 1140ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh {"setAdapterPropertyNative", "(I[B)Z", (void*) setAdapterPropertyNative}, 1141ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh {"getAdapterPropertiesNative", "()Z", (void*) getAdapterPropertiesNative}, 1142ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh {"getAdapterPropertyNative", "(I)Z", (void*) getAdapterPropertyNative}, 1143ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh {"getDevicePropertyNative", "([BI)Z", (void*) getDevicePropertyNative}, 1144ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh {"setDevicePropertyNative", "([BI[B)Z", (void*) setDevicePropertyNative}, 1145ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh {"startDiscoveryNative", "()Z", (void*) startDiscoveryNative}, 1146ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh {"cancelDiscoveryNative", "()Z", (void*) cancelDiscoveryNative}, 1147db681f3973bd8a088a878fd6f41d4330cdbc5522Andre Eisenbach {"createBondNative", "([BI)Z", (void*) createBondNative}, 1148ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh {"removeBondNative", "([B)Z", (void*) removeBondNative}, 1149ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh {"cancelBondNative", "([B)Z", (void*) cancelBondNative}, 11501e3e1ddf939bf71616245e1e100964568053d665Andre Eisenbach {"getConnectionStateNative", "([B)I", (void*) getConnectionStateNative}, 1151ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh {"pinReplyNative", "([BZI[B)Z", (void*) pinReplyNative}, 1152581bb31a8165ff0f9c7d638cfe4a81aaaafa2dedJaikumar Ganesh {"sspReplyNative", "([BIZI)Z", (void*) sspReplyNative}, 1153c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc {"getRemoteServicesNative", "([B)Z", (void*) getRemoteServicesNative}, 1154cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie {"connectSocketNative", "([BI[BII)I", (void*) connectSocketNative}, 1155cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie {"createSocketChannelNative", "(ILjava/lang/String;[BII)I", 11569d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu (void*) createSocketChannelNative}, 11571e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati {"configHciSnoopLogNative", "(Z)Z", (void*) configHciSnoopLogNative}, 11581e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati {"alarmFiredNative", "()V", (void *) alarmFiredNative}, 1159f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham {"readEnergyInfo", "()I", (void*) readEnergyInfo}, 1160f5f90873574eefe5f50a7b383fcd8fefb961f66cAndre Eisenbach {"dumpNative", "(Ljava/io/FileDescriptor;)V", (void*) dumpNative}, 11616eb32d5f7c30f04da45c3da0974bbb63725a0978Ajay Panicker {"factoryResetNative", "()Z", (void*)factoryResetNative} 1162ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}; 1163ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 1164ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshint register_com_android_bluetooth_btservice_AdapterService(JNIEnv* env) 1165ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh{ 1166ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh return jniRegisterNativeMethods(env, "com/android/bluetooth/btservice/AdapterService", 1167ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh sMethods, NELEM(sMethods)); 1168ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 1169ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 1170ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} /* namespace android */ 1171ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 1172ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh 1173ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh/* 1174ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * JNI Initialization 1175ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh */ 1176ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshjint JNI_OnLoad(JavaVM *jvm, void *reserved) 1177ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh{ 1178b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom JNIEnv *e; 1179b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom int status; 1180b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom 1181b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom ALOGV("Bluetooth Adapter Service : loading JNI\n"); 1182b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom 1183b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom // Check JNI version 1184b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom if (jvm->GetEnv((void **)&e, JNI_VERSION_1_6)) { 1185b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom ALOGE("JNI version mismatch error"); 1186b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom return JNI_ERR; 1187b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom } 1188b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom 1189b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom if ((status = android::register_com_android_bluetooth_btservice_AdapterService(e)) < 0) { 1190b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom ALOGE("jni adapter service registration failure, status: %d", status); 1191b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom return JNI_ERR; 1192b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom } 1193b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom 1194b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom if ((status = android::register_com_android_bluetooth_hfp(e)) < 0) { 1195b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom ALOGE("jni hfp registration failure, status: %d", status); 1196b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom return JNI_ERR; 1197aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 1198aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 1199aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if ((status = android::register_com_android_bluetooth_hfpclient(e)) < 0) { 1200aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta ALOGE("jni hfp client registration failure, status: %d", status); 1201aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return JNI_ERR; 1202b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom } 1203b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom 1204b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom if ((status = android::register_com_android_bluetooth_a2dp(e)) < 0) { 1205c030f08f419d596c4aa216c9cca9867e7b5486f0Mike Lockwood ALOGE("jni a2dp source registration failure: %d", status); 1206c030f08f419d596c4aa216c9cca9867e7b5486f0Mike Lockwood return JNI_ERR; 1207c030f08f419d596c4aa216c9cca9867e7b5486f0Mike Lockwood } 1208c030f08f419d596c4aa216c9cca9867e7b5486f0Mike Lockwood 1209c030f08f419d596c4aa216c9cca9867e7b5486f0Mike Lockwood if ((status = android::register_com_android_bluetooth_a2dp_sink(e)) < 0) { 1210c030f08f419d596c4aa216c9cca9867e7b5486f0Mike Lockwood ALOGE("jni a2dp sink registration failure: %d", status); 1211b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom return JNI_ERR; 1212b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom } 1213b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom 1214c1c259c0ace7195240f1443c805995bfe8692a72Zhihai Xu if ((status = android::register_com_android_bluetooth_avrcp(e)) < 0) { 1215066ad9e16a548218b139424f758b92db7af34af2Mike Lockwood ALOGE("jni avrcp target registration failure: %d", status); 1216066ad9e16a548218b139424f758b92db7af34af2Mike Lockwood return JNI_ERR; 1217066ad9e16a548218b139424f758b92db7af34af2Mike Lockwood } 1218066ad9e16a548218b139424f758b92db7af34af2Mike Lockwood 1219066ad9e16a548218b139424f758b92db7af34af2Mike Lockwood if ((status = android::register_com_android_bluetooth_avrcp_controller(e)) < 0) { 1220066ad9e16a548218b139424f758b92db7af34af2Mike Lockwood ALOGE("jni avrcp controller registration failure: %d", status); 1221c1c259c0ace7195240f1443c805995bfe8692a72Zhihai Xu return JNI_ERR; 1222c1c259c0ace7195240f1443c805995bfe8692a72Zhihai Xu } 1223c1c259c0ace7195240f1443c805995bfe8692a72Zhihai Xu 1224b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom if ((status = android::register_com_android_bluetooth_hid(e)) < 0) { 1225b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom ALOGE("jni hid registration failure: %d", status); 1226b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom return JNI_ERR; 1227b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom } 1228b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom 1229b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom if ((status = android::register_com_android_bluetooth_hdp(e)) < 0) { 1230b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom ALOGE("jni hdp registration failure: %d", status); 1231b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom return JNI_ERR; 1232b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom } 1233b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom 1234b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom if ((status = android::register_com_android_bluetooth_pan(e)) < 0) { 1235b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom ALOGE("jni pan registration failure: %d", status); 1236b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom return JNI_ERR; 1237b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom } 1238b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom 1239b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom if ((status = android::register_com_android_bluetooth_gatt(e)) < 0) { 1240b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom ALOGE("jni gatt registration failure: %d", status); 1241b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom return JNI_ERR; 1242b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom } 1243bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde 1244bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde if ((status = android::register_com_android_bluetooth_sdp(e)) < 0) { 1245bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde ALOGE("jni sdp registration failure: %d", status); 1246bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde return JNI_ERR; 1247bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde } 1248bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde 1249b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom return JNI_VERSION_1_6; 1250ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} 1251