summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIevgenii Meshcheriakov <ievgenii.meshcheriakov@qt.io>2022-07-25 14:15:58 +0200
committerIevgenii Meshcheriakov <ievgenii.meshcheriakov@qt.io>2022-07-26 11:28:29 +0200
commit9a3f8b68123a08f6dfe6a7f0a4b82e9d16311b5d (patch)
treed99c7e6546def1683f5df5f3becc7a23369b829e
parent45971fdc9db88cf3a1032fdb512f5214bd431f18 (diff)
downloadqtconnectivity-9a3f8b68123a08f6dfe6a7f0a4b82e9d16311b5d.tar.gz
Android NFC: Use templated JNI interface for QNearFieldTargetPrivateImpl
Prefer templated JNI interface to string-based one when possible. Task-number: QTBUG-104184 Change-Id: I455c4912f96dcf0789c098cbf024880f17c9296c Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
-rw-r--r--src/nfc/android/androidjninfc_p.h8
-rw-r--r--src/nfc/qnearfieldtarget_android.cpp33
2 files changed, 25 insertions, 16 deletions
diff --git a/src/nfc/android/androidjninfc_p.h b/src/nfc/android/androidjninfc_p.h
index 680d3dcc..da0ab6d0 100644
--- a/src/nfc/android/androidjninfc_p.h
+++ b/src/nfc/android/androidjninfc_p.h
@@ -18,6 +18,14 @@
#include <QtCore/QJniObject>
+QT_BEGIN_NAMESPACE
+
+Q_DECLARE_JNI_TYPE(StringArray, "[Ljava/lang/String;")
+
+Q_DECLARE_JNI_CLASS(NdefMessage, "android/nfc/NdefMessage")
+
+QT_END_NAMESPACE
+
#define QT_USE_ANDROIDNFC_NAMESPACE using namespace ::AndroidNfc;
#define QT_BEGIN_ANDROIDNFC_NAMESPACE namespace AndroidNfc {
#define QT_END_ANDROIDNFC_NAMESPACE }
diff --git a/src/nfc/qnearfieldtarget_android.cpp b/src/nfc/qnearfieldtarget_android.cpp
index 53ac8238..806bf68c 100644
--- a/src/nfc/qnearfieldtarget_android.cpp
+++ b/src/nfc/qnearfieldtarget_android.cpp
@@ -75,7 +75,7 @@ bool QNearFieldTargetPrivateImpl::disconnect()
bool connected = tagTech.callMethod<jboolean>("isConnected");
if (!connected)
return false;
- auto methodId = env.findMethod(tagTech.objectClass(), "close", "()V");
+ auto methodId = env.findMethod<void>(tagTech.objectClass(), "close");
if (!methodId)
return false;
env->CallVoidMethod(tagTech.object(), methodId);
@@ -113,14 +113,14 @@ QNearFieldTarget::RequestId QNearFieldTargetPrivateImpl::readNdefMessages()
}
// Get NdefMessage object
- QJniObject ndefMessage = tagTech.callObjectMethod("getNdefMessage", "()Landroid/nfc/NdefMessage;");
+ QJniObject ndefMessage = tagTech.callMethod<QtJniTypes::NdefMessage>("getNdefMessage");
if (!ndefMessage.isValid()) {
reportError(QNearFieldTarget::NdefReadError, requestId);
return requestId;
}
// Convert to byte array
- QJniObject ndefMessageBA = ndefMessage.callObjectMethod("toByteArray", "()[B");
+ QJniObject ndefMessageBA = ndefMessage.callMethod<jbyteArray>("toByteArray");
QByteArray ndefMessageQBA = jbyteArrayToQByteArray(ndefMessageBA.object<jbyteArray>());
// Sending QNdefMessage, requestCompleted and exit.
@@ -189,7 +189,7 @@ QNearFieldTarget::RequestId QNearFieldTargetPrivateImpl::sendCommand(const QByte
env->SetByteArrayRegion(jba, 0, ba.size(), reinterpret_cast<jbyte*>(ba.data()));
// Writing
- QJniObject myNewVal = tagTech.callObjectMethod("transceive", "([B)[B", jba);
+ QJniObject myNewVal = tagTech.callMethod<jbyteArray>("transceive", jba);
if (!myNewVal.isValid()) {
// Some devices (Samsung, Huawei) throw an exception when the card is lost:
// "android.nfc.TagLostException: Tag was lost". But there seems to be a bug that
@@ -244,14 +244,15 @@ QNearFieldTarget::RequestId QNearFieldTargetPrivateImpl::writeNdefMessages(const
QByteArray ba = message.toByteArray();
QJniObject jba = env->NewByteArray(ba.size());
env->SetByteArrayRegion(jba.object<jbyteArray>(), 0, ba.size(), reinterpret_cast<jbyte*>(ba.data()));
- QJniObject jmessage = QJniObject("android/nfc/NdefMessage", "([B)V", jba.object<jbyteArray>());
+ QJniObject jmessage = QJniObject::construct<QtJniTypes::NdefMessage>(jba.object<jbyteArray>());
if (!jmessage.isValid()) {
reportError(QNearFieldTarget::UnknownError, requestId);
return requestId;
}
// Writing
- auto methodId = env.findMethod(tagTech.objectClass(), writeMethod, "(Landroid/nfc/NdefMessage;)V");
+ auto methodId =
+ env.findMethod<void, QtJniTypes::NdefMessage>(tagTech.objectClass(), writeMethod);
if (methodId)
env->CallVoidMethod(tagTech.object(), methodId, jmessage.object<jobject>());
if (!methodId || env.checkAndClearExceptions()) {
@@ -289,7 +290,7 @@ void QNearFieldTargetPrivateImpl::checkIsTargetLost()
QJniEnvironment env;
bool connected = false;
- auto methodId = env.findMethod(tagTech.objectClass(), "isConnected", "()Z");
+ auto methodId = env.findMethod<jboolean>(tagTech.objectClass(), "isConnected");
if (methodId)
connected = env->CallBooleanMethod(tagTech.object(), methodId);
if (!methodId || env.checkAndClearExceptions()) {
@@ -300,14 +301,14 @@ void QNearFieldTargetPrivateImpl::checkIsTargetLost()
if (connected)
return;
- methodId = env.findMethod(tagTech.objectClass(), "connect", "()V");
+ methodId = env.findMethod<void>(tagTech.objectClass(), "connect");
if (methodId)
env->CallVoidMethod(tagTech.object(), methodId);
if (!methodId || env.checkAndClearExceptions()) {
handleTargetLost();
return;
}
- methodId = env.findMethod(tagTech.objectClass(), "close", "()V");
+ methodId = env.findMethod<void>(tagTech.objectClass(), "close");
if (methodId)
env->CallVoidMethod(tagTech.object(), methodId);
if (!methodId || env.checkAndClearExceptions())
@@ -331,7 +332,7 @@ void QNearFieldTargetPrivateImpl::updateTechList()
QJniObject tag = AndroidNfc::getTag(targetIntent);
Q_ASSERT_X(tag.isValid(), "updateTechList", "could not get Tag object");
- QJniObject techListArray = tag.callObjectMethod("getTechList", "()[Ljava/lang/String;");
+ QJniObject techListArray = tag.callMethod<QtJniTypes::StringArray>("getTechList");
if (!techListArray.isValid()) {
handleTargetLost();
return;
@@ -342,7 +343,7 @@ void QNearFieldTargetPrivateImpl::updateTechList()
jsize techCount = env->GetArrayLength(techListArray.object<jobjectArray>());
for (jsize i = 0; i < techCount; ++i) {
QJniObject tech = env->GetObjectArrayElement(techListArray.object<jobjectArray>(), i);
- techList.append(tech.callObjectMethod<jstring>("toString").toString());
+ techList.append(tech.callMethod<jstring>("toString").toString());
}
}
@@ -355,7 +356,7 @@ QNearFieldTarget::Type QNearFieldTargetPrivateImpl::getTagType() const
{
if (techList.contains(NDEFTECHNOLOGY)) {
QJniObject ndef = getTagTechnology(NDEFTECHNOLOGY);
- QString qtype = ndef.callObjectMethod("getType", "()Ljava/lang/String;").toString();
+ QString qtype = ndef.callMethod<jstring>("getType").toString();
if (qtype.compare(MIFARETAG) == 0)
return QNearFieldTarget::MifareTag;
@@ -375,7 +376,7 @@ QNearFieldTarget::Type QNearFieldTargetPrivateImpl::getTagType() const
// Checking ATQA/SENS_RES
// xxx0 0000 xxxx xxxx: Identifies tag Type 1 platform
QJniObject nfca = getTagTechnology(NFCATECHNOLOGY);
- QJniObject atqaBA = nfca.callObjectMethod("getAtqa", "()[B");
+ QJniObject atqaBA = nfca.callMethod<jbyteArray>("getAtqa");
QByteArray atqaQBA = jbyteArrayToQByteArray(atqaBA.object<jbyteArray>());
if (atqaQBA.isEmpty())
return QNearFieldTarget::ProprietaryTag;
@@ -452,7 +453,7 @@ bool QNearFieldTargetPrivateImpl::connect()
return false;
QJniEnvironment env;
- auto methodId = env.findMethod(tagTech.objectClass(), "isConnected", "()Z");
+ auto methodId = env.findMethod<jboolean>(tagTech.objectClass(), "isConnected");
bool connected = false;
if (methodId)
connected = env->CallBooleanMethod(tagTech.object(), methodId);
@@ -463,7 +464,7 @@ bool QNearFieldTargetPrivateImpl::connect()
return true;
setCommandTimeout(2000);
- methodId = env.findMethod(tagTech.objectClass(), "connect", "()V");
+ methodId = env.findMethod<void>(tagTech.objectClass(), "connect");
if (!methodId)
return false;
env->CallVoidMethod(tagTech.object(), methodId);
@@ -476,7 +477,7 @@ bool QNearFieldTargetPrivateImpl::setCommandTimeout(int timeout)
return false;
QJniEnvironment env;
- auto methodId = env.findMethod(tagTech.objectClass(), "setTimeout", "(I)V");
+ auto methodId = env.findMethod<void, jint>(tagTech.objectClass(), "setTimeout");
if (methodId)
env->CallVoidMethod(tagTech.object(), methodId, timeout);
return methodId && !env.checkAndClearExceptions();