summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPeter Rustler <peter.rustler@basyskom.com>2015-03-06 12:16:28 +0100
committerAlex Blasche <alexander.blasche@theqtcompany.com>2015-03-19 08:10:04 +0000
commit24a9b68c8eba782fee2e040113fe8afe783ba8ec (patch)
treeeb14aeafe3358765b32cf12fe8dd97f245cd92de /src
parent55aab6b68bf4991fb133b5f7066a07554e3c5b3e (diff)
Using QtAndroidExtras instead of Andoid JNI for NFC
Some functions in QNearfieldtarget_android are missing. They will be ported to QtAndroidExtras in a later commit. Change-Id: Ib68f91f394f28c8b19ccea4335c8f0292929f003 Reviewed-by: Alex Blasche <alexander.blasche@theqtcompany.com>
Diffstat (limited to 'src')
-rw-r--r--src/nfc/android/androidjninfc.cpp110
-rw-r--r--src/nfc/android/androidjninfc_p.h20
-rw-r--r--src/nfc/android/androidmainnewintentlistener.cpp20
-rw-r--r--src/nfc/android/androidmainnewintentlistener_p.h7
-rw-r--r--src/nfc/nfc.pro2
-rw-r--r--src/nfc/qnearfieldmanager_android.cpp59
-rw-r--r--src/nfc/qnearfieldmanager_android_p.h10
-rw-r--r--src/nfc/qnearfieldtarget_android.cpp45
-rw-r--r--src/nfc/qnearfieldtarget_android_p.h8
9 files changed, 78 insertions, 203 deletions
diff --git a/src/nfc/android/androidjninfc.cpp b/src/nfc/android/androidjninfc.cpp
index 4a1c077d..a95e2f98 100644
--- a/src/nfc/android/androidjninfc.cpp
+++ b/src/nfc/android/androidjninfc.cpp
@@ -41,75 +41,31 @@
#include "qbytearray.h"
#include "qdebug.h"
-static JavaVM *javaVM = 0;
-static jclass nfcClass;
-
-static jmethodID startDiscoveryId;
-static jmethodID stopDiscoveryId;
-static jmethodID isAvailableId;
-static jmethodID getStartIntentId;
+static const char *nfcClassName = "org/qtproject/qt5/android/nfc/QtNfc";
static AndroidNfc::MainNfcNewIntentListener mainListener;
QT_BEGIN_ANDROIDNFC_NAMESPACE
-AttachedJNIEnv::AttachedJNIEnv()
-{
- Q_ASSERT_X(javaVM != 0, "constructor", "javaVM pointer is null");
- attached = false;
- if (javaVM->GetEnv((void**)&jniEnv, JNI_VERSION_1_6) < 0) {
- if (javaVM->AttachCurrentThread(&jniEnv, NULL) < 0) {
- __android_log_print(ANDROID_LOG_ERROR, "Qt", "AttachCurrentThread failed");
- jniEnv = 0;
- return;
- }
- attached = true;
- }
-}
-
-AttachedJNIEnv::~AttachedJNIEnv()
-{
- if (attached)
- javaVM->DetachCurrentThread();
-}
-
bool startDiscovery()
{
- //__android_log_print(ANDROID_LOG_INFO, "Qt", "QtNfc::startDiscovery()");
- AttachedJNIEnv aenv;
- if (!aenv.jniEnv)
- return false;
-
- return aenv.jniEnv->CallStaticBooleanMethod(nfcClass, startDiscoveryId);
+ return QAndroidJniObject::callStaticMethod<jboolean>(nfcClassName,"start");
}
bool isAvailable()
{
- //__android_log_print(ANDROID_LOG_INFO, "Qt", "QtNfc::isAvailable()");
- AttachedJNIEnv aenv;
- if (!aenv.jniEnv)
- return false;
-
- return aenv.jniEnv->CallStaticBooleanMethod(nfcClass, isAvailableId);
+ return QAndroidJniObject::callStaticMethod<jboolean>(nfcClassName,"isAvailable");
}
bool stopDiscovery()
{
- __android_log_print(ANDROID_LOG_INFO, "Qt", "QtNfc::stopDiscovery()");
- AttachedJNIEnv aenv;
- if (!aenv.jniEnv)
- return false;
-
- return aenv.jniEnv->CallStaticBooleanMethod(nfcClass, stopDiscoveryId);
+ return QAndroidJniObject::callStaticMethod<jboolean>(nfcClassName,"stop");
}
-jobject getStartIntent()
+QAndroidJniObject getStartIntent()
{
- AttachedJNIEnv aenv;
- if (!aenv.jniEnv)
- return NULL;
-
- return aenv.jniEnv->CallStaticObjectMethod(nfcClass, getStartIntentId);
+ QAndroidJniObject ret = QAndroidJniObject::callStaticObjectMethod(nfcClassName, "getStartIntent", "()Landroid/content/Intent;");
+ return ret;
}
bool registerListener(AndroidNfcListenerInterface *listener)
@@ -122,66 +78,22 @@ bool unregisterListener(AndroidNfcListenerInterface *listener)
return mainListener.unregisterListener(listener);
}
-jobject getTag(JNIEnv *env, jobject intent)
+QAndroidJniObject getTag(const QAndroidJniObject &intent)
{
- jclass intentClass = env->GetObjectClass(intent);
- Q_ASSERT_X(intentClass != 0, "getTag", "could not get Intent class");
-
- jmethodID getParcelableExtraMID = env->GetMethodID(intentClass,
- "getParcelableExtra",
- "(Ljava/lang/String;)Landroid/os/Parcelable;");
- Q_ASSERT_X(getParcelableExtraMID != 0, "getTag", "could not get method ID for getParcelableExtra()");
-
- jclass nfcAdapterClass = env->FindClass("android/nfc/NfcAdapter");
- Q_ASSERT_X(nfcAdapterClass != 0, "getTag", "could not find NfcAdapter class");
-
- jfieldID extraTagFID = env->GetStaticFieldID(nfcAdapterClass, "EXTRA_TAG", "Ljava/lang/String;");
- Q_ASSERT_X(extraTagFID != 0, "getTag", "could not get field ID for EXTRA_TAG");
-
- jobject extraTag = env->GetStaticObjectField(nfcAdapterClass, extraTagFID);
- Q_ASSERT_X(extraTag != 0, "getTag", "could not get EXTRA_TAG");
-
- jobject tag = env->CallObjectMethod(intent, getParcelableExtraMID, extraTag);
- Q_ASSERT_X(tag != 0, "getTag", "could not get Tag object");
-
+ QAndroidJniObject extraTag = QAndroidJniObject::getStaticObjectField("android/nfc/NfcAdapter", "EXTRA_TAG", "Ljava/lang/String;");
+ QAndroidJniObject tag = intent.callObjectMethod("getParcelableExtra", "(Ljava/lang/String;)Landroid/os/Parcelable;", extraTag.object<jstring>());
+ Q_ASSERT_X(tag.isValid(), "getTag", "could not get Tag object");
return tag;
}
QT_END_ANDROIDNFC_NAMESPACE
-static const char logTag[] = "Qt";
-static const char classErrorMsg[] = "Can't find class \"%s\"";
-static const char methodErrorMsg[] = "Can't find method \"%s%s\"";
-
-#define FIND_AND_CHECK_CLASS(CLASS_NAME) \
- clazz = env->FindClass(CLASS_NAME); \
- if (!clazz) { \
- return JNI_FALSE; \
- }
-
-#define GET_AND_CHECK_STATIC_METHOD(VAR, CLASS, METHOD_NAME, METHOD_SIGNATURE) \
- VAR = env->GetStaticMethodID(CLASS, METHOD_NAME, METHOD_SIGNATURE); \
- if (!VAR) { \
- return JNI_FALSE; \
- }
-
Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void * /*reserved*/)
{
- //__android_log_print(ANDROID_LOG_INFO, "Qt", "JNI_OnLoad for QtNfc");
JNIEnv* env;
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
return -1;
}
- jclass clazz;
- FIND_AND_CHECK_CLASS("org/qtproject/qt5/android/nfc/QtNfc");
- nfcClass = static_cast<jclass>(env->NewGlobalRef(clazz));
-
- GET_AND_CHECK_STATIC_METHOD(startDiscoveryId, nfcClass, "start", "()Z");
- GET_AND_CHECK_STATIC_METHOD(stopDiscoveryId, nfcClass, "stop", "()Z");
- GET_AND_CHECK_STATIC_METHOD(isAvailableId, nfcClass, "isAvailable", "()Z");
- GET_AND_CHECK_STATIC_METHOD(getStartIntentId, nfcClass, "getStartIntent", "()Landroid/content/Intent;");
- javaVM = vm;
-
return JNI_VERSION_1_6;
}
diff --git a/src/nfc/android/androidjninfc_p.h b/src/nfc/android/androidjninfc_p.h
index 9e402abd..fd69412a 100644
--- a/src/nfc/android/androidjninfc_p.h
+++ b/src/nfc/android/androidjninfc_p.h
@@ -35,7 +35,7 @@
#include "qglobal.h"
-#include <jni.h>
+#include <QtAndroidExtras/QAndroidJniObject>
#define QT_USE_ANDROIDNFC_NAMESPACE using namespace ::AndroidNfc;
#define QT_BEGIN_ANDROIDNFC_NAMESPACE namespace AndroidNfc {
@@ -47,28 +47,16 @@ class AndroidNfcListenerInterface
{
public:
virtual ~AndroidNfcListenerInterface(){}
- virtual void newIntent(jobject intent) = 0;
-};
-
-class AttachedJNIEnv
-{
-public:
- AttachedJNIEnv();
- virtual ~AttachedJNIEnv();
- bool attached;
- JNIEnv *jniEnv;
-
-private:
- Q_DISABLE_COPY(AttachedJNIEnv)
+ virtual void newIntent(QAndroidJniObject intent) = 0;
};
bool startDiscovery();
bool stopDiscovery();
-jobject getStartIntent();
+QAndroidJniObject getStartIntent();
bool isAvailable();
bool registerListener(AndroidNfcListenerInterface *listener);
bool unregisterListener(AndroidNfcListenerInterface *listener);
-jobject getTag(JNIEnv *env, jobject intent);
+QAndroidJniObject getTag(const QAndroidJniObject &intent);
QT_END_ANDROIDNFC_NAMESPACE
diff --git a/src/nfc/android/androidmainnewintentlistener.cpp b/src/nfc/android/androidmainnewintentlistener.cpp
index c8f16572..f5b06cbc 100644
--- a/src/nfc/android/androidmainnewintentlistener.cpp
+++ b/src/nfc/android/androidmainnewintentlistener.cpp
@@ -33,7 +33,9 @@
#include "androidmainnewintentlistener_p.h"
+#include "qdebug.h"
#include <QtGui/QGuiApplication>
+#include <QtAndroidExtras/QAndroidJniObject>
QT_BEGIN_ANDROIDNFC_NAMESPACE
@@ -50,15 +52,11 @@ MainNfcNewIntentListener::~MainNfcNewIntentListener()
QtAndroidPrivate::unregisterResumePauseListener(this);
}
-bool MainNfcNewIntentListener::handleNewIntent(JNIEnv *env, jobject intent)
+bool MainNfcNewIntentListener::handleNewIntent(JNIEnv */*env*/, jobject intent)
{
- AndroidNfc::AttachedJNIEnv aenv;
listenersLock.lockForRead();
foreach (AndroidNfc::AndroidNfcListenerInterface *listener, listeners) {
- // Making new global reference for each listener.
- // Listeners must release reference when it is not used anymore.
- jobject newIntentRef = env->NewGlobalRef(intent);
- listener->newIntent(newIntentRef);
+ listener->newIntent(QAndroidJniObject(intent));
}
listenersLock.unlock();
return true;
@@ -68,13 +66,9 @@ bool MainNfcNewIntentListener::registerListener(AndroidNfcListenerInterface *lis
{
static bool firstListener = true;
if (firstListener) {
- AttachedJNIEnv aenv;
- if (aenv.jniEnv) {
- jobject intent = AndroidNfc::getStartIntent();
- if (intent) {
- jobject newIntentRef = aenv.jniEnv->NewGlobalRef(intent);
- listener->newIntent(newIntentRef);
- }
+ QAndroidJniObject intent = AndroidNfc::getStartIntent();
+ if (intent.isValid()) {
+ listener->newIntent(intent);
}
paused = static_cast<QGuiApplication*>(QGuiApplication::instance())->applicationState() != Qt::ApplicationActive;
}
diff --git a/src/nfc/android/androidmainnewintentlistener_p.h b/src/nfc/android/androidmainnewintentlistener_p.h
index fd68ac7b..6a016339 100644
--- a/src/nfc/android/androidmainnewintentlistener_p.h
+++ b/src/nfc/android/androidmainnewintentlistener_p.h
@@ -47,11 +47,18 @@ class MainNfcNewIntentListener : public QtAndroidPrivate::NewIntentListener, QtA
public:
MainNfcNewIntentListener();
~MainNfcNewIntentListener();
+
+ //QtAndroidPrivate::NewIntentListener
bool handleNewIntent(JNIEnv *env, jobject intent);
+
bool registerListener(AndroidNfcListenerInterface *listener);
bool unregisterListener(AndroidNfcListenerInterface *listener);
+
+ //QtAndroidPrivate::ResumePauseListener
void handleResume();
void handlePause();
+
+private:
void updateReceiveState();
protected:
QList<AndroidNfc::AndroidNfcListenerInterface*> listeners;
diff --git a/src/nfc/nfc.pro b/src/nfc/nfc.pro
index 65a746d9..83b8e236 100644
--- a/src/nfc/nfc.pro
+++ b/src/nfc/nfc.pro
@@ -153,7 +153,7 @@ CONFIG(blackberry) {
ANDROID_JAR_DEPENDENCIES = \
jar/QtNfc.jar:org.qtproject.qt5.android.nfc.QtNfc
DEFINES += ANDROID_NFC
- QT += core-private gui
+ QT += core-private gui androidextras
PRIVATE_HEADERS += \
qllcpserver_android_p.h \
diff --git a/src/nfc/qnearfieldmanager_android.cpp b/src/nfc/qnearfieldmanager_android.cpp
index b317fadf..7cb1829f 100644
--- a/src/nfc/qnearfieldmanager_android.cpp
+++ b/src/nfc/qnearfieldmanager_android.cpp
@@ -50,7 +50,7 @@ QT_BEGIN_NAMESPACE
QNearFieldManagerPrivateImpl::QNearFieldManagerPrivateImpl() :
m_detecting(false), m_handlerID(0)
{
- qRegisterMetaType<jobject>("jobject");
+ qRegisterMetaType<QAndroidJniObject>("QAndroidJniObject");
qRegisterMetaType<QNdefMessage>("QNdefMessage");
connect(this, SIGNAL(targetDetected(QNearFieldTarget*)), this, SLOT(handlerTargetDetected(QNearFieldTarget*)));
connect(this, SIGNAL(targetLost(QNearFieldTarget*)), this, SLOT(handlerTargetLost(QNearFieldTarget*)));
@@ -201,49 +201,28 @@ void QNearFieldManagerPrivateImpl::releaseAccess(QNearFieldManager::TargetAccess
//Do nothing, because we dont have access modes for the target
}
-void QNearFieldManagerPrivateImpl::newIntent(jobject intent)
+void QNearFieldManagerPrivateImpl::newIntent(QAndroidJniObject intent)
{
// This function is called from different thread and is used to move intent to main thread.
- QMetaObject::invokeMethod(this, "onTargetDiscovered", Qt::QueuedConnection, Q_ARG(jobject, intent));
+ QMetaObject::invokeMethod(this, "onTargetDiscovered", Qt::QueuedConnection, Q_ARG(QAndroidJniObject, intent));
}
-QByteArray QNearFieldManagerPrivateImpl::getUid(jobject intent)
+QByteArray QNearFieldManagerPrivateImpl::getUid(const QAndroidJniObject &intent)
{
- if (intent == 0)
+ if (!intent.isValid())
return QByteArray();
- AndroidNfc::AttachedJNIEnv aenv;
- JNIEnv *env = aenv.jniEnv;
- jobject tag = AndroidNfc::getTag(env, intent);
-
- jclass tagClass = env->GetObjectClass(tag);
- Q_ASSERT_X(tagClass != 0, "getUid", "could not get Tag class");
-
- jmethodID getIdMID = env->GetMethodID(tagClass, "getId", "()[B");
- Q_ASSERT_X(getIdMID != 0, "getUid", "could not get method ID for getId()");
-
- jbyteArray tagId = reinterpret_cast<jbyteArray>(env->CallObjectMethod(tag, getIdMID));
- Q_ASSERT_X(tagId != 0, "getUid", "getId() returned null object");
-
- QByteArray uid;
- jsize len = env->GetArrayLength(tagId);
- uid.resize(len);
- env->GetByteArrayRegion(tagId, 0, len, reinterpret_cast<jbyte*>(uid.data()));
-
- return uid;
+ QAndroidJniEnvironment env;
+ QAndroidJniObject tag = AndroidNfc::getTag(intent);
+ return getUidforTag(tag);
}
-void QNearFieldManagerPrivateImpl::onTargetDiscovered(jobject intent)
+void QNearFieldManagerPrivateImpl::onTargetDiscovered(QAndroidJniObject intent)
{
- AndroidNfc::AttachedJNIEnv aenv;
- JNIEnv *env = aenv.jniEnv;
- Q_ASSERT_X(env != 0, "onTargetDiscovered", "env pointer is null");
-
- // Getting tag object and UID
- jobject tag = AndroidNfc::getTag(env, intent);
- QByteArray uid = getUid(env, tag);
+ // Getting UID
+ QByteArray uid = getUid(intent);
- // Accepting all targest but only sending signal of requested types.
+ // Accepting all targets but only sending signal of requested types.
NearFieldTarget *&target = m_detectedTargets[uid];
if (target) {
target->setIntent(intent); // Updating existing target
@@ -260,15 +239,17 @@ void QNearFieldManagerPrivateImpl::onTargetDestroyed(const QByteArray &uid)
m_detectedTargets.remove(uid);
}
-QByteArray QNearFieldManagerPrivateImpl::getUid(JNIEnv *env, jobject tag)
+QByteArray QNearFieldManagerPrivateImpl::getUidforTag(const QAndroidJniObject &tag)
{
- jclass tagClass = env->GetObjectClass(tag);
- jmethodID getIdMID = env->GetMethodID(tagClass, "getId", "()[B");
- jbyteArray tagId = reinterpret_cast<jbyteArray>(env->CallObjectMethod(tag, getIdMID));
+ if (!tag.isValid())
+ return QByteArray();
+
+ QAndroidJniEnvironment env;
+ QAndroidJniObject tagId = tag.callObjectMethod("getId", "()[B");
QByteArray uid;
- jsize len = env->GetArrayLength(tagId);
+ jsize len = env->GetArrayLength(tagId.object<jbyteArray>());
uid.resize(len);
- env->GetByteArrayRegion(tagId, 0, len, reinterpret_cast<jbyte*>(uid.data()));
+ env->GetByteArrayRegion(tagId.object<jbyteArray>(), 0, len, reinterpret_cast<jbyte*>(uid.data()));
return uid;
}
diff --git a/src/nfc/qnearfieldmanager_android_p.h b/src/nfc/qnearfieldmanager_android_p.h
index 8c6a0fb4..3d45b700 100644
--- a/src/nfc/qnearfieldmanager_android_p.h
+++ b/src/nfc/qnearfieldmanager_android_p.h
@@ -41,6 +41,8 @@
#include <QHash>
#include <QMap>
+#include <QtAndroidExtras/QAndroidJniObject>
+#include <QtAndroidExtras/QAndroidJniEnvironment>
QT_BEGIN_NAMESPACE
@@ -64,11 +66,11 @@ public:
virtual bool unregisterNdefMessageHandler(int handlerId);
virtual void requestAccess(QNearFieldManager::TargetAccessModes accessModes);
virtual void releaseAccess(QNearFieldManager::TargetAccessModes accessModes);
- virtual void newIntent(jobject intent);
- QByteArray getUid(jobject intent);
+ virtual void newIntent(QAndroidJniObject intent);
+ QByteArray getUid(const QAndroidJniObject &intent);
public slots:
- void onTargetDiscovered(jobject intent);
+ void onTargetDiscovered(QAndroidJniObject intent);
void onTargetDestroyed(const QByteArray &uid);
void handlerTargetDetected(QNearFieldTarget *target);
void handlerTargetLost(QNearFieldTarget *target);
@@ -77,7 +79,7 @@ public slots:
void handlerError(QNearFieldTarget::Error error, const QNearFieldTarget::RequestId &id);
protected:
- static QByteArray getUid(JNIEnv *env, jobject tag);
+ static QByteArray getUidforTag(const QAndroidJniObject &tag);
void updateReceiveState();
private:
diff --git a/src/nfc/qnearfieldtarget_android.cpp b/src/nfc/qnearfieldtarget_android.cpp
index d98c07f4..9007ad94 100644
--- a/src/nfc/qnearfieldtarget_android.cpp
+++ b/src/nfc/qnearfieldtarget_android.cpp
@@ -45,7 +45,7 @@ const QString NearFieldTarget::MifareClassicTechnology = QString::fromUtf8("andr
const QString NearFieldTarget::MifareUltralightTechnology = QString::fromUtf8("android.nfc.tech.MifareUltralight");
-NearFieldTarget::NearFieldTarget(jobject intent, const QByteArray uid, QObject *parent) :
+NearFieldTarget::NearFieldTarget(QAndroidJniObject intent, const QByteArray uid, QObject *parent) :
QNearFieldTarget(parent),
m_intent(intent),
m_uid(uid)
@@ -90,7 +90,7 @@ QNearFieldTarget::RequestId NearFieldTarget::readNdefMessages()
// Making sure that target is still in range
QNearFieldTarget::RequestId requestId(new QNearFieldTarget::RequestIdPrivate);
- if (m_intent == 0) {
+ if (!m_intent.isValid()) {
QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::TargetOutOfRangeError),
Q_ARG(const QNearFieldTarget::RequestId&, requestId));
@@ -98,9 +98,7 @@ QNearFieldTarget::RequestId NearFieldTarget::readNdefMessages()
}
// Getting Ndef technology object
- AndroidNfc::AttachedJNIEnv aenv;
- JNIEnv *env = aenv.jniEnv;
- Q_ASSERT_X(env != 0, "readNdefMessages", "env pointer is null");
+ QAndroidJniEnvironment env;
jobject ndef = getTagTechnology(NdefTechology, env);
if (ndef == 0) {
QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
@@ -228,8 +226,7 @@ QNearFieldTarget::RequestId NearFieldTarget::writeNdefMessages(const QList<QNdef
if (messages.size() > 1)
qWarning("QNearFieldTarget::writeNdefMessages: Android supports writing only one NDEF message per tag.");
- AndroidNfc::AttachedJNIEnv aenv;
- JNIEnv *env = aenv.jniEnv;
+ QAndroidJniEnvironment env;
jmethodID writeMethod;
jobject tagTechnology;
jclass tagClass;
@@ -294,14 +291,14 @@ QNearFieldTarget::RequestId NearFieldTarget::writeNdefMessages(const QList<QNdef
return requestId;
}
-void NearFieldTarget::setIntent(jobject intent)
+void NearFieldTarget::setIntent(QAndroidJniObject intent)
{
if (m_intent == intent)
return;
releaseIntent();
m_intent = intent;
- if (m_intent) {
+ if (m_intent.isValid()) {
// Updating tech list and type in case of there is another tag with same UID as one before.
updateTechList();
updateType();
@@ -311,14 +308,12 @@ void NearFieldTarget::setIntent(jobject intent)
void NearFieldTarget::checkIsTargetLost()
{
- if (m_intent == 0 || m_techList.isEmpty()) {
+ if (!m_intent.isValid() || m_techList.isEmpty()) {
handleTargetLost();
return;
}
- AndroidNfc::AttachedJNIEnv aenv;
- JNIEnv *env = aenv.jniEnv;
-
+ QAndroidJniEnvironment env;
// Using first available technology to check connection
QString techStr = m_techList.first();
jobject tagTechObj = getTagTechnology(techStr, env);
@@ -340,24 +335,18 @@ void NearFieldTarget::releaseIntent()
{
m_targetCheckTimer->stop();
- if (m_intent == 0)
- return;
-
- AndroidNfc::AttachedJNIEnv aenv;
- Q_ASSERT_X(aenv.jniEnv != 0, "releaseIntent", "aenv.jniEnv pointer is null");
- aenv.jniEnv->DeleteGlobalRef(m_intent);
- m_intent = 0;
+ m_intent = QAndroidJniObject();
}
void NearFieldTarget::updateTechList()
{
- if (m_intent == 0)
+ if (!m_intent.isValid())
return;
// Getting tech list
- AndroidNfc::AttachedJNIEnv aenv;
- JNIEnv *env = aenv.jniEnv;
- jobject tag = AndroidNfc::getTag(env, m_intent);
+ QAndroidJniEnvironment env;
+ QAndroidJniObject x = AndroidNfc::getTag(/*env,*/ m_intent);
+ jobject tag = x.object<jobject>();
jclass tagClass = env->GetObjectClass(tag);
jmethodID techListMID = env->GetMethodID(tagClass, "getTechList", "()[Ljava/lang/String;");
jobjectArray techListArray = reinterpret_cast<jobjectArray>(env->CallObjectMethod(tag, techListMID));
@@ -384,9 +373,7 @@ void NearFieldTarget::updateType()
QNearFieldTarget::Type NearFieldTarget::getTagType() const
{
- AndroidNfc::AttachedJNIEnv aenv;
- JNIEnv *env = aenv.jniEnv;
- Q_ASSERT_X(env != 0, "type", "env pointer is null");
+ QAndroidJniEnvironment env;
if (m_techList.contains(NdefTechology)) {
jobject ndef = getTagTechnology(NdefTechology, env);
@@ -462,7 +449,9 @@ jobject NearFieldTarget::getTagTechnology(const QString &tech, JNIEnv *env) cons
techClass.replace(QLatin1Char('.'), QLatin1Char('/'));
// Getting requested technology
- jobject tag = AndroidNfc::getTag(env, m_intent);
+ QAndroidJniEnvironment aenv;
+ QAndroidJniObject x = AndroidNfc::getTag(m_intent);
+ jobject tag = x.object<jobject>();
jclass tagClass = env->FindClass(techClass.toUtf8().constData());
const QString sig = QString::fromUtf8("(Landroid/nfc/Tag;)L%1;");
jmethodID getTagMethodID = env->GetStaticMethodID(tagClass, "get", sig.arg(techClass).toUtf8().constData());
diff --git a/src/nfc/qnearfieldtarget_android_p.h b/src/nfc/qnearfieldtarget_android_p.h
index 57d54890..a73203a3 100644
--- a/src/nfc/qnearfieldtarget_android_p.h
+++ b/src/nfc/qnearfieldtarget_android_p.h
@@ -42,6 +42,8 @@
#include "qstringlist.h"
#include <QTimer>
+#include <QtAndroidExtras/QAndroidJniObject>
+#include <QtAndroidExtras/QAndroidJniEnvironment>
QT_BEGIN_NAMESPACE
@@ -49,7 +51,7 @@ class NearFieldTarget : public QNearFieldTarget
{
Q_OBJECT
public:
- NearFieldTarget(jobject intent,
+ NearFieldTarget(QAndroidJniObject intent,
const QByteArray uid,
QObject *parent = 0);
virtual ~NearFieldTarget();
@@ -61,7 +63,7 @@ public:
virtual RequestId sendCommand(const QByteArray &command);
virtual RequestId sendCommands(const QList<QByteArray> &commands);
virtual RequestId writeNdefMessages(const QList<QNdefMessage> &messages);
- void setIntent(jobject intent);
+ void setIntent(QAndroidJniObject intent);
signals:
void targetDestroyed(const QByteArray &tagId);
@@ -83,7 +85,7 @@ protected:
bool catchJavaExceptions(JNIEnv *env) const;
protected:
- jobject m_intent;
+ QAndroidJniObject m_intent;
QByteArray m_uid;
QStringList m_techList;
Type m_type;