Q_BLUETOOTH_EXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* /*reserved*/) { typedef union { JNIEnv *nativeEnvironment; void *venv; } UnionJNIEnvToVoid; UnionJNIEnvToVoid uenv; uenv.venv = 0; if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_4) != JNI_OK) { __android_log_print(ANDROID_LOG_FATAL, logTag, "GetEnv failed"); return -1; } JNIEnv *env = uenv.nativeEnvironment; if (!registerNatives(env)) { __android_log_print(ANDROID_LOG_FATAL, logTag, "registerNatives failed"); return -1; } if (QT_BT_ANDROID().isDebugEnabled()) __android_log_print(ANDROID_LOG_INFO, logTag, "Bluetooth start"); return JNI_VERSION_1_4; }
void QBluetoothServiceDiscoveryAgentPrivate::_q_processFetchedUuids( const QBluetoothAddress &address, const QList<QBluetoothUuid> &uuids) { //don't leave more data through if we are not interested anymore if (discoveredDevices.count() == 0) return; //could not find any service for the current address/device -> go to next one if (address.isNull() || uuids.isEmpty()) { _q_serviceDiscoveryFinished(); return; } if (QT_BT_ANDROID().isDebugEnabled()) { qCDebug(QT_BT_ANDROID) << "Found UUID for" << address.toString() << "\ncount: " << uuids.count(); QString result; for (int i = 0; i<uuids.count(); i++) result += uuids.at(i).toString() + QStringLiteral("**"); qCDebug(QT_BT_ANDROID) << result; } /* In general there are two uuid events per device. * We'll wait for the second event to arrive before we process the UUIDs. * We utilize a timeout to catch cases when the second * event doesn't arrive at all. * Generally we assume that the second uuid event carries the most up-to-date * set of uuids and discard the first events results. */ if (sdpCache.contains(address)) { //second event QPair<QBluetoothDeviceInfo,QList<QBluetoothUuid> > pair = sdpCache.take(address); //prefer second uuid set over first populateDiscoveredServices(pair.first, uuids); if (discoveredDevices.count() == 1 && sdpCache.isEmpty()) { //last regular uuid data set from OS -> we finish here _q_serviceDiscoveryFinished(); } } else { //first event QPair<QBluetoothDeviceInfo,QList<QBluetoothUuid> > pair; pair.first = discoveredDevices.at(0); pair.second = uuids; if (pair.first.address() != address) return; sdpCache.insert(address, pair); //the discovery on the last device cannot immediately finish //we have to grant the 2 seconds timeout delay if (discoveredDevices.count() == 1) { Q_Q(QBluetoothServiceDiscoveryAgent); QTimer::singleShot(4000, q, SLOT(_q_fetchUuidsTimeout())); return; } _q_serviceDiscoveryFinished(); } }