summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Strømme <christian.stromme@digia.com>2014-04-23 16:48:41 +0200
committerChristian Stromme <christian.stromme@digia.com>2014-07-14 02:25:29 +0200
commitb61ee210e67e5575bc96489908b9c46f7b74ec7a (patch)
tree92de88e189236d8681af7b904519d93920c02c05
parent1220a87f8adfcc30cd31a2b1a5bccbee8c394cec (diff)
Android: Simplify the jni code in QtAndroidClipboard
Let the QJNI classes manage the jni environment and cache the jni handles. This lets us lazily cache the jni handle until we actually need them. Change-Id: Iced91e7cab19bdcab8581e94c6f2dd766fed47ed Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
-rw-r--r--src/plugins/platforms/android/androidjniclipboard.cpp68
-rw-r--r--src/plugins/platforms/android/androidjniclipboard.h3
-rw-r--r--src/plugins/platforms/android/androidjnimain.cpp1
3 files changed, 12 insertions, 60 deletions
diff --git a/src/plugins/platforms/android/androidjniclipboard.cpp b/src/plugins/platforms/android/androidjniclipboard.cpp
index 87bb08910d..712a384a36 100644
--- a/src/plugins/platforms/android/androidjniclipboard.cpp
+++ b/src/plugins/platforms/android/androidjniclipboard.cpp
@@ -41,83 +41,39 @@
#include "androidjniclipboard.h"
#include "androidjnimain.h"
+#include <QtCore/private/qjni_p.h>
QT_BEGIN_NAMESPACE
using namespace QtAndroid;
namespace QtAndroidClipboard
{
- // Clipboard support
- static jmethodID m_registerClipboardManagerMethodID = 0;
- static jmethodID m_setClipboardTextMethodID = 0;
- static jmethodID m_hasClipboardTextMethodID = 0;
- static jmethodID m_getClipboardTextMethodID = 0;
- // Clipboard support
-
void setClipboardListener(QAndroidPlatformClipboard *listener)
{
Q_UNUSED(listener);
-
- AttachedJNIEnv env;
- if (!env.jniEnv)
- return;
-
- env.jniEnv->CallStaticVoidMethod(applicationClass(), m_registerClipboardManagerMethodID);
+ QJNIObjectPrivate::callStaticMethod<void>(applicationClass(), "registerClipboardManager");
}
void setClipboardText(const QString &text)
{
- AttachedJNIEnv env;
- if (!env.jniEnv)
- return;
-
- jstring jtext = env.jniEnv->NewString(reinterpret_cast<const jchar *>(text.data()),
- text.length());
- env.jniEnv->CallStaticVoidMethod(applicationClass(), m_setClipboardTextMethodID, jtext);
- env.jniEnv->DeleteLocalRef(jtext);
+ QJNIObjectPrivate::callStaticMethod<void>(applicationClass(),
+ "setClipboardText",
+ "(Ljava/lang/String;)V",
+ QJNIObjectPrivate::fromString(text).object());
}
bool hasClipboardText()
{
- AttachedJNIEnv env;
- if (!env.jniEnv)
- return false;
-
- return env.jniEnv->CallStaticBooleanMethod(applicationClass(), m_hasClipboardTextMethodID);
+ return QJNIObjectPrivate::callStaticMethod<jboolean>(applicationClass(),
+ "hasClipboardText");
}
QString clipboardText()
{
- AttachedJNIEnv env;
- if (!env.jniEnv)
- return QString();
-
- jstring text = reinterpret_cast<jstring>(env.jniEnv->CallStaticObjectMethod(applicationClass(),
- m_getClipboardTextMethodID));
- const jchar *jstr = env.jniEnv->GetStringChars(text, 0);
- QString str(reinterpret_cast<const QChar *>(jstr), env.jniEnv->GetStringLength(text));
- env.jniEnv->ReleaseStringChars(text, jstr);
- return str;
- }
-
-
-#define GET_AND_CHECK_STATIC_METHOD(VAR, CLASS, METHOD_NAME, METHOD_SIGNATURE) \
- VAR = env->GetStaticMethodID(CLASS, METHOD_NAME, METHOD_SIGNATURE); \
- if (!VAR) { \
- __android_log_print(ANDROID_LOG_FATAL, qtTagText(), methodErrorMsgFmt(), METHOD_NAME, METHOD_SIGNATURE); \
- return false; \
- }
-
- bool registerNatives(JNIEnv *env)
- {
- jclass appClass = QtAndroid::applicationClass();
-
- GET_AND_CHECK_STATIC_METHOD(m_registerClipboardManagerMethodID, appClass, "registerClipboardManager", "()V");
- GET_AND_CHECK_STATIC_METHOD(m_setClipboardTextMethodID, appClass, "setClipboardText", "(Ljava/lang/String;)V");
- GET_AND_CHECK_STATIC_METHOD(m_hasClipboardTextMethodID, appClass, "hasClipboardText", "()Z");
- GET_AND_CHECK_STATIC_METHOD(m_getClipboardTextMethodID, appClass, "getClipboardText", "()Ljava/lang/String;");
-
- return true;
+ QJNIObjectPrivate text = QJNIObjectPrivate::callStaticObjectMethod(applicationClass(),
+ "getClipboardText",
+ "()Ljava/lang/String;");
+ return text.toString();
}
}
diff --git a/src/plugins/platforms/android/androidjniclipboard.h b/src/plugins/platforms/android/androidjniclipboard.h
index 764ef908df..bd833226af 100644
--- a/src/plugins/platforms/android/androidjniclipboard.h
+++ b/src/plugins/platforms/android/androidjniclipboard.h
@@ -42,7 +42,6 @@
#ifndef ANDROIDJNICLIPBOARD_H
#define ANDROIDJNICLIPBOARD_H
-#include <jni.h>
#include <QString>
QT_BEGIN_NAMESPACE
@@ -56,8 +55,6 @@ namespace QtAndroidClipboard
bool hasClipboardText();
QString clipboardText();
// Clipboard support
-
- bool registerNatives(JNIEnv *env);
}
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp
index d82487ae9b..3e3e169df9 100644
--- a/src/plugins/platforms/android/androidjnimain.cpp
+++ b/src/plugins/platforms/android/androidjnimain.cpp
@@ -773,7 +773,6 @@ Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void */*reserved*/)
JNIEnv *env = uenv.nativeEnvironment;
if (!registerNatives(env)
|| !QtAndroidInput::registerNatives(env)
- || !QtAndroidClipboard::registerNatives(env)
|| !QtAndroidMenu::registerNatives(env)
|| !QtAndroidAccessibility::registerNatives(env)
|| !QtAndroidDialogHelpers::registerNatives(env)) {