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>
bb10
Christian Strømme 2014-04-23 16:48:41 +02:00 committed by Christian Stromme
parent 1220a87f8a
commit b61ee210e6
3 changed files with 12 additions and 60 deletions

View File

@ -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();
}
}

View File

@ -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

View File

@ -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)) {