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/nfc/android | |
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/nfc/android')
-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 |
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; |