8#include <QtCore/qbytearray.h>
9#include <QtCore/qhash.h>
10#include <QtCore/qreadwritelock.h>
292 return QJniObject::loadClass(
className, env, binEncoded);
297 return QJniObject::toBinaryEncClassName(
className);
314 int strLength = env->GetStringLength(
string);
316 env->GetStringRegion(
string, 0, strLength,
reinterpret_cast<jchar *
>(
res.data()));
328 const bool found = (
it != cachedClasses->
constEnd());
333 return found ?
it.value() : 0;
345 bool isCached =
false;
347 if (clazz || isCached)
363 "(Ljava/lang/String;)Ljava/lang/Class;",
364 stringName.object());
366 if (!QJniEnvironment::checkAndClearExceptions(env) && classObject.isValid())
367 clazz =
static_cast<jclass
>(env->NewGlobalRef(classObject.object()));
369 cachedClasses->insert(
key, clazz);
377jmethodID QJniObject::getMethodID(JNIEnv *env,
380 const char *signature,
383 jmethodID
id = isStatic ? env->GetStaticMethodID(clazz,
name, signature)
384 : env->GetMethodID(clazz,
name, signature);
386 if (QJniEnvironment::checkAndClearExceptions(env))
392void QJniObject::callVoidMethodV(JNIEnv *env, jmethodID
id, ...)
const
396 callVoidMethodV(env,
id,
args);
400void QJniObject::callVoidMethodV(JNIEnv *env, jmethodID
id, va_list
args)
const
402 env->CallVoidMethodV(
d->m_jobject,
id,
args);
405jmethodID QJniObject::getCachedMethodID(JNIEnv *env,
409 const char *signature,
413 return getMethodID(env, clazz,
name, signature, isStatic);
433 jmethodID
id = getMethodID(env, clazz,
name, signature, isStatic);
435 cachedMethodID->insert(
key,
id);
440jmethodID QJniObject::getCachedMethodID(JNIEnv *env,
const char *
name,
441 const char *signature,
bool isStatic)
const
443 return QJniObject::getCachedMethodID(env,
d->m_jclass,
d->m_className,
name, signature, isStatic);
450jfieldID QJniObject::getFieldID(JNIEnv *env,
453 const char *signature,
456 jfieldID
id = isStatic ? env->GetStaticFieldID(clazz,
name, signature)
457 : env->GetFieldID(clazz,
name, signature);
459 if (QJniEnvironment::checkAndClearExceptions(env))
465jfieldID QJniObject::getCachedFieldID(JNIEnv *env,
469 const char *signature,
473 return getFieldID(env, clazz,
name, signature, isStatic);
493 jfieldID
id = getFieldID(env, clazz,
name, signature, isStatic);
495 cachedFieldID->insert(
key,
id);
500jfieldID QJniObject::getCachedFieldID(JNIEnv *env,
502 const char *signature,
505 return QJniObject::getCachedFieldID(env,
d->m_jclass,
d->m_className,
name, signature, isStatic);
511 bool isCached =
false;
514 if (clazz || isCached)
525 jclass fclazz = env->FindClass(
className);
526 if (!QJniEnvironment::checkAndClearExceptions(env)) {
527 clazz =
static_cast<jclass
>(env->NewGlobalRef(fclazz));
528 env->DeleteLocalRef(fclazz);
548QJniObject::QJniObject()
562QJniObject::QJniObject(
const char *
className)
566 d->m_className = toBinaryEncClassName(
className);
567 d->m_jclass = loadClass(
d->m_className, env.jniEnv(),
true);
568 d->m_own_jclass =
false;
571 jmethodID constructorId = getCachedMethodID(env.jniEnv(),
"<init>",
"()V");
573 jobject
obj = env->NewObject(
d->m_jclass, constructorId);
575 d->m_jobject = env->NewGlobalRef(
obj);
576 env->DeleteLocalRef(
obj);
595QJniObject::QJniObject(
const char *
className,
const char *signature, ...)
599 d->m_className = toBinaryEncClassName(
className);
600 d->m_jclass = loadClass(
d->m_className, env.jniEnv(),
true);
601 d->m_own_jclass =
false;
603 jmethodID constructorId = getCachedMethodID(env.jniEnv(),
"<init>", signature);
606 va_start(
args, signature);
607 jobject
obj = env->NewObjectV(
d->m_jclass, constructorId,
args);
610 d->m_jobject = env->NewGlobalRef(
obj);
611 env->DeleteLocalRef(
obj);
633QJniObject::QJniObject(
const char *
className,
const char *signature,
const QVaListPrivate &
args)
637 d->m_className = toBinaryEncClassName(
className);
638 d->m_jclass = loadClass(
d->m_className, env.jniEnv(),
true);
639 d->m_own_jclass =
false;
641 jmethodID constructorId = getCachedMethodID(env.jniEnv(),
"<init>", signature);
643 jobject
obj = env->NewObjectV(
d->m_jclass, constructorId,
args);
645 d->m_jobject = env->NewGlobalRef(
obj);
646 env->DeleteLocalRef(
obj);
662QJniObject::QJniObject(jclass clazz,
const char *signature, ...)
667 d->m_jclass =
static_cast<jclass
>(env->NewGlobalRef(clazz));
669 jmethodID constructorId = getMethodID(env.jniEnv(),
d->m_jclass,
"<init>", signature);
672 va_start(
args, signature);
673 jobject
obj = env->NewObjectV(
d->m_jclass, constructorId,
args);
676 d->m_jobject = env->NewGlobalRef(
obj);
677 env->DeleteLocalRef(
obj);
707QJniObject::QJniObject(jclass clazz)
711 d->m_jclass =
static_cast<jclass
>(env->NewGlobalRef(clazz));
714 jmethodID constructorId = getMethodID(env.jniEnv(),
d->m_jclass,
"<init>",
"()V");
716 jobject
obj = env->NewObject(
d->m_jclass, constructorId);
718 d->m_jobject = env->NewGlobalRef(
obj);
719 env->DeleteLocalRef(
obj);
725QJniObject::QJniObject(jclass clazz,
const char *signature,
const QVaListPrivate &
args)
730 d->m_jclass =
static_cast<jclass
>(env->NewGlobalRef(clazz));
732 jmethodID constructorId = getMethodID(env.jniEnv(),
d->m_jclass,
"<init>", signature);
734 jobject
obj = env->NewObjectV(
d->m_jclass, constructorId,
args);
736 d->m_jobject = env->NewGlobalRef(
obj);
737 env->DeleteLocalRef(
obj);
756QJniObject::QJniObject(jobject
object)
763 d->m_jobject = env->NewGlobalRef(
object);
764 jclass cls = env->GetObjectClass(
object);
765 d->m_jclass =
static_cast<jclass
>(env->NewGlobalRef(cls));
766 env->DeleteLocalRef(cls);
789QJniObject QJniObject::getCleanJniObject(jobject
object)
795 if (env.checkAndClearExceptions()) {
796 env->DeleteLocalRef(
object);
801 env->DeleteLocalRef(
object);
810QJniObject::~QJniObject()
832jobject QJniObject::object()
const
850jclass QJniObject::objectClass()
const
864 return d->m_className;
868 const char *signature,
872 jobject
res =
nullptr;
873 jmethodID
id = getCachedMethodID(env.jniEnv(),
methodName, signature);
875 res = env->CallObjectMethodV(
d->m_jobject,
id,
args);
876 if (env.checkAndClearExceptions()) {
877 env->DeleteLocalRef(
res);
883 env->DeleteLocalRef(
res);
889 const char *signature,
893 jobject
res =
nullptr;
894 jclass clazz = loadClass(
className, env.jniEnv());
896 jmethodID
id = QJniObject::getCachedMethodID(env.jniEnv(), clazz, toBinaryEncClassName(
className),
899 res = env->CallStaticObjectMethodV(clazz,
id,
args);
900 if (env.checkAndClearExceptions()) {
901 env->DeleteLocalRef(
res);
908 env->DeleteLocalRef(
res);
912QJniObject QJniObject::callStaticObjectMethodV(jclass clazz,
914 const char *signature,
918 jmethodID
id = getMethodID(env.jniEnv(), clazz,
methodName, signature,
true);
922 return getCleanJniObject(env->CallStaticObjectMethodV(clazz,
id,
args));
1055QJniObject QJniObject::callObjectMethod(
const char *
methodName,
const char *signature, ...)
const
1058 jmethodID
id = getCachedMethodID(env.jniEnv(),
methodName, signature);
1061 va_start(
args, signature);
1084 const char *signature, ...)
1087 jclass clazz = QJniObject::loadClass(
className, env.jniEnv());
1089 jmethodID
id = QJniObject::getCachedMethodID(env.jniEnv(), clazz,
1090 QJniObject::toBinaryEncClassName(
className),
1094 va_start(
args, signature);
1095 QJniObject res = getCleanJniObject(env->CallStaticObjectMethodV(clazz,
id,
args));
1111 const char *signature, ...)
1115 jmethodID
id = getMethodID(env.jniEnv(), clazz,
methodName, signature,
true);
1118 va_start(
args, signature);
1119 QJniObject res = getCleanJniObject(env->CallStaticObjectMethodV(clazz,
id,
args));
1143QJniObject QJniObject::callStaticObjectMethod(jclass clazz, jmethodID methodId, ...)
1146 if (clazz && methodId) {
1148 va_start(
args, methodId);
1149 QJniObject res = getCleanJniObject(env->CallStaticObjectMethodV(clazz, methodId,
args));
1280 const char *fieldName,
1281 const char *signature)
1284 jclass clazz = QJniObject::loadClass(
className, env.jniEnv());
1287 jfieldID
id = QJniObject::getCachedFieldID(env.jniEnv(), clazz,
1288 QJniObject::toBinaryEncClassName(
className),
1294 return getCleanJniObject(env->GetStaticObjectField(clazz,
id));
1309QJniObject QJniObject::getStaticObjectField(jclass clazz,
const char *fieldName,
1310 const char *signature)
1313 jfieldID
id = getFieldID(env.jniEnv(), clazz, fieldName, signature,
true);
1317 return getCleanJniObject(env->GetStaticObjectField(clazz,
id));
1354QJniObject QJniObject::getObjectField(
const char *fieldName,
const char *signature)
const
1357 jfieldID
id = getCachedFieldID(env.jniEnv(), fieldName, signature);
1361 return getCleanJniObject(env->GetObjectField(
d->m_jobject,
id));
1412 return getCleanJniObject(env->NewString(
reinterpret_cast<const jchar*
>(
string.constData()),
1430QString QJniObject::toString()
const
1435 QJniObject string = callObjectMethod<jstring>(
"toString");
1450bool QJniObject::isClassAvailable(
const char *
className)
1457 return loadClass(
className, env.jniEnv());;
1471bool QJniObject::isValid()
const
1473 return d->m_jobject;
1490QJniObject QJniObject::fromLocalRef(jobject lref)
1497bool QJniObject::isSameObject(jobject
obj)
const
1504 return isSameObject(
other.d->m_jobject);
1507void QJniObject::assign(jobject
obj)
1509 if (isSameObject(
obj))
1512 jobject jobj =
static_cast<jobject
>(
obj);
1516 d->m_jobject = env->NewGlobalRef(jobj);
1517 jclass objectClass = env->GetObjectClass(jobj);
1518 d->m_jclass =
static_cast<jclass
>(env->NewGlobalRef(objectClass));
1519 env->DeleteLocalRef(objectClass);
1523jobject QJniObject::javaObject()
const
1525 return d->m_jobject;
QByteArray & replace(qsizetype index, qsizetype len, const char *s, qsizetype alen)
This is an overloaded member function, provided for convenience. It differs from the above function o...
static QByteArray toBinaryEncClassName(const QByteArray &className)
static jclass loadClass(const QByteArray &className, JNIEnv *env, bool binEncoded=false)
QJniObjectPrivate()=default
QString arg(Args &&...args) const
const_iterator constEnd() const noexcept
const_iterator constFind(const T &value) const
iterator insert(const T &value)
static QSharedPointer create(Args &&...arguments)
This is an overloaded member function, provided for convenience. It differs from the above function o...
\macro QT_RESTRICTED_CAST_FROM_ASCII
static QString fromLatin1(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
QSet< QString >::iterator it
Combined button and popup list for selecting options.
Q_CORE_EXPORT jclass findClass(const char *className, JNIEnv *env)
constexpr Initialization Uninitialized
static QString methodName(const QDBusIntrospection::Method &method)
#define Q_GLOBAL_STATIC(TYPE, NAME,...)
QHash< QString, jclass > JClassHash
static QString qt_convertJString(jstring string)
QHash< QString, jmethodID > JMethodIDHash
static QLatin1StringView keyBase()
static jclass getCachedClass(const QByteArray &classBinEnc, bool *isCached=nullptr)
QHash< QString, jfieldID > JFieldIDHash
const char className[16]
[1]