diff options
author | Peter Rustler <peter.rustler@basyskom.com> | 2015-03-06 12:16:28 +0100 |
---|---|---|
committer | Alex Blasche <alexander.blasche@theqtcompany.com> | 2015-03-19 08:10:04 +0000 |
commit | 24a9b68c8eba782fee2e040113fe8afe783ba8ec (patch) | |
tree | eb14aeafe3358765b32cf12fe8dd97f245cd92de /src | |
parent | 55aab6b68bf4991fb133b5f7066a07554e3c5b3e (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.cpp | 110 | ||||
-rw-r--r-- | src/nfc/android/androidjninfc_p.h | 20 | ||||
-rw-r--r-- | src/nfc/android/androidmainnewintentlistener.cpp | 20 | ||||
-rw-r--r-- | src/nfc/android/androidmainnewintentlistener_p.h | 7 | ||||
-rw-r--r-- | src/nfc/nfc.pro | 2 | ||||
-rw-r--r-- | src/nfc/qnearfieldmanager_android.cpp | 59 | ||||
-rw-r--r-- | src/nfc/qnearfieldmanager_android_p.h | 10 | ||||
-rw-r--r-- | src/nfc/qnearfieldtarget_android.cpp | 45 | ||||
-rw-r--r-- | src/nfc/qnearfieldtarget_android_p.h | 8 |
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; |