diff options
Diffstat (limited to 'src/corelib/kernel/qjni.cpp')
-rw-r--r-- | src/corelib/kernel/qjni.cpp | 2386 |
1 files changed, 0 insertions, 2386 deletions
diff --git a/src/corelib/kernel/qjni.cpp b/src/corelib/kernel/qjni.cpp deleted file mode 100644 index 5f652d70e3..0000000000 --- a/src/corelib/kernel/qjni.cpp +++ /dev/null @@ -1,2386 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qjni_p.h" -#include "qjnihelpers_p.h" -#include <QtCore/qthreadstorage.h> -#include <QtCore/qhash.h> -#include <QtCore/qstring.h> -#include <QtCore/QThread> -#include <QtCore/QReadWriteLock> - -QT_BEGIN_NAMESPACE - -static inline QLatin1String keyBase() -{ - return QLatin1String("%1%2:%3"); -} - -static QString qt_convertJString(jstring string) -{ - QJNIEnvironmentPrivate env; - int strLength = env->GetStringLength(string); - QString res(strLength, Qt::Uninitialized); - env->GetStringRegion(string, 0, strLength, reinterpret_cast<jchar *>(res.data())); - return res; -} - -static inline bool exceptionCheckAndClear(JNIEnv *env) -{ - if (Q_UNLIKELY(env->ExceptionCheck())) { - env->ExceptionDescribe(); - env->ExceptionClear(); - return true; - } - - return false; -} - -typedef QHash<QString, jclass> JClassHash; -Q_GLOBAL_STATIC(JClassHash, cachedClasses) -Q_GLOBAL_STATIC(QReadWriteLock, cachedClassesLock) - -static QByteArray toBinaryEncClassName(const QByteArray &className) -{ - return QByteArray(className).replace('/', '.'); -} - -static jclass getCachedClass(const QByteArray &classBinEnc, bool *isCached = 0) -{ - QReadLocker locker(cachedClassesLock); - const QHash<QString, jclass>::const_iterator &it = cachedClasses->constFind(QString::fromLatin1(classBinEnc)); - const bool found = (it != cachedClasses->constEnd()); - - if (isCached != 0) - *isCached = found; - - return found ? it.value() : 0; -} - -inline static jclass loadClass(const QByteArray &className, JNIEnv *env, bool binEncoded = false) -{ - const QByteArray &binEncClassName = binEncoded ? className : toBinaryEncClassName(className); - - bool isCached = false; - jclass clazz = getCachedClass(binEncClassName, &isCached); - if (clazz != 0 || isCached) - return clazz; - - QJNIObjectPrivate classLoader(QtAndroidPrivate::classLoader()); - if (!classLoader.isValid()) - return 0; - - QWriteLocker locker(cachedClassesLock); - // did we lose the race? - const QLatin1String key(binEncClassName); - const QHash<QString, jclass>::const_iterator &it = cachedClasses->constFind(key); - if (it != cachedClasses->constEnd()) - return it.value(); - - QJNIObjectPrivate stringName = QJNIObjectPrivate::fromString(key); - QJNIObjectPrivate classObject = classLoader.callObjectMethod("loadClass", - "(Ljava/lang/String;)Ljava/lang/Class;", - stringName.object()); - - if (!exceptionCheckAndClear(env) && classObject.isValid()) - clazz = static_cast<jclass>(env->NewGlobalRef(classObject.object())); - - cachedClasses->insert(key, clazz); - return clazz; -} - -typedef QHash<QString, jmethodID> JMethodIDHash; -Q_GLOBAL_STATIC(JMethodIDHash, cachedMethodID) -Q_GLOBAL_STATIC(QReadWriteLock, cachedMethodIDLock) - -static inline jmethodID getMethodID(JNIEnv *env, - jclass clazz, - const char *name, - const char *sig, - bool isStatic = false) -{ - jmethodID id = isStatic ? env->GetStaticMethodID(clazz, name, sig) - : env->GetMethodID(clazz, name, sig); - - if (exceptionCheckAndClear(env)) - return 0; - - return id; -} - -static jmethodID getCachedMethodID(JNIEnv *env, - jclass clazz, - const QByteArray &className, - const char *name, - const char *sig, - bool isStatic = false) -{ - if (className.isEmpty()) - return getMethodID(env, clazz, name, sig, isStatic); - - const QString key = keyBase().arg(QLatin1String(className), QLatin1String(name), QLatin1String(sig)); - QHash<QString, jmethodID>::const_iterator it; - - { - QReadLocker locker(cachedMethodIDLock); - it = cachedMethodID->constFind(key); - if (it != cachedMethodID->constEnd()) - return it.value(); - } - - { - QWriteLocker locker(cachedMethodIDLock); - it = cachedMethodID->constFind(key); - if (it != cachedMethodID->constEnd()) - return it.value(); - - jmethodID id = getMethodID(env, clazz, name, sig, isStatic); - - cachedMethodID->insert(key, id); - return id; - } -} - -typedef QHash<QString, jfieldID> JFieldIDHash; -Q_GLOBAL_STATIC(JFieldIDHash, cachedFieldID) -Q_GLOBAL_STATIC(QReadWriteLock, cachedFieldIDLock) - -static inline jfieldID getFieldID(JNIEnv *env, - jclass clazz, - const char *name, - const char *sig, - bool isStatic = false) -{ - jfieldID id = isStatic ? env->GetStaticFieldID(clazz, name, sig) - : env->GetFieldID(clazz, name, sig); - - if (exceptionCheckAndClear(env)) - return 0; - - return id; -} - -static jfieldID getCachedFieldID(JNIEnv *env, - jclass clazz, - const QByteArray &className, - const char *name, - const char *sig, - bool isStatic = false) -{ - if (className.isNull()) - return getFieldID(env, clazz, name, sig, isStatic); - - const QString key = keyBase().arg(QLatin1String(className), QLatin1String(name), QLatin1String(sig)); - QHash<QString, jfieldID>::const_iterator it; - - { - QReadLocker locker(cachedFieldIDLock); - it = cachedFieldID->constFind(key); - if (it != cachedFieldID->constEnd()) - return it.value(); - } - - { - QWriteLocker locker(cachedFieldIDLock); - it = cachedFieldID->constFind(key); - if (it != cachedFieldID->constEnd()) - return it.value(); - - jfieldID id = getFieldID(env, clazz, name, sig, isStatic); - - cachedFieldID->insert(key, id); - return id; - } -} - -void QJNILocalRefDeleter::cleanup(jobject obj) -{ - if (obj == 0) - return; - - QJNIEnvironmentPrivate env; - env->DeleteLocalRef(obj); -} - -class QJNIEnvironmentPrivateTLS -{ -public: - inline ~QJNIEnvironmentPrivateTLS() - { - QtAndroidPrivate::javaVM()->DetachCurrentThread(); - } -}; - -Q_GLOBAL_STATIC(QThreadStorage<QJNIEnvironmentPrivateTLS *>, jniEnvTLS) - -static const char qJniThreadName[] = "QtThread"; - -QJNIEnvironmentPrivate::QJNIEnvironmentPrivate() - : jniEnv(0) -{ - JavaVM *vm = QtAndroidPrivate::javaVM(); - const jint ret = vm->GetEnv((void**)&jniEnv, JNI_VERSION_1_6); - if (ret == JNI_OK) // Already attached - return; - - if (ret == JNI_EDETACHED) { // We need to (re-)attach - JavaVMAttachArgs args = { JNI_VERSION_1_6, qJniThreadName, nullptr }; - if (vm->AttachCurrentThread(&jniEnv, &args) != JNI_OK) - return; - - if (!jniEnvTLS->hasLocalData()) // If we attached the thread we own it. - jniEnvTLS->setLocalData(new QJNIEnvironmentPrivateTLS); - } -} - -JNIEnv *QJNIEnvironmentPrivate::operator->() -{ - return jniEnv; -} - -jclass QJNIEnvironmentPrivate::findClass(const char *className, JNIEnv *env) -{ - const QByteArray &classDotEnc = toBinaryEncClassName(className); - bool isCached = false; - jclass clazz = getCachedClass(classDotEnc, &isCached); - - const bool found = (clazz != 0) || (clazz == 0 && isCached); - - if (found) - return clazz; - - const QLatin1String key(classDotEnc); - if (env != 0) { // We got an env. pointer (We expect this to be the right env. and call FindClass()) - QWriteLocker locker(cachedClassesLock); - const QHash<QString, jclass>::const_iterator &it = cachedClasses->constFind(key); - // Did we lose the race? - if (it != cachedClasses->constEnd()) - return it.value(); - - jclass fclazz = env->FindClass(className); - if (!exceptionCheckAndClear(env)) { - clazz = static_cast<jclass>(env->NewGlobalRef(fclazz)); - env->DeleteLocalRef(fclazz); - } - - if (clazz != 0) - cachedClasses->insert(key, clazz); - } - - if (clazz == 0) // We didn't get an env. pointer or we got one with the WRONG class loader... - clazz = loadClass(classDotEnc, QJNIEnvironmentPrivate(), true); - - return clazz; -} - -QJNIEnvironmentPrivate::operator JNIEnv* () const -{ - return jniEnv; -} - -QJNIEnvironmentPrivate::~QJNIEnvironmentPrivate() -{ -} - -QJNIObjectData::QJNIObjectData() - : m_jobject(0), - m_jclass(0), - m_own_jclass(true) -{ - -} - -QJNIObjectData::~QJNIObjectData() -{ - QJNIEnvironmentPrivate env; - if (m_jobject) - env->DeleteGlobalRef(m_jobject); - if (m_jclass && m_own_jclass) - env->DeleteGlobalRef(m_jclass); -} - -QJNIObjectPrivate::QJNIObjectPrivate() - : d(new QJNIObjectData()) -{ - -} - -QJNIObjectPrivate::QJNIObjectPrivate(const char *className) - : d(new QJNIObjectData()) -{ - QJNIEnvironmentPrivate env; - d->m_className = toBinaryEncClassName(className); - d->m_jclass = loadClass(d->m_className, env, true); - d->m_own_jclass = false; - if (d->m_jclass) { - // get default constructor - jmethodID constructorId = getCachedMethodID(env, d->m_jclass, d->m_className, "<init>", "()V"); - if (constructorId) { - jobject obj = env->NewObject(d->m_jclass, constructorId); - if (obj) { - d->m_jobject = env->NewGlobalRef(obj); - env->DeleteLocalRef(obj); - } - } - } -} - -QJNIObjectPrivate::QJNIObjectPrivate(const char *className, const char *sig, ...) - : d(new QJNIObjectData()) -{ - QJNIEnvironmentPrivate env; - d->m_className = toBinaryEncClassName(className); - d->m_jclass = loadClass(d->m_className, env, true); - d->m_own_jclass = false; - if (d->m_jclass) { - jmethodID constructorId = getCachedMethodID(env, d->m_jclass, d->m_className, "<init>", sig); - if (constructorId) { - va_list args; - va_start(args, sig); - jobject obj = env->NewObjectV(d->m_jclass, constructorId, args); - va_end(args); - if (obj) { - d->m_jobject = env->NewGlobalRef(obj); - env->DeleteLocalRef(obj); - } - } - } -} - -QJNIObjectPrivate::QJNIObjectPrivate(const char *className, const char *sig, const QVaListPrivate &args) - : d(new QJNIObjectData()) -{ - QJNIEnvironmentPrivate env; - d->m_className = toBinaryEncClassName(className); - d->m_jclass = loadClass(d->m_className, env, true); - d->m_own_jclass = false; - if (d->m_jclass) { - jmethodID constructorId = getCachedMethodID(env, d->m_jclass, d->m_className, "<init>", sig); - if (constructorId) { - jobject obj = env->NewObjectV(d->m_jclass, constructorId, args); - if (obj) { - d->m_jobject = env->NewGlobalRef(obj); - env->DeleteLocalRef(obj); - } - } - } -} - -QJNIObjectPrivate::QJNIObjectPrivate(jclass clazz) - : d(new QJNIObjectData()) -{ - QJNIEnvironmentPrivate env; - d->m_jclass = static_cast<jclass>(env->NewGlobalRef(clazz)); - if (d->m_jclass) { - // get default constructor - jmethodID constructorId = getMethodID(env, d->m_jclass, "<init>", "()V"); - if (constructorId) { - jobject obj = env->NewObject(d->m_jclass, constructorId); - if (obj) { - d->m_jobject = env->NewGlobalRef(obj); - env->DeleteLocalRef(obj); - } - } - } -} - -QJNIObjectPrivate::QJNIObjectPrivate(jclass clazz, const char *sig, ...) - : d(new QJNIObjectData()) -{ - QJNIEnvironmentPrivate env; - if (clazz) { - d->m_jclass = static_cast<jclass>(env->NewGlobalRef(clazz)); - if (d->m_jclass) { - jmethodID constructorId = getMethodID(env, d->m_jclass, "<init>", sig); - if (constructorId) { - va_list args; - va_start(args, sig); - jobject obj = env->NewObjectV(d->m_jclass, constructorId, args); - va_end(args); - if (obj) { - d->m_jobject = env->NewGlobalRef(obj); - env->DeleteLocalRef(obj); - } - } - } - } -} - -QJNIObjectPrivate::QJNIObjectPrivate(jclass clazz, const char *sig, const QVaListPrivate &args) - : d(new QJNIObjectData()) -{ - QJNIEnvironmentPrivate env; - if (clazz) { - d->m_jclass = static_cast<jclass>(env->NewGlobalRef(clazz)); - if (d->m_jclass) { - jmethodID constructorId = getMethodID(env, d->m_jclass, "<init>", sig); - if (constructorId) { - jobject obj = env->NewObjectV(d->m_jclass, constructorId, args); - if (obj) { - d->m_jobject = env->NewGlobalRef(obj); - env->DeleteLocalRef(obj); - } - } - } - } -} - -QJNIObjectPrivate::QJNIObjectPrivate(jobject obj) - : d(new QJNIObjectData()) -{ - if (!obj) - return; - - QJNIEnvironmentPrivate env; - d->m_jobject = env->NewGlobalRef(obj); - jclass cls = env->GetObjectClass(obj); - d->m_jclass = static_cast<jclass>(env->NewGlobalRef(cls)); - env->DeleteLocalRef(cls); -} -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::callMethodV<void>(const char *methodName, const char *sig, va_list args) const -{ - QJNIEnvironmentPrivate env; - jmethodID id = getCachedMethodID(env, d->m_jclass, d->m_className, methodName, sig); - if (id) { - env->CallVoidMethodV(d->m_jobject, id, args); - } -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::callMethod<void>(const char *methodName, const char *sig, ...) const -{ - va_list args; - va_start(args, sig); - callMethodV<void>(methodName, sig, args); - va_end(args); -} - -template <> -Q_CORE_EXPORT jboolean QJNIObjectPrivate::callMethodV<jboolean>(const char *methodName, const char *sig, va_list args) const -{ - QJNIEnvironmentPrivate env; - jboolean res = 0; - jmethodID id = getCachedMethodID(env, d->m_jclass, d->m_className, methodName, sig); - if (id) { - res = env->CallBooleanMethodV(d->m_jobject, id, args); - } - return res; -} - -template <> -Q_CORE_EXPORT jboolean QJNIObjectPrivate::callMethod<jboolean>(const char *methodName, const char *sig, ...) const -{ - va_list args; - va_start(args, sig); - jboolean res = callMethodV<jboolean>(methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT jbyte QJNIObjectPrivate::callMethodV<jbyte>(const char *methodName, const char *sig, va_list args) const -{ - QJNIEnvironmentPrivate env; - jbyte res = 0; - jmethodID id = getCachedMethodID(env, d->m_jclass, d->m_className, methodName, sig); - if (id) { - res = env->CallByteMethodV(d->m_jobject, id, args); - } - return res; -} - -template <> -Q_CORE_EXPORT jbyte QJNIObjectPrivate::callMethod<jbyte>(const char *methodName, const char *sig, ...) const -{ - va_list args; - va_start(args, sig); - jbyte res = callMethodV<jbyte>(methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT jchar QJNIObjectPrivate::callMethodV<jchar>(const char *methodName, const char *sig, va_list args) const -{ - QJNIEnvironmentPrivate env; - jchar res = 0; - jmethodID id = getCachedMethodID(env, d->m_jclass, d->m_className, methodName, sig); - if (id) { - res = env->CallCharMethodV(d->m_jobject, id, args); - } - return res; -} - -template <> -Q_CORE_EXPORT jchar QJNIObjectPrivate::callMethod<jchar>(const char *methodName, const char *sig, ...) const -{ - va_list args; - va_start(args, sig); - jchar res = callMethodV<jchar>(methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT jshort QJNIObjectPrivate::callMethodV<jshort>(const char *methodName, const char *sig, va_list args) const -{ - QJNIEnvironmentPrivate env; - jshort res = 0; - jmethodID id = getCachedMethodID(env, d->m_jclass, d->m_className, methodName, sig); - if (id) { - res = env->CallShortMethodV(d->m_jobject, id, args); - } - return res; -} - -template <> -Q_CORE_EXPORT jshort QJNIObjectPrivate::callMethod<jshort>(const char *methodName, const char *sig, ...) const -{ - va_list args; - va_start(args, sig); - jshort res = callMethodV<jshort>(methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT jint QJNIObjectPrivate::callMethodV<jint>(const char *methodName, const char *sig, va_list args) const -{ - QJNIEnvironmentPrivate env; - jint res = 0; - jmethodID id = getCachedMethodID(env, d->m_jclass, d->m_className, methodName, sig); - if (id) { - res = env->CallIntMethodV(d->m_jobject, id, args); - } - return res; -} - -template <> -Q_CORE_EXPORT jint QJNIObjectPrivate::callMethod<jint>(const char *methodName, const char *sig, ...) const -{ - va_list args; - va_start(args, sig); - jint res = callMethodV<jint>(methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT jlong QJNIObjectPrivate::callMethodV<jlong>(const char *methodName, const char *sig, va_list args) const -{ - QJNIEnvironmentPrivate env; - jlong res = 0; - jmethodID id = getCachedMethodID(env, d->m_jclass, d->m_className, methodName, sig); - if (id) { - res = env->CallLongMethodV(d->m_jobject, id, args); - } - return res; -} - -template <> -Q_CORE_EXPORT jlong QJNIObjectPrivate::callMethod<jlong>(const char *methodName, const char *sig, ...) const -{ - va_list args; - va_start(args, sig); - jlong res = callMethodV<jlong>(methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT jfloat QJNIObjectPrivate::callMethodV<jfloat>(const char *methodName, const char *sig, va_list args) const -{ - QJNIEnvironmentPrivate env; - jfloat res = 0.f; - jmethodID id = getCachedMethodID(env, d->m_jclass, d->m_className, methodName, sig); - if (id) { - res = env->CallFloatMethodV(d->m_jobject, id, args); - } - return res; -} - -template <> -Q_CORE_EXPORT jfloat QJNIObjectPrivate::callMethod<jfloat>(const char *methodName, const char *sig, ...) const -{ - va_list args; - va_start(args, sig); - jfloat res = callMethodV<jfloat>(methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT jdouble QJNIObjectPrivate::callMethodV<jdouble>(const char *methodName, const char *sig, va_list args) const -{ - QJNIEnvironmentPrivate env; - jdouble res = 0.; - jmethodID id = getCachedMethodID(env, d->m_jclass, d->m_className, methodName, sig); - if (id) { - res = env->CallDoubleMethodV(d->m_jobject, id, args); - } - return res; -} - -template <> -Q_CORE_EXPORT jdouble QJNIObjectPrivate::callMethod<jdouble>(const char *methodName, const char *sig, ...) const -{ - va_list args; - va_start(args, sig); - jdouble res = callMethodV<jdouble>(methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::callMethod<void>(const char *methodName) const -{ - callMethod<void>(methodName, "()V"); -} - -template <> -Q_CORE_EXPORT jboolean QJNIObjectPrivate::callMethod<jboolean>(const char *methodName) const -{ - return callMethod<jboolean>(methodName, "()Z"); -} - -template <> -Q_CORE_EXPORT jbyte QJNIObjectPrivate::callMethod<jbyte>(const char *methodName) const -{ - return callMethod<jbyte>(methodName, "()B"); -} - -template <> -Q_CORE_EXPORT jchar QJNIObjectPrivate::callMethod<jchar>(const char *methodName) const -{ - return callMethod<jchar>(methodName, "()C"); -} - -template <> -Q_CORE_EXPORT jshort QJNIObjectPrivate::callMethod<jshort>(const char *methodName) const -{ - return callMethod<jshort>(methodName, "()S"); -} - -template <> -Q_CORE_EXPORT jint QJNIObjectPrivate::callMethod<jint>(const char *methodName) const -{ - return callMethod<jint>(methodName, "()I"); -} - -template <> -Q_CORE_EXPORT jlong QJNIObjectPrivate::callMethod<jlong>(const char *methodName) const -{ - return callMethod<jlong>(methodName, "()J"); -} - -template <> -Q_CORE_EXPORT jfloat QJNIObjectPrivate::callMethod<jfloat>(const char *methodName) const -{ - return callMethod<jfloat>(methodName, "()F"); -} - -template <> -Q_CORE_EXPORT jdouble QJNIObjectPrivate::callMethod<jdouble>(const char *methodName) const -{ - return callMethod<jdouble>(methodName, "()D"); -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::callStaticMethodV<void>(const char *className, - const char *methodName, - const char *sig, - va_list args) -{ - QJNIEnvironmentPrivate env; - jclass clazz = loadClass(className, env); - if (clazz) { - jmethodID id = getCachedMethodID(env, clazz, toBinaryEncClassName(className), methodName, sig, true); - if (id) { - env->CallStaticVoidMethodV(clazz, id, args); - } - } -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::callStaticMethod<void>(const char *className, - const char *methodName, - const char *sig, - ...) -{ - va_list args; - va_start(args, sig); - callStaticMethodV<void>(className, methodName, sig, args); - va_end(args); -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::callStaticMethodV<void>(jclass clazz, - const char *methodName, - const char *sig, - va_list args) -{ - QJNIEnvironmentPrivate env; - jmethodID id = getMethodID(env, clazz, methodName, sig, true); - if (id) { - env->CallStaticVoidMethodV(clazz, id, args); - } -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::callStaticMethod<void>(jclass clazz, - const char *methodName, - const char *sig, - ...) -{ - va_list args; - va_start(args, sig); - callStaticMethodV<void>(clazz, methodName, sig, args); - va_end(args); -} - -template <> -Q_CORE_EXPORT jboolean QJNIObjectPrivate::callStaticMethodV<jboolean>(const char *className, - const char *methodName, - const char *sig, - va_list args) -{ - QJNIEnvironmentPrivate env; - jboolean res = 0; - jclass clazz = loadClass(className, env); - if (clazz) { - jmethodID id = getCachedMethodID(env, clazz, toBinaryEncClassName(className), methodName, sig, true); - if (id) { - res = env->CallStaticBooleanMethodV(clazz, id, args); - } - } - - return res; -} - -template <> -Q_CORE_EXPORT jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(const char *className, - const char *methodName, - const char *sig, - ...) -{ - va_list args; - va_start(args, sig); - jboolean res = callStaticMethodV<jboolean>(className, methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT jboolean QJNIObjectPrivate::callStaticMethodV<jboolean>(jclass clazz, - const char *methodName, - const char *sig, - va_list args) -{ - QJNIEnvironmentPrivate env; - jboolean res = 0; - jmethodID id = getMethodID(env, clazz, methodName, sig, true); - if (id) { - res = env->CallStaticBooleanMethodV(clazz, id, args); - } - - return res; -} - -template <> -Q_CORE_EXPORT jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(jclass clazz, - const char *methodName, - const char *sig, - ...) -{ - va_list args; - va_start(args, sig); - jboolean res = callStaticMethodV<jboolean>(clazz, methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT jbyte QJNIObjectPrivate::callStaticMethodV<jbyte>(const char *className, - const char *methodName, - const char *sig, - va_list args) -{ - QJNIEnvironmentPrivate env; - jbyte res = 0; - jclass clazz = loadClass(className, env); - if (clazz) { - jmethodID id = getCachedMethodID(env, clazz, toBinaryEncClassName(className), methodName, sig, true); - if (id) { - res = env->CallStaticByteMethodV(clazz, id, args); - } - } - - return res; -} - -template <> -Q_CORE_EXPORT jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(const char *className, - const char *methodName, - const char *sig, - ...) -{ - va_list args; - va_start(args, sig); - jbyte res = callStaticMethodV<jbyte>(className, methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT jbyte QJNIObjectPrivate::callStaticMethodV<jbyte>(jclass clazz, - const char *methodName, - const char *sig, - va_list args) -{ - QJNIEnvironmentPrivate env; - jbyte res = 0; - jmethodID id = getMethodID(env, clazz, methodName, sig, true); - if (id) { - res = env->CallStaticByteMethodV(clazz, id, args); - } - - return res; -} - -template <> -Q_CORE_EXPORT jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(jclass clazz, - const char *methodName, - const char *sig, - ...) -{ - va_list args; - va_start(args, sig); - jbyte res = callStaticMethodV<jbyte>(clazz, methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT jchar QJNIObjectPrivate::callStaticMethodV<jchar>(const char *className, - const char *methodName, - const char *sig, - va_list args) -{ - QJNIEnvironmentPrivate env; - jchar res = 0; - jclass clazz = loadClass(className, env); - if (clazz) { - jmethodID id = getCachedMethodID(env, clazz, toBinaryEncClassName(className), methodName, sig, true); - if (id) { - res = env->CallStaticCharMethodV(clazz, id, args); - } - } - - return res; -} - -template <> -Q_CORE_EXPORT jchar QJNIObjectPrivate::callStaticMethod<jchar>(const char *className, - const char *methodName, - const char *sig, - ...) -{ - va_list args; - va_start(args, sig); - jchar res = callStaticMethodV<jchar>(className, methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT jchar QJNIObjectPrivate::callStaticMethodV<jchar>(jclass clazz, - const char *methodName, - const char *sig, - va_list args) -{ - QJNIEnvironmentPrivate env; - jchar res = 0; - jmethodID id = getMethodID(env, clazz, methodName, sig, true); - if (id) { - res = env->CallStaticCharMethodV(clazz, id, args); - } - - return res; -} - -template <> -Q_CORE_EXPORT jchar QJNIObjectPrivate::callStaticMethod<jchar>(jclass clazz, - const char *methodName, - const char *sig, - ...) -{ - va_list args; - va_start(args, sig); - jchar res = callStaticMethodV<jchar>(clazz, methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT jshort QJNIObjectPrivate::callStaticMethodV<jshort>(const char *className, - const char *methodName, - const char *sig, - va_list args) -{ - QJNIEnvironmentPrivate env; - jshort res = 0; - jclass clazz = loadClass(className, env); - if (clazz) { - jmethodID id = getCachedMethodID(env, clazz, toBinaryEncClassName(className), methodName, sig, true); - if (id) { - res = env->CallStaticShortMethodV(clazz, id, args); - } - } - - return res; -} - -template <> -Q_CORE_EXPORT jshort QJNIObjectPrivate::callStaticMethod<jshort>(const char *className, - const char *methodName, - const char *sig, - ...) -{ - va_list args; - va_start(args, sig); - jshort res = callStaticMethodV<jshort>(className, methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT jshort QJNIObjectPrivate::callStaticMethodV<jshort>(jclass clazz, - const char *methodName, - const char *sig, - va_list args) -{ - QJNIEnvironmentPrivate env; - jshort res = 0; - jmethodID id = getMethodID(env, clazz, methodName, sig, true); - if (id) { - res = env->CallStaticShortMethodV(clazz, id, args); - } - - return res; -} - -template <> -Q_CORE_EXPORT jshort QJNIObjectPrivate::callStaticMethod<jshort>(jclass clazz, - const char *methodName, - const char *sig, - ...) -{ - va_list args; - va_start(args, sig); - jshort res = callStaticMethodV<jshort>(clazz, methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT jint QJNIObjectPrivate::callStaticMethodV<jint>(const char *className, - const char *methodName, - const char *sig, - va_list args) -{ - QJNIEnvironmentPrivate env; - jint res = 0; - jclass clazz = loadClass(className, env); - if (clazz) { - jmethodID id = getCachedMethodID(env, clazz, toBinaryEncClassName(className), methodName, sig, true); - if (id) { - res = env->CallStaticIntMethodV(clazz, id, args); - } - } - - return res; -} - -template <> -Q_CORE_EXPORT jint QJNIObjectPrivate::callStaticMethod<jint>(const char *className, - const char *methodName, - const char *sig, - ...) -{ - va_list args; - va_start(args, sig); - jint res = callStaticMethodV<jint>(className, methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT jint QJNIObjectPrivate::callStaticMethodV<jint>(jclass clazz, - const char *methodName, - const char *sig, - va_list args) -{ - QJNIEnvironmentPrivate env; - jint res = 0; - jmethodID id = getMethodID(env, clazz, methodName, sig, true); - if (id) { - res = env->CallStaticIntMethodV(clazz, id, args); - } - - return res; -} - -template <> -Q_CORE_EXPORT jint QJNIObjectPrivate::callStaticMethod<jint>(jclass clazz, - const char *methodName, - const char *sig, - ...) -{ - va_list args; - va_start(args, sig); - jint res = callStaticMethodV<jint>(clazz, methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT jlong QJNIObjectPrivate::callStaticMethodV<jlong>(const char *className, - const char *methodName, - const char *sig, - va_list args) -{ - QJNIEnvironmentPrivate env; - jlong res = 0; - jclass clazz = loadClass(className, env); - if (clazz) { - jmethodID id = getCachedMethodID(env, clazz, toBinaryEncClassName(className), methodName, sig, true); - if (id) { - res = env->CallStaticLongMethodV(clazz, id, args); - } - } - - return res; -} - -template <> -Q_CORE_EXPORT jlong QJNIObjectPrivate::callStaticMethod<jlong>(const char *className, - const char *methodName, - const char *sig, - ...) -{ - va_list args; - va_start(args, sig); - jlong res = callStaticMethodV<jlong>(className, methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT jlong QJNIObjectPrivate::callStaticMethodV<jlong>(jclass clazz, - const char *methodName, - const char *sig, - va_list args) -{ - QJNIEnvironmentPrivate env; - jlong res = 0; - jmethodID id = getMethodID(env, clazz, methodName, sig, true); - if (id) { - res = env->CallStaticLongMethodV(clazz, id, args); - } - - return res; -} - -template <> -Q_CORE_EXPORT jlong QJNIObjectPrivate::callStaticMethod<jlong>(jclass clazz, - const char *methodName, - const char *sig, - ...) -{ - va_list args; - va_start(args, sig); - jlong res = callStaticMethodV<jlong>(clazz, methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT jfloat QJNIObjectPrivate::callStaticMethodV<jfloat>(const char *className, - const char *methodName, - const char *sig, - va_list args) -{ - QJNIEnvironmentPrivate env; - jfloat res = 0.f; - jclass clazz = loadClass(className, env); - if (clazz) { - jmethodID id = getCachedMethodID(env, clazz, toBinaryEncClassName(className), methodName, sig, true); - if (id) { - res = env->CallStaticFloatMethodV(clazz, id, args); - } - } - - return res; -} - -template <> -Q_CORE_EXPORT jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(const char *className, - const char *methodName, - const char *sig, - ...) -{ - va_list args; - va_start(args, sig); - jfloat res = callStaticMethodV<jfloat>(className, methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT jfloat QJNIObjectPrivate::callStaticMethodV<jfloat>(jclass clazz, - const char *methodName, - const char *sig, - va_list args) -{ - QJNIEnvironmentPrivate env; - jfloat res = 0.f; - jmethodID id = getMethodID(env, clazz, methodName, sig, true); - if (id) { - res = env->CallStaticFloatMethodV(clazz, id, args); - } - - return res; -} - -template <> -Q_CORE_EXPORT jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(jclass clazz, - const char *methodName, - const char *sig, - ...) -{ - va_list args; - va_start(args, sig); - jfloat res = callStaticMethodV<jfloat>(clazz, methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT jdouble QJNIObjectPrivate::callStaticMethodV<jdouble>(const char *className, - const char *methodName, - const char *sig, - va_list args) -{ - QJNIEnvironmentPrivate env; - jdouble res = 0.; - jclass clazz = loadClass(className, env); - if (clazz) { - jmethodID id = getCachedMethodID(env, clazz, toBinaryEncClassName(className), methodName, sig, true); - if (id) { - res = env->CallStaticDoubleMethodV(clazz, id, args); - } - } - - return res; -} - -template <> -Q_CORE_EXPORT jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(const char *className, - const char *methodName, - const char *sig, - ...) -{ - va_list args; - va_start(args, sig); - jdouble res = callStaticMethodV<jdouble>(className, methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT jdouble QJNIObjectPrivate::callStaticMethodV<jdouble>(jclass clazz, - const char *methodName, - const char *sig, - va_list args) -{ - QJNIEnvironmentPrivate env; - jdouble res = 0.; - jmethodID id = getMethodID(env, clazz, methodName, sig, true); - if (id) { - res = env->CallStaticDoubleMethodV(clazz, id, args); - } - - return res; -} - -template <> -Q_CORE_EXPORT jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(jclass clazz, - const char *methodName, - const char *sig, - ...) -{ - va_list args; - va_start(args, sig); - jdouble res = callStaticMethodV<jdouble>(clazz, methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::callStaticMethod<void>(const char *className, const char *methodName) -{ - callStaticMethod<void>(className, methodName, "()V"); -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::callStaticMethod<void>(jclass clazz, const char *methodName) -{ - callStaticMethod<void>(clazz, methodName, "()V"); -} - -template <> -Q_CORE_EXPORT jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(const char *className, const char *methodName) -{ - return callStaticMethod<jboolean>(className, methodName, "()Z"); -} - -template <> -Q_CORE_EXPORT jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(jclass clazz, const char *methodName) -{ - return callStaticMethod<jboolean>(clazz, methodName, "()Z"); -} - -template <> -Q_CORE_EXPORT jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(const char *className, const char *methodName) -{ - return callStaticMethod<jbyte>(className, methodName, "()B"); -} - -template <> -Q_CORE_EXPORT jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(jclass clazz, const char *methodName) -{ - return callStaticMethod<jbyte>(clazz, methodName, "()B"); -} - -template <> -Q_CORE_EXPORT jchar QJNIObjectPrivate::callStaticMethod<jchar>(const char *className, const char *methodName) -{ - return callStaticMethod<jchar>(className, methodName, "()C"); -} - -template <> -Q_CORE_EXPORT jchar QJNIObjectPrivate::callStaticMethod<jchar>(jclass clazz, const char *methodName) -{ - return callStaticMethod<jchar>(clazz, methodName, "()C"); -} - -template <> -Q_CORE_EXPORT jshort QJNIObjectPrivate::callStaticMethod<jshort>(const char *className, const char *methodName) -{ - return callStaticMethod<jshort>(className, methodName, "()S"); -} - -template <> -Q_CORE_EXPORT jshort QJNIObjectPrivate::callStaticMethod<jshort>(jclass clazz, const char *methodName) -{ - return callStaticMethod<jshort>(clazz, methodName, "()S"); -} - -template <> -Q_CORE_EXPORT jint QJNIObjectPrivate::callStaticMethod<jint>(const char *className, const char *methodName) -{ - return callStaticMethod<jint>(className, methodName, "()I"); -} - -template <> -Q_CORE_EXPORT jint QJNIObjectPrivate::callStaticMethod<jint>(jclass clazz, const char *methodName) -{ - return callStaticMethod<jint>(clazz, methodName, "()I"); -} - -template <> -Q_CORE_EXPORT jlong QJNIObjectPrivate::callStaticMethod<jlong>(const char *className, const char *methodName) -{ - return callStaticMethod<jlong>(className, methodName, "()J"); -} - -template <> -Q_CORE_EXPORT jlong QJNIObjectPrivate::callStaticMethod<jlong>(jclass clazz, const char *methodName) -{ - return callStaticMethod<jlong>(clazz, methodName, "()J"); -} - -template <> -Q_CORE_EXPORT jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(const char *className, const char *methodName) -{ - return callStaticMethod<jfloat>(className, methodName, "()F"); -} - -template <> -Q_CORE_EXPORT jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(jclass clazz, const char *methodName) -{ - return callStaticMethod<jfloat>(clazz, methodName, "()F"); -} - -template <> -Q_CORE_EXPORT jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(const char *className, const char *methodName) -{ - return callStaticMethod<jdouble>(className, methodName, "()D"); -} - -template <> -Q_CORE_EXPORT jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(jclass clazz, const char *methodName) -{ - return callStaticMethod<jdouble>(clazz, methodName, "()D"); -} - -QJNIObjectPrivate QJNIObjectPrivate::callObjectMethodV(const char *methodName, - const char *sig, - va_list args) const -{ - QJNIEnvironmentPrivate env; - jobject res = 0; - jmethodID id = getCachedMethodID(env, d->m_jclass, d->m_className, methodName, sig); - if (id) { - res = env->CallObjectMethodV(d->m_jobject, id, args); - if (res && env->ExceptionCheck()) - res = 0; - } - - QJNIObjectPrivate obj(res); - env->DeleteLocalRef(res); - return obj; -} - -QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod(const char *methodName, - const char *sig, - ...) const -{ - va_list args; - va_start(args, sig); - QJNIObjectPrivate res = callObjectMethodV(methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jstring>(const char *methodName) const -{ - return callObjectMethod(methodName, "()Ljava/lang/String;"); -} - -template <> -Q_CORE_EXPORT QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jbooleanArray>(const char *methodName) const -{ - return callObjectMethod(methodName, "()[Z"); -} - -template <> -Q_CORE_EXPORT QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jbyteArray>(const char *methodName) const -{ - return callObjectMethod(methodName, "()[B"); -} - -template <> -Q_CORE_EXPORT QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jshortArray>(const char *methodName) const -{ - return callObjectMethod(methodName, "()[S"); -} - -template <> -Q_CORE_EXPORT QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jintArray>(const char *methodName) const -{ - return callObjectMethod(methodName, "()[I"); -} - -template <> -Q_CORE_EXPORT QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jlongArray>(const char *methodName) const -{ - return callObjectMethod(methodName, "()[J"); -} - -template <> -Q_CORE_EXPORT QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jfloatArray>(const char *methodName) const -{ - return callObjectMethod(methodName, "()[F"); -} - -template <> -Q_CORE_EXPORT QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jdoubleArray>(const char *methodName) const -{ - return callObjectMethod(methodName, "()[D"); -} - -QJNIObjectPrivate QJNIObjectPrivate::callStaticObjectMethodV(const char *className, - const char *methodName, - const char *sig, - va_list args) -{ - QJNIEnvironmentPrivate env; - jobject res = 0; - jclass clazz = loadClass(className, env); - if (clazz) { - jmethodID id = getCachedMethodID(env, clazz, toBinaryEncClassName(className), methodName, sig, true); - if (id) { - res = env->CallStaticObjectMethodV(clazz, id, args); - if (res && env->ExceptionCheck()) - res = 0; - } - } - - QJNIObjectPrivate obj(res); - env->DeleteLocalRef(res); - return obj; -} - -QJNIObjectPrivate QJNIObjectPrivate::callStaticObjectMethod(const char *className, - const char *methodName, - const char *sig, - ...) -{ - va_list args; - va_start(args, sig); - QJNIObjectPrivate res = callStaticObjectMethodV(className, methodName, sig, args); - va_end(args); - return res; -} - -QJNIObjectPrivate QJNIObjectPrivate::callStaticObjectMethodV(jclass clazz, - const char *methodName, - const char *sig, - va_list args) -{ - QJNIEnvironmentPrivate env; - jobject res = 0; - jmethodID id = getMethodID(env, clazz, methodName, sig, true); - if (id) { - res = env->CallStaticObjectMethodV(clazz, id, args); - if (res && env->ExceptionCheck()) - res = 0; - } - - QJNIObjectPrivate obj(res); - env->DeleteLocalRef(res); - return obj; -} - -QJNIObjectPrivate QJNIObjectPrivate::callStaticObjectMethod(jclass clazz, - const char *methodName, - const char *sig, - ...) -{ - va_list args; - va_start(args, sig); - QJNIObjectPrivate res = callStaticObjectMethodV(clazz, methodName, sig, args); - va_end(args); - return res; -} - -template <> -Q_CORE_EXPORT jboolean QJNIObjectPrivate::getField<jboolean>(const char *fieldName) const -{ - QJNIEnvironmentPrivate env; - jboolean res = 0; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "Z"); - if (id) - res = env->GetBooleanField(d->m_jobject, id); - - return res; -} - -template <> -Q_CORE_EXPORT jbyte QJNIObjectPrivate::getField<jbyte>(const char *fieldName) const -{ - QJNIEnvironmentPrivate env; - jbyte res = 0; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "B"); - if (id) - res = env->GetByteField(d->m_jobject, id); - - return res; -} - -template <> -Q_CORE_EXPORT jchar QJNIObjectPrivate::getField<jchar>(const char *fieldName) const -{ - QJNIEnvironmentPrivate env; - jchar res = 0; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "C"); - if (id) - res = env->GetCharField(d->m_jobject, id); - - return res; -} - -template <> -Q_CORE_EXPORT jshort QJNIObjectPrivate::getField<jshort>(const char *fieldName) const -{ - QJNIEnvironmentPrivate env; - jshort res = 0; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "S"); - if (id) - res = env->GetShortField(d->m_jobject, id); - - return res; -} - -template <> -Q_CORE_EXPORT jint QJNIObjectPrivate::getField<jint>(const char *fieldName) const -{ - QJNIEnvironmentPrivate env; - jint res = 0; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "I"); - if (id) - res = env->GetIntField(d->m_jobject, id); - - return res; -} - -template <> -Q_CORE_EXPORT jlong QJNIObjectPrivate::getField<jlong>(const char *fieldName) const -{ - QJNIEnvironmentPrivate env; - jlong res = 0; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "J"); - if (id) - res = env->GetLongField(d->m_jobject, id); - - return res; -} - -template <> -Q_CORE_EXPORT jfloat QJNIObjectPrivate::getField<jfloat>(const char *fieldName) const -{ - QJNIEnvironmentPrivate env; - jfloat res = 0.f; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "F"); - if (id) - res = env->GetFloatField(d->m_jobject, id); - - return res; -} - -template <> -Q_CORE_EXPORT jdouble QJNIObjectPrivate::getField<jdouble>(const char *fieldName) const -{ - QJNIEnvironmentPrivate env; - jdouble res = 0.; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "D"); - if (id) - res = env->GetDoubleField(d->m_jobject, id); - - return res; -} - -template <> -Q_CORE_EXPORT jboolean QJNIObjectPrivate::getStaticField<jboolean>(jclass clazz, const char *fieldName) -{ - QJNIEnvironmentPrivate env; - jboolean res = 0; - jfieldID id = getFieldID(env, clazz, fieldName, "Z", true); - if (id) - res = env->GetStaticBooleanField(clazz, id); - - return res; -} - -template <> -Q_CORE_EXPORT jboolean QJNIObjectPrivate::getStaticField<jboolean>(const char *className, const char *fieldName) -{ - QJNIEnvironmentPrivate env; - jclass clazz = loadClass(className, env); - if (clazz == 0) - return 0; - - jfieldID id = getCachedFieldID(env, clazz, toBinaryEncClassName(className), fieldName, "Z", true); - if (id == 0) - return 0; - - return env->GetStaticBooleanField(clazz, id); -} - -template <> -Q_CORE_EXPORT jbyte QJNIObjectPrivate::getStaticField<jbyte>(jclass clazz, const char *fieldName) -{ - QJNIEnvironmentPrivate env; - jbyte res = 0; - jfieldID id = getFieldID(env, clazz, fieldName, "B", true); - if (id) - res = env->GetStaticByteField(clazz, id); - - return res; -} - -template <> -Q_CORE_EXPORT jbyte QJNIObjectPrivate::getStaticField<jbyte>(const char *className, const char *fieldName) -{ - QJNIEnvironmentPrivate env; - jclass clazz = loadClass(className, env); - if (clazz == 0) - return 0; - - jfieldID id = getCachedFieldID(env, clazz, toBinaryEncClassName(className), fieldName, "B", true); - if (id == 0) - return 0; - - return env->GetStaticByteField(clazz, id); -} - -template <> -Q_CORE_EXPORT jchar QJNIObjectPrivate::getStaticField<jchar>(jclass clazz, const char *fieldName) -{ - QJNIEnvironmentPrivate env; - jchar res = 0; - jfieldID id = getFieldID(env, clazz, fieldName, "C", true); - if (id) - res = env->GetStaticCharField(clazz, id); - - return res; -} - -template <> -Q_CORE_EXPORT jchar QJNIObjectPrivate::getStaticField<jchar>(const char *className, const char *fieldName) -{ - QJNIEnvironmentPrivate env; - jclass clazz = loadClass(className, env); - if (clazz == 0) - return 0; - - jfieldID id = getCachedFieldID(env, clazz, toBinaryEncClassName(className), fieldName, "C", true); - if (id == 0) - return 0; - - return env->GetStaticCharField(clazz, id); -} - -template <> -Q_CORE_EXPORT jshort QJNIObjectPrivate::getStaticField<jshort>(jclass clazz, const char *fieldName) -{ - QJNIEnvironmentPrivate env; - jshort res = 0; - jfieldID id = getFieldID(env, clazz, fieldName, "S", true); - if (id) - res = env->GetStaticShortField(clazz, id); - - return res; -} - -template <> -Q_CORE_EXPORT jshort QJNIObjectPrivate::getStaticField<jshort>(const char *className, const char *fieldName) -{ - QJNIEnvironmentPrivate env; - jclass clazz = loadClass(className, env); - if (clazz == 0) - return 0; - - jfieldID id = getCachedFieldID(env, clazz, toBinaryEncClassName(className), fieldName, "S", true); - if (id == 0) - return 0; - - return env->GetStaticShortField(clazz, id); -} - -template <> -Q_CORE_EXPORT jint QJNIObjectPrivate::getStaticField<jint>(jclass clazz, const char *fieldName) -{ - QJNIEnvironmentPrivate env; - jint res = 0; - jfieldID id = getFieldID(env, clazz, fieldName, "I", true); - if (id) - res = env->GetStaticIntField(clazz, id); - - return res; -} - -template <> -Q_CORE_EXPORT jint QJNIObjectPrivate::getStaticField<jint>(const char *className, const char *fieldName) -{ - QJNIEnvironmentPrivate env; - jclass clazz = loadClass(className, env); - if (clazz == 0) - return 0; - - jfieldID id = getCachedFieldID(env, clazz, toBinaryEncClassName(className), fieldName, "I", true); - if (id == 0) - return 0; - - return env->GetStaticIntField(clazz, id); -} - -template <> -Q_CORE_EXPORT jlong QJNIObjectPrivate::getStaticField<jlong>(jclass clazz, const char *fieldName) -{ - QJNIEnvironmentPrivate env; - jlong res = 0; - jfieldID id = getFieldID(env, clazz, fieldName, "J", true); - if (id) - res = env->GetStaticLongField(clazz, id); - - return res; -} - -template <> -Q_CORE_EXPORT jlong QJNIObjectPrivate::getStaticField<jlong>(const char *className, const char *fieldName) -{ - QJNIEnvironmentPrivate env; - jclass clazz = loadClass(className, env); - if (clazz == 0) - return 0; - - jfieldID id = getCachedFieldID(env, clazz, toBinaryEncClassName(className), fieldName, "J", true); - if (id == 0) - return 0; - - return env->GetStaticLongField(clazz, id); -} - -template <> -Q_CORE_EXPORT jfloat QJNIObjectPrivate::getStaticField<jfloat>(jclass clazz, const char *fieldName) -{ - QJNIEnvironmentPrivate env; - jfloat res = 0.f; - jfieldID id = getFieldID(env, clazz, fieldName, "F", true); - if (id) - res = env->GetStaticFloatField(clazz, id); - - return res; -} - -template <> -Q_CORE_EXPORT jfloat QJNIObjectPrivate::getStaticField<jfloat>(const char *className, const char *fieldName) -{ - QJNIEnvironmentPrivate env; - jclass clazz = loadClass(className, env); - if (clazz == 0) - return 0.f; - - jfieldID id = getCachedFieldID(env, clazz, toBinaryEncClassName(className), fieldName, "F", true); - if (id == 0) - return 0.f; - - return env->GetStaticFloatField(clazz, id); -} - -template <> -Q_CORE_EXPORT jdouble QJNIObjectPrivate::getStaticField<jdouble>(jclass clazz, const char *fieldName) -{ - QJNIEnvironmentPrivate env; - jdouble res = 0.; - jfieldID id = getFieldID(env, clazz, fieldName, "D", true); - if (id) - res = env->GetStaticDoubleField(clazz, id); - - return res; -} - -template <> -Q_CORE_EXPORT jdouble QJNIObjectPrivate::getStaticField<jdouble>(const char *className, const char *fieldName) -{ - QJNIEnvironmentPrivate env; - jclass clazz = loadClass(className, env); - if (clazz == 0) - return 0.; - - jfieldID id = getCachedFieldID(env, clazz, toBinaryEncClassName(className), fieldName, "D", true); - if (id == 0) - return 0.; - - return env->GetStaticDoubleField(clazz, id); -} - -QJNIObjectPrivate QJNIObjectPrivate::getObjectField(const char *fieldName, - const char *sig) const -{ - QJNIEnvironmentPrivate env; - jobject res = 0; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, sig); - if (id) { - res = env->GetObjectField(d->m_jobject, id); - if (res && env->ExceptionCheck()) - res = 0; - } - - QJNIObjectPrivate obj(res); - env->DeleteLocalRef(res); - return obj; -} - -QJNIObjectPrivate QJNIObjectPrivate::getStaticObjectField(const char *className, - const char *fieldName, - const char *sig) -{ - QJNIEnvironmentPrivate env; - jclass clazz = loadClass(className, env); - if (clazz == 0) - return QJNIObjectPrivate(); - - jfieldID id = getCachedFieldID(env, clazz, toBinaryEncClassName(className), fieldName, sig, true); - if (id == 0) - return QJNIObjectPrivate(); - - jobject res = env->GetStaticObjectField(clazz, id); - if (res && env->ExceptionCheck()) - res = 0; - - QJNIObjectPrivate obj(res); - env->DeleteLocalRef(res); - return obj; -} - -QJNIObjectPrivate QJNIObjectPrivate::getStaticObjectField(jclass clazz, - const char *fieldName, - const char *sig) -{ - QJNIEnvironmentPrivate env; - jobject res = 0; - jfieldID id = getFieldID(env, clazz, fieldName, sig, true); - if (id) { - res = env->GetStaticObjectField(clazz, id); - if (res && env->ExceptionCheck()) - res = 0; - } - - QJNIObjectPrivate obj(res); - env->DeleteLocalRef(res); - return obj; -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setField<jboolean>(const char *fieldName, jboolean value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "Z"); - if (id) - env->SetBooleanField(d->m_jobject, id, value); - -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setField<jbyte>(const char *fieldName, jbyte value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "B"); - if (id) - env->SetByteField(d->m_jobject, id, value); - -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setField<jchar>(const char *fieldName, jchar value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "C"); - if (id) - env->SetCharField(d->m_jobject, id, value); - -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setField<jshort>(const char *fieldName, jshort value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "S"); - if (id) - env->SetShortField(d->m_jobject, id, value); - -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setField<jint>(const char *fieldName, jint value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "I"); - if (id) - env->SetIntField(d->m_jobject, id, value); - -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setField<jlong>(const char *fieldName, jlong value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "J"); - if (id) - env->SetLongField(d->m_jobject, id, value); - -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setField<jfloat>(const char *fieldName, jfloat value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "F"); - if (id) - env->SetFloatField(d->m_jobject, id, value); - -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setField<jdouble>(const char *fieldName, jdouble value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "D"); - if (id) - env->SetDoubleField(d->m_jobject, id, value); - -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setField<jbooleanArray>(const char *fieldName, jbooleanArray value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "[Z"); - if (id) - env->SetObjectField(d->m_jobject, id, value); - -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setField<jbyteArray>(const char *fieldName, jbyteArray value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "[B"); - if (id) - env->SetObjectField(d->m_jobject, id, value); - -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setField<jcharArray>(const char *fieldName, jcharArray value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "[C"); - if (id) - env->SetObjectField(d->m_jobject, id, value); - -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setField<jshortArray>(const char *fieldName, jshortArray value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "[S"); - if (id) - env->SetObjectField(d->m_jobject, id, value); - -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setField<jintArray>(const char *fieldName, jintArray value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "[I"); - if (id) - env->SetObjectField(d->m_jobject, id, value); - -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setField<jlongArray>(const char *fieldName, jlongArray value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "[J"); - if (id) - env->SetObjectField(d->m_jobject, id, value); - -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setField<jfloatArray>(const char *fieldName, jfloatArray value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "[F"); - if (id) - env->SetObjectField(d->m_jobject, id, value); - -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setField<jdoubleArray>(const char *fieldName, jdoubleArray value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "[D"); - if (id) - env->SetObjectField(d->m_jobject, id, value); - -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setField<jstring>(const char *fieldName, jstring value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "Ljava/lang/String;"); - if (id) - env->SetObjectField(d->m_jobject, id, value); - -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setField<jobject>(const char *fieldName, - const char *sig, - jobject value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, sig); - if (id) - env->SetObjectField(d->m_jobject, id, value); - -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setField<jobjectArray>(const char *fieldName, - const char *sig, - jobjectArray value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, sig); - if (id) - env->SetObjectField(d->m_jobject, id, value); - -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jboolean>(jclass clazz, - const char *fieldName, - jboolean value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getFieldID(env, clazz, fieldName, "Z", true); - if (id) - env->SetStaticBooleanField(clazz, id, value); -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jboolean>(const char *className, - const char *fieldName, - jboolean value) -{ - QJNIEnvironmentPrivate env; - jclass clazz = loadClass(className, env); - if (clazz == 0) - return; - - jfieldID id = getCachedFieldID(env, clazz, className, fieldName, "Z", true); - if (id == 0) - return; - - env->SetStaticBooleanField(clazz, id, value); -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jbyte>(jclass clazz, - const char *fieldName, - jbyte value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getFieldID(env, clazz, fieldName, "B", true); - if (id) - env->SetStaticByteField(clazz, id, value); -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jbyte>(const char *className, - const char *fieldName, - jbyte value) -{ - QJNIEnvironmentPrivate env; - jclass clazz = loadClass(className, env); - if (clazz == 0) - return; - - jfieldID id = getCachedFieldID(env, clazz, className, fieldName, "B", true); - if (id == 0) - return; - - env->SetStaticByteField(clazz, id, value); -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jchar>(jclass clazz, - const char *fieldName, - jchar value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getFieldID(env, clazz, fieldName, "C", true); - if (id) - env->SetStaticCharField(clazz, id, value); -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jchar>(const char *className, - const char *fieldName, - jchar value) -{ - QJNIEnvironmentPrivate env; - jclass clazz = loadClass(className, env); - if (clazz == 0) - return; - - jfieldID id = getCachedFieldID(env, clazz, className, fieldName, "C", true); - if (id == 0) - return; - - env->SetStaticCharField(clazz, id, value); -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jshort>(jclass clazz, - const char *fieldName, - jshort value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getFieldID(env, clazz, fieldName, "S", true); - if (id) - env->SetStaticShortField(clazz, id, value); -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jshort>(const char *className, - const char *fieldName, - jshort value) -{ - QJNIEnvironmentPrivate env; - jclass clazz = loadClass(className, env); - if (clazz == 0) - return; - - jfieldID id = getCachedFieldID(env, clazz, className, fieldName, "S", true); - if (id == 0) - return; - - env->SetStaticShortField(clazz, id, value); -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jint>(jclass clazz, - const char *fieldName, - jint value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getFieldID(env, clazz, fieldName, "I", true); - if (id) - env->SetStaticIntField(clazz, id, value); -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jint>(const char *className, - const char *fieldName, - jint value) -{ - QJNIEnvironmentPrivate env; - jclass clazz = loadClass(className, env); - if (clazz == 0) - return; - - jfieldID id = getCachedFieldID(env, clazz, className, fieldName, "I", true); - if (id == 0) - return; - - env->SetStaticIntField(clazz, id, value); -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jlong>(jclass clazz, - const char *fieldName, - jlong value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getFieldID(env, clazz, fieldName, "J", true); - if (id) - env->SetStaticLongField(clazz, id, value); -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jlong>(const char *className, - const char *fieldName, - jlong value) -{ - QJNIEnvironmentPrivate env; - jclass clazz = loadClass(className, env); - if (clazz == 0) - return; - - jfieldID id = getCachedFieldID(env, clazz, className, fieldName, "J", true); - if (id == 0) - return; - - env->SetStaticLongField(clazz, id, value); -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jfloat>(jclass clazz, - const char *fieldName, - jfloat value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getFieldID(env, clazz, fieldName, "F", true); - if (id) - env->SetStaticFloatField(clazz, id, value); -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jfloat>(const char *className, - const char *fieldName, - jfloat value) -{ - QJNIEnvironmentPrivate env; - jclass clazz = loadClass(className, env); - if (clazz == 0) - return; - - jfieldID id = getCachedFieldID(env, clazz, className, fieldName, "F", true); - if (id == 0) - return; - - env->SetStaticFloatField(clazz, id, value); -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jdouble>(jclass clazz, - const char *fieldName, - jdouble value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getFieldID(env, clazz, fieldName, "D", true); - if (id) - env->SetStaticDoubleField(clazz, id, value); -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jdouble>(const char *className, - const char *fieldName, - jdouble value) -{ - QJNIEnvironmentPrivate env; - jclass clazz = loadClass(className, env); - if (clazz == 0) - return; - - jfieldID id = getCachedFieldID(env, clazz, className, fieldName, "D", true); - if (id == 0) - return; - - env->SetStaticDoubleField(clazz, id, value); -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jobject>(jclass clazz, - const char *fieldName, - const char *sig, - jobject value) -{ - QJNIEnvironmentPrivate env; - jfieldID id = getFieldID(env, clazz, fieldName, sig, true); - if (id) - env->SetStaticObjectField(clazz, id, value); -} - -template <> -Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jobject>(const char *className, - const char *fieldName, - const char *sig, - jobject value) -{ - QJNIEnvironmentPrivate env; - jclass clazz = loadClass(className, env); - if (clazz == 0) - return; - - jfieldID id = getCachedFieldID(env, clazz, className, fieldName, sig, true); - if (id == 0) - return; - - env->SetStaticObjectField(clazz, id, value); -} - -QJNIObjectPrivate QJNIObjectPrivate::fromString(const QString &string) -{ - QJNIEnvironmentPrivate env; - jstring res = env->NewString(reinterpret_cast<const jchar*>(string.constData()), - string.length()); - QJNIObjectPrivate obj(res); - env->DeleteLocalRef(res); - return obj; -} - -QString QJNIObjectPrivate::toString() const -{ - if (!isValid()) - return QString(); - - QJNIObjectPrivate string = callObjectMethod<jstring>("toString"); - return qt_convertJString(static_cast<jstring>(string.object())); -} - -bool QJNIObjectPrivate::isClassAvailable(const char *className) -{ - QJNIEnvironmentPrivate env; - - if (!env) - return false; - - jclass clazz = loadClass(className, env); - return (clazz != 0); -} - -bool QJNIObjectPrivate::isValid() const -{ - return d->m_jobject; -} - -QJNIObjectPrivate QJNIObjectPrivate::fromLocalRef(jobject lref) -{ - QJNIObjectPrivate o(lref); - QJNIEnvironmentPrivate()->DeleteLocalRef(lref); - return o; -} - -bool QJNIObjectPrivate::isSameObject(jobject obj) const -{ - QJNIEnvironmentPrivate env; - return env->IsSameObject(d->m_jobject, obj); -} - -bool QJNIObjectPrivate::isSameObject(const QJNIObjectPrivate &other) const -{ - return isSameObject(other.d->m_jobject); -} - -QT_END_NAMESPACE |