summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Hilsheimer <volker.hilsheimer@qt.io>2022-09-06 17:28:25 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-09-13 08:21:23 +0000
commit56d80b423b47f299d920f51a3e479d541a1f579e (patch)
tree43d139d2a2e8af19847dcb3d946894d9141b5c5a
parent39d7bdbf4cde6c1d1353c9df1837bd746b4273cc (diff)
downloadqtconnectivity-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.cpp26
-rw-r--r--src/bluetooth/android/jni_android.cpp84
-rw-r--r--src/bluetooth/android/jni_android_p.h45
-rw-r--r--src/bluetooth/android/localdevicebroadcastreceiver.cpp43
-rw-r--r--src/bluetooth/android/servicediscoverybroadcastreceiver.cpp12
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>());