summaryrefslogtreecommitdiffstats
path: root/src/nfc/android
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/nfc/android
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/nfc/android')
-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
4 files changed, 29 insertions, 128 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;