diff options
author | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2022-09-06 17:28:25 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-09-13 08:21:23 +0000 |
commit | 56d80b423b47f299d920f51a3e479d541a1f579e (patch) | |
tree | 43d139d2a2e8af19847dcb3d946894d9141b5c5a | |
parent | 39d7bdbf4cde6c1d1353c9df1837bd746b4273cc (diff) | |
download | qtconnectivity-56d80b423b47f299d920f51a3e479d541a1f579e.tar.gz |
Generate key string for field cache at compile time
By providing a template that returns the right field name for each enum
value as a QtJniTypes::String we can create the cache key entirely at
compile time.
The key string will still be copied once, as the QHash operates on a
QByteArray as the key.
Change-Id: I611b94e0ff65d71e5cb5a63d487324b9cf485b6b
Reviewed-by: Juha Vuolle <juha.vuolle@insta.fi>
(cherry picked from commit 4f9ad7da4c4e9a0d45e501edf1db3db67cec2638)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/bluetooth/android/devicediscoverybroadcastreceiver.cpp | 26 | ||||
-rw-r--r-- | src/bluetooth/android/jni_android.cpp | 84 | ||||
-rw-r--r-- | src/bluetooth/android/jni_android_p.h | 45 | ||||
-rw-r--r-- | src/bluetooth/android/localdevicebroadcastreceiver.cpp | 43 | ||||
-rw-r--r-- | src/bluetooth/android/servicediscoverybroadcastreceiver.cpp | 12 |
5 files changed, 86 insertions, 124 deletions
diff --git a/src/bluetooth/android/devicediscoverybroadcastreceiver.cpp b/src/bluetooth/android/devicediscoverybroadcastreceiver.cpp index f481d47f..67678c12 100644 --- a/src/bluetooth/android/devicediscoverybroadcastreceiver.cpp +++ b/src/bluetooth/android/devicediscoverybroadcastreceiver.cpp @@ -356,9 +356,9 @@ quint8 resolveAndroidMinorClass(QBluetoothDeviceInfo::MajorDeviceClass major, ji DeviceDiscoveryBroadcastReceiver::DeviceDiscoveryBroadcastReceiver(QObject* parent): AndroidBroadcastReceiver(parent) { - addAction(valueForStaticField(JavaNames::BluetoothDevice, JavaNames::ActionFound)); - addAction(valueForStaticField(JavaNames::BluetoothAdapter, JavaNames::ActionDiscoveryStarted)); - addAction(valueForStaticField(JavaNames::BluetoothAdapter, JavaNames::ActionDiscoveryFinished)); + addAction(valueForStaticField<QtJniTypes::BluetoothDevice, JavaNames::ActionFound>()); + addAction(valueForStaticField<QtJniTypes::BluetoothAdapter, JavaNames::ActionDiscoveryStarted>()); + addAction(valueForStaticField<QtJniTypes::BluetoothAdapter, JavaNames::ActionDiscoveryFinished>()); } // Runs in Java thread @@ -372,17 +372,17 @@ void DeviceDiscoveryBroadcastReceiver::onReceive(JNIEnv *env, jobject context, j qCDebug(QT_BT_ANDROID) << "DeviceDiscoveryBroadcastReceiver::onReceive() - event:" << action; - if (action == valueForStaticField(JavaNames::BluetoothAdapter, - JavaNames::ActionDiscoveryFinished).toString()) { + if (action == valueForStaticField<QtJniTypes::BluetoothAdapter, + JavaNames::ActionDiscoveryFinished>().toString()) { emit finished(); - } else if (action == valueForStaticField(JavaNames::BluetoothAdapter, - JavaNames::ActionDiscoveryStarted).toString()) { + } else if (action == valueForStaticField<QtJniTypes::BluetoothAdapter, + JavaNames::ActionDiscoveryStarted>().toString()) { emit discoveryStarted(); - } else if (action == valueForStaticField(JavaNames::BluetoothDevice, - JavaNames::ActionFound).toString()) { + } else if (action == valueForStaticField<QtJniTypes::BluetoothDevice, + JavaNames::ActionFound>().toString()) { //get BluetoothDevice - QJniObject keyExtra = valueForStaticField(JavaNames::BluetoothDevice, - JavaNames::ExtraDevice); + QJniObject keyExtra = valueForStaticField<QtJniTypes::BluetoothDevice, + JavaNames::ExtraDevice>(); const QJniObject bluetoothDevice = intentObject.callMethod<QtJniTypes::Parcelable>("getParcelableExtra", keyExtra.object<jstring>()); @@ -390,8 +390,8 @@ void DeviceDiscoveryBroadcastReceiver::onReceive(JNIEnv *env, jobject context, j if (!bluetoothDevice.isValid()) return; - keyExtra = valueForStaticField(JavaNames::BluetoothDevice, - JavaNames::ExtraRssi); + keyExtra = valueForStaticField<QtJniTypes::BluetoothDevice, + JavaNames::ExtraRssi>(); int rssi = intentObject.callMethod<jshort>("getShortExtra", keyExtra.object<jstring>(), jshort(0)); diff --git a/src/bluetooth/android/jni_android.cpp b/src/bluetooth/android/jni_android.cpp index b01bbff6..27b64f98 100644 --- a/src/bluetooth/android/jni_android.cpp +++ b/src/bluetooth/android/jni_android.cpp @@ -17,94 +17,12 @@ Q_DECLARE_LOGGING_CATEGORY(QT_BT_ANDROID) typedef QHash<QByteArray, QJniObject> JCachedStringFields; Q_GLOBAL_STATIC(JCachedStringFields, cachedStringFields) -//Java field names -static const char * const javaActionAclConnected = "ACTION_ACL_CONNECTED"; -static const char * const javaActionAclDisconnected = "ACTION_ACL_DISCONNECTED"; -static const char * const javaActionBondStateChanged = "ACTION_BOND_STATE_CHANGED"; -static const char * const javaActionDiscoveryStarted = "ACTION_DISCOVERY_STARTED"; -static const char * const javaActionDiscoveryFinished = "ACTION_DISCOVERY_FINISHED"; -static const char * const javaActionFound = "ACTION_FOUND"; -static const char * const javaActionScanModeChanged = "ACTION_SCAN_MODE_CHANGED"; -static const char * const javaActionUuid = "ACTION_UUID"; -static const char * const javaExtraBondState = "EXTRA_BOND_STATE"; -static const char * const javaExtraDevice = "EXTRA_DEVICE"; -static const char * const javaExtraPairingKey = "EXTRA_PAIRING_KEY"; -static const char * const javaExtraPairingVariant = "EXTRA_PAIRING_VARIANT"; -static const char * const javaExtraRssi = "EXTRA_RSSI"; -static const char * const javaExtraScanMode = "EXTRA_SCAN_MODE"; -static const char * const javaExtraUuid = "EXTRA_UUID"; - /* * This function operates on the assumption that each * field is of type java/lang/String. */ -inline QByteArray classNameForStaticField(JavaNames javaName) -{ - switch (javaName) { - case JavaNames::BluetoothAdapter: { - constexpr auto cn = QtJniTypes::className<QtJniTypes::BluetoothAdapter>(); - return QByteArray(cn.data(), cn.size()); - } - case JavaNames::BluetoothDevice: { - constexpr auto cn = QtJniTypes::className<QtJniTypes::BluetoothDevice>(); - return QByteArray(cn.data(), cn.size()); - } - default: - break; - } - return {}; -} - -QJniObject valueForStaticField(JavaNames javaName, JavaNames javaFieldName) +QJniObject valueFromStaticFieldCache(const char *key, const char *className, const char *fieldName) { - //construct key - //the switch statements are used to reduce the number of duplicated strings - //in the library - - const char *fieldName; - switch (javaFieldName) { - case JavaNames::ActionAclConnected: - fieldName = javaActionAclConnected; break; - case JavaNames::ActionAclDisconnected: - fieldName = javaActionAclDisconnected; break; - case JavaNames::ActionBondStateChanged: - fieldName = javaActionBondStateChanged; break; - case JavaNames::ActionDiscoveryStarted: - fieldName = javaActionDiscoveryStarted; break; - case JavaNames::ActionDiscoveryFinished: - fieldName = javaActionDiscoveryFinished; break; - case JavaNames::ActionFound: - fieldName = javaActionFound; break; - case JavaNames::ActionScanModeChanged: - fieldName = javaActionScanModeChanged; break; - case JavaNames::ActionUuid: - fieldName = javaActionUuid; break; - case JavaNames::ExtraBondState: - fieldName = javaExtraBondState; break; - case JavaNames::ExtraDevice: - fieldName = javaExtraDevice; break; - case JavaNames::ExtraPairingKey: - fieldName = javaExtraPairingKey; break; - case JavaNames::ExtraPairingVariant: - fieldName = javaExtraPairingVariant; break; - case JavaNames::ExtraRssi: - fieldName = javaExtraRssi; break; - case JavaNames::ExtraScanMode: - fieldName = javaExtraScanMode; break; - case JavaNames::ExtraUuid: - fieldName = javaExtraUuid; break; - default: - qCWarning(QT_BT_ANDROID) << "Unknown java field name passed to valueForStaticField():" << javaFieldName; - return QJniObject(); - } - - const QByteArray className = classNameForStaticField(javaName); - if (className.isEmpty()) { - qCWarning(QT_BT_ANDROID) << "Unknown java class name passed to valueForStaticField():" << javaName; - return QJniObject(); - } - - const QByteArray key = className + fieldName; JCachedStringFields::iterator it = cachedStringFields()->find(key); if (it == cachedStringFields()->end()) { QJniEnvironment env; diff --git a/src/bluetooth/android/jni_android_p.h b/src/bluetooth/android/jni_android_p.h index e172f637..c51b14e7 100644 --- a/src/bluetooth/android/jni_android_p.h +++ b/src/bluetooth/android/jni_android_p.h @@ -88,7 +88,50 @@ enum JavaNames { ExtraUuid }; -QJniObject valueForStaticField(JavaNames javaName, JavaNames javaFieldName); +QJniObject valueFromStaticFieldCache(const char *key, const char *className, const char *fieldName); + + +template<typename Klass, JavaNames Field> +QJniObject valueForStaticField() +{ + constexpr auto className = QtJniTypes::className<Klass>(); + constexpr auto fieldName = []() -> auto { + if constexpr (Field == JavaNames::ActionAclConnected) + return QtJniTypes::String("ACTION_ACL_CONNECTED"); + else if constexpr (Field == ActionAclDisconnected) + return QtJniTypes::String("ACTION_ACL_DISCONNECTED"); + else if constexpr (Field == ActionBondStateChanged) + return QtJniTypes::String("ACTION_BOND_STATE_CHANGED"); + else if constexpr (Field == ActionDiscoveryStarted) + return QtJniTypes::String("ACTION_DISCOVERY_STARTED"); + else if constexpr (Field == ActionDiscoveryFinished) + return QtJniTypes::String("ACTION_DISCOVERY_FINISHED"); + else if constexpr (Field == ActionFound) + return QtJniTypes::String("ACTION_FOUND"); + else if constexpr (Field == ActionScanModeChanged) + return QtJniTypes::String("ACTION_SCAN_MODE_CHANGED"); + else if constexpr (Field == ActionUuid) + return QtJniTypes::String("ACTION_UUID"); + else if constexpr (Field == ExtraBondState) + return QtJniTypes::String("EXTRA_BOND_STATE"); + else if constexpr (Field == ExtraDevice) + return QtJniTypes::String("EXTRA_DEVICE"); + else if constexpr (Field == ExtraPairingKey) + return QtJniTypes::String("EXTRA_PAIRING_KEY"); + else if constexpr (Field == ExtraPairingVariant) + return QtJniTypes::String("EXTRA_PAIRING_VARIANT"); + else if constexpr (Field == ExtraRssi) + return QtJniTypes::String("EXTRA_RSSI"); + else if constexpr (Field == ExtraScanMode) + return QtJniTypes::String("EXTRA_SCAN_MODE"); + else if constexpr (Field == ExtraUuid) + return QtJniTypes::String("EXTRA_UUID"); + else + QtJniTypes::staticAssertTypeMismatch(); + }(); + + return valueFromStaticFieldCache(className + fieldName, className.data(), fieldName.data()); +} QT_END_NAMESPACE diff --git a/src/bluetooth/android/localdevicebroadcastreceiver.cpp b/src/bluetooth/android/localdevicebroadcastreceiver.cpp index 61ed4336..6e2ccf7a 100644 --- a/src/bluetooth/android/localdevicebroadcastreceiver.cpp +++ b/src/bluetooth/android/localdevicebroadcastreceiver.cpp @@ -16,10 +16,10 @@ const char *bondModes[] = {"BOND_NONE", "BOND_BONDING", "BOND_BONDED"}; LocalDeviceBroadcastReceiver::LocalDeviceBroadcastReceiver(QObject *parent) : AndroidBroadcastReceiver(parent), previousScanMode(0) { - addAction(valueForStaticField(JavaNames::BluetoothDevice, JavaNames::ActionBondStateChanged)); - addAction(valueForStaticField(JavaNames::BluetoothAdapter, JavaNames::ActionScanModeChanged)); - addAction(valueForStaticField(JavaNames::BluetoothDevice, JavaNames::ActionAclConnected)); - addAction(valueForStaticField(JavaNames::BluetoothDevice, JavaNames::ActionAclDisconnected)); + addAction(valueForStaticField<QtJniTypes::BluetoothDevice, JavaNames::ActionBondStateChanged>()); + addAction(valueForStaticField<QtJniTypes::BluetoothAdapter, JavaNames::ActionScanModeChanged>()); + addAction(valueForStaticField<QtJniTypes::BluetoothDevice, JavaNames::ActionAclConnected>()); + addAction(valueForStaticField<QtJniTypes::BluetoothDevice, JavaNames::ActionAclDisconnected>()); //cache integer values for host & bonding mode //don't use the java fields directly but refer to them by name @@ -45,13 +45,13 @@ void LocalDeviceBroadcastReceiver::onReceive(JNIEnv *env, jobject context, jobje const QString action = intentObject.callMethod<jstring>("getAction").toString(); qCDebug(QT_BT_ANDROID) << QStringLiteral("LocalDeviceBroadcastReceiver::onReceive() - event: %1").arg(action); - if (action == valueForStaticField(JavaNames::BluetoothAdapter, - JavaNames::ActionScanModeChanged).toString()) { + if (action == valueForStaticField<QtJniTypes::BluetoothAdapter, + JavaNames::ActionScanModeChanged>().toString()) { const QJniObject extrasBundle = intentObject.callMethod<QtJniTypes::Bundle>("getExtras"); - const QJniObject keyExtra = valueForStaticField(JavaNames::BluetoothAdapter, - JavaNames::ExtraScanMode); + const QJniObject keyExtra = valueForStaticField<QtJniTypes::BluetoothAdapter, + JavaNames::ExtraScanMode>(); int extra = extrasBundle.callMethod<jint>("getInt", keyExtra.object<jstring>()); @@ -67,17 +67,18 @@ void LocalDeviceBroadcastReceiver::onReceive(JNIEnv *env, jobject context, jobje else qCWarning(QT_BT_ANDROID) << "Unknown Host State"; } - } else if (action == valueForStaticField(JavaNames::BluetoothDevice, - JavaNames::ActionBondStateChanged).toString()) { + } else if (action == valueForStaticField<QtJniTypes::BluetoothDevice, + JavaNames::ActionBondStateChanged>().toString()) { //get BluetoothDevice - QJniObject keyExtra = valueForStaticField(JavaNames::BluetoothDevice, - JavaNames::ExtraDevice); + QJniObject keyExtra = valueForStaticField<QtJniTypes::BluetoothDevice, + JavaNames::ExtraDevice>(); const QJniObject bluetoothDevice = intentObject.callMethod<QtJniTypes::Parcelable>("getParcelableExtra", keyExtra.object<jstring>()); //get new bond state - keyExtra = valueForStaticField(JavaNames::BluetoothDevice, JavaNames::ExtraBondState); + keyExtra = valueForStaticField<QtJniTypes::BluetoothDevice, + JavaNames::ExtraBondState>(); const QJniObject extrasBundle = intentObject.callMethod<QtJniTypes::Bundle>("getExtras"); int bondState = extrasBundle.callMethod<jint>("getInt", keyExtra.object<jstring>()); @@ -95,19 +96,19 @@ void LocalDeviceBroadcastReceiver::onReceive(JNIEnv *env, jobject context, jobje else qCWarning(QT_BT_ANDROID) << "Unknown BOND_STATE_CHANGED value:" << bondState; - } else if (action == valueForStaticField(JavaNames::BluetoothDevice, - JavaNames::ActionAclConnected).toString() || - action == valueForStaticField(JavaNames::BluetoothDevice, - JavaNames::ActionAclDisconnected).toString()) { + } else if (action == valueForStaticField<QtJniTypes::BluetoothDevice, + JavaNames::ActionAclConnected>().toString() || + action == valueForStaticField<QtJniTypes::BluetoothDevice, + JavaNames::ActionAclDisconnected>().toString()) { - const QString connectEvent = valueForStaticField(JavaNames::BluetoothDevice, - JavaNames::ActionAclConnected).toString(); + const QString connectEvent = valueForStaticField<QtJniTypes::BluetoothDevice, + JavaNames::ActionAclConnected>().toString(); const bool isConnectEvent = action == connectEvent ? true : false; //get BluetoothDevice - const QJniObject keyExtra = valueForStaticField(JavaNames::BluetoothDevice, - JavaNames::ExtraDevice); + const QJniObject keyExtra = valueForStaticField<QtJniTypes::BluetoothDevice, + JavaNames::ExtraDevice>(); QJniObject bluetoothDevice = intentObject.callMethod<QtJniTypes::Parcelable>("getParcelableExtra", keyExtra.object<jstring>()); diff --git a/src/bluetooth/android/servicediscoverybroadcastreceiver.cpp b/src/bluetooth/android/servicediscoverybroadcastreceiver.cpp index 825e4abc..082e7247 100644 --- a/src/bluetooth/android/servicediscoverybroadcastreceiver.cpp +++ b/src/bluetooth/android/servicediscoverybroadcastreceiver.cpp @@ -15,7 +15,7 @@ Q_DECLARE_LOGGING_CATEGORY(QT_BT_ANDROID) ServiceDiscoveryBroadcastReceiver::ServiceDiscoveryBroadcastReceiver(QObject* parent): AndroidBroadcastReceiver(parent) { - addAction(valueForStaticField(JavaNames::BluetoothDevice, JavaNames::ActionUuid)); + addAction(valueForStaticField<QtJniTypes::BluetoothDevice, JavaNames::ActionUuid>()); } void ServiceDiscoveryBroadcastReceiver::onReceive(JNIEnv *env, jobject context, jobject intent) @@ -28,11 +28,11 @@ void ServiceDiscoveryBroadcastReceiver::onReceive(JNIEnv *env, jobject context, qCDebug(QT_BT_ANDROID) << "ServiceDiscoveryBroadcastReceiver::onReceive() - event:" << action; - if (action == valueForStaticField(JavaNames::BluetoothDevice, - JavaNames::ActionUuid).toString()) { + if (action == valueForStaticField<QtJniTypes::BluetoothDevice, + JavaNames::ActionUuid>().toString()) { - QJniObject keyExtra = valueForStaticField(JavaNames::BluetoothDevice, - JavaNames::ExtraUuid); + QJniObject keyExtra = valueForStaticField<QtJniTypes::BluetoothDevice, + JavaNames::ExtraUuid>(); QJniObject parcelableUuids = intentObject.callMethod<QtJniTypes::ParcelableArray>( "getParcelableArrayExtra", keyExtra.object<jstring>()); @@ -42,7 +42,7 @@ void ServiceDiscoveryBroadcastReceiver::onReceive(JNIEnv *env, jobject context, } const QList<QBluetoothUuid> result = ServiceDiscoveryBroadcastReceiver::convertParcelableArray(parcelableUuids); - keyExtra = valueForStaticField(JavaNames::BluetoothDevice, JavaNames::ExtraDevice); + keyExtra = valueForStaticField<QtJniTypes::BluetoothDevice, JavaNames::ExtraDevice>(); QJniObject bluetoothDevice = intentObject.callMethod<QtJniTypes::Parcelable>("getParcelableExtra", keyExtra.object<jstring>()); |