7#include <QtCore/qsharedpointer.h>
9#if defined(Q_QDOC) || defined(Q_OS_ANDROID)
11#include <QtCore/qjnienvironment.h>
12#include <QtCore/qxptype_traits.h>
16class QJniObjectPrivate;
24template <
typename T,
typename =
void>
struct StoresGlobalRefTest : std::false_type {};
26struct StoresGlobalRefTest<T, std::void_t<
decltype(std::declval<T>().object())>>
27 : std::is_same<
decltype(std::declval<T>().object()), jobject>
30template <
typename ...Args>
33 bool hasFrame =
false;
34 explicit LocalFrame(JNIEnv *env =
nullptr)
noexcept
41 env->PopLocalFrame(
nullptr);
46 hasFrame = jniEnv()->PushLocalFrame(
sizeof...(Args)) == 0;
49 JNIEnv *jniEnv()
const
52 env = QJniEnvironment::getJniEnv();
55 bool checkAndClearExceptions()
57 return env ? QJniEnvironment::checkAndClearExceptions(env) :
false;
60 auto convertToJni(T &&value)
62 using Type = q20::remove_cvref_t<T>;
63 using ResultType =
decltype(QtJniTypes::Traits<Type>::convertToJni(jniEnv(),
64 std::declval<T&&>()));
65 if constexpr (std::is_base_of_v<std::remove_pointer_t<jobject>,
66 std::remove_pointer_t<ResultType>>) {
69 if constexpr (!qxp::is_detected_v<StoresGlobalRefTest, Type>) {
74 return QtJniTypes::Traits<Type>::convertToJni(jniEnv(), std::forward<T>(value));
77 auto convertFromJni(QJniObject &&object)
79 using Type = q20::remove_cvref_t<T>;
80 return QtJniTypes::Traits<Type>::convertFromJni(std::move(object));
86class Q_CORE_EXPORT QJniObject
88 template <
typename ...Args>
using LocalFrame = QtJniTypes::Detail::LocalFrame<Args...>;
92 explicit QJniObject(
const char *className);
93 explicit QJniObject(
const char *className,
const char *signature, ...);
94 template<
typename ...Args
96 , std::enable_if_t<!std::disjunction_v<QtJniTypes::IsStringType<std::decay_t<Args>>...>>* =
nullptr
99 explicit QJniObject(
const char *className, Args &&...args)
100 : QJniObject(LocalFrame<Args...>{}, className, std::forward<Args>(args)...)
104 template<
typename ...Args>
105 explicit QJniObject(LocalFrame<Args...> localFrame,
const char *className, Args &&...args)
106 : QJniObject(className, QtJniTypes::constructorSignature<Args...>().data(),
107 localFrame.convertToJni(std::forward<Args>(args))...)
111 explicit QJniObject(jclass clazz);
112 explicit QJniObject(jclass clazz,
const char *signature, ...);
113 template<
typename ...Args
115 , std::enable_if_t<!std::disjunction_v<QtJniTypes::IsStringType<std::decay_t<Args>>...>>* =
nullptr
118 explicit QJniObject(jclass clazz, Args &&...args)
119 : QJniObject(clazz, QtJniTypes::constructorSignature<Args...>().data(),
120 std::forward<Args>(args)...)
122 QJniObject(jobject globalRef);
124 QJniObject(
const QJniObject &other)
noexcept =
default;
125 QJniObject(QJniObject &&other)
noexcept =
default;
126 QJniObject &operator=(
const QJniObject &other)
noexcept =
default;
127 QJniObject &operator=(QJniObject &&other)
noexcept =
default;
131 void swap(QJniObject &other)
noexcept { d.swap(other.d); }
133 template<
typename Class,
typename ...Args>
134 static inline QJniObject construct(Args &&...args)
136 LocalFrame<Args...> frame;
137 return QJniObject(QtJniTypes::Traits<Class>::className().data(),
138 QtJniTypes::constructorSignature<Args...>().data(),
139 frame.convertToJni(std::forward<Args>(args))...);
142 jobject object()
const;
143 template <
typename T> T object()
const
145 QtJniTypes::assertObjectType<T>();
146 return static_cast<T>(javaObject());
149 jclass objectClass()
const;
150 QByteArray className()
const;
152 template <
typename Ret =
void,
typename ...Args
154 , QtJniTypes::IfValidFieldType<Ret> =
true
157 auto callMethod(
const char *methodName,
const char *signature, Args &&...args)
const
159 LocalFrame<Args...> frame(jniEnv());
160 if constexpr (QtJniTypes::isObjectType<Ret>()) {
161 return frame.
template convertFromJni<Ret>(callObjectMethod(methodName, signature,
162 frame.convertToJni(std::forward<Args>(args))...));
164 jmethodID id = getCachedMethodID(frame.jniEnv(), methodName, signature);
166 if constexpr (std::is_same_v<Ret,
void>) {
167 callVoidMethodV(frame.jniEnv(), id,
168 frame.convertToJni(std::forward<Args>(args))...);
169 frame.checkAndClearExceptions();
172 callMethodForType<Ret>(frame.jniEnv(), res, object(), id,
173 frame.convertToJni(std::forward<Args>(args))...);
174 if (frame.checkAndClearExceptions())
179 if constexpr (!std::is_same_v<Ret,
void>)
184 template <
typename Ret =
void,
typename ...Args
186 , QtJniTypes::IfValidSignatureTypes<Ret, Args...> =
true
189 auto callMethod(
const char *methodName, Args &&...args)
const
191 constexpr auto signature = QtJniTypes::methodSignature<Ret, Args...>();
192 return callMethod<Ret>(methodName, signature.data(), std::forward<Args>(args)...);
195 template <
typename Ret,
typename ...Args
197 , QtJniTypes::IfValidSignatureTypes<Ret, Args...> =
true
200 QJniObject callObjectMethod(
const char *methodName, Args &&...args)
const
202 QtJniTypes::assertObjectType<Ret>();
203 constexpr auto signature = QtJniTypes::methodSignature<Ret, Args...>();
204 LocalFrame<Args...> frame(jniEnv());
205 return frame.
template convertFromJni<Ret>(callObjectMethod(methodName, signature,
206 frame.convertToJni(std::forward<Args>(args))...));
209 QJniObject callObjectMethod(
const char *methodName,
const char *signature, ...)
const;
211 template <
typename Ret =
void,
typename ...Args>
212 static auto callStaticMethod(
const char *className,
const char *methodName,
const char *signature, Args &&...args)
214 JNIEnv *env = QJniEnvironment::getJniEnv();
215 jclass clazz = QJniObject::loadClass(className, env);
216 return callStaticMethod<Ret>(clazz, methodName, signature, std::forward<Args>(args)...);
219 template <
typename Ret =
void,
typename ...Args>
220 static auto callStaticMethod(jclass clazz,
const char *methodName,
const char *signature, Args &&...args)
222 JNIEnv *env = QJniEnvironment::getJniEnv();
223 jmethodID id = clazz ? getMethodID(env, clazz, methodName, signature,
true)
225 return callStaticMethod<Ret>(clazz, id, std::forward<Args>(args)...);
228 template <
typename Ret =
void,
typename ...Args
230 , QtJniTypes::IfValidFieldType<Ret> =
true
233 static auto callStaticMethod(jclass clazz, jmethodID methodId, Args &&...args)
235 LocalFrame<Args...> frame;
236 if constexpr (QtJniTypes::isObjectType<Ret>()) {
237 return frame.
template convertFromJni<Ret>(callStaticObjectMethod(clazz, methodId,
238 frame.convertToJni(std::forward<Args>(args))...));
240 if (clazz && methodId) {
241 if constexpr (std::is_same_v<Ret,
void>) {
242 callStaticMethodForVoid(frame.jniEnv(), clazz, methodId,
243 frame.convertToJni(std::forward<Args>(args))...);
244 frame.checkAndClearExceptions();
247 callStaticMethodForType<Ret>(frame.jniEnv(), res, clazz, methodId,
248 frame.convertToJni(std::forward<Args>(args))...);
249 if (frame.checkAndClearExceptions())
254 if constexpr (!std::is_same_v<Ret,
void>)
259 template <
typename Ret =
void,
typename ...Args
261 , QtJniTypes::IfValidSignatureTypes<Ret, Args...> =
true
264 static auto callStaticMethod(
const char *className,
const char *methodName, Args &&...args)
266 JNIEnv *env = QJniEnvironment::getJniEnv();
267 jclass clazz = QJniObject::loadClass(className, env);
268 const jmethodID id = clazz ? getMethodID(env, clazz, methodName,
269 QtJniTypes::methodSignature<Ret, Args...>().data(),
true)
271 return callStaticMethod<Ret>(clazz, id, std::forward<Args>(args)...);
274 template <
typename Ret =
void,
typename ...Args
276 , QtJniTypes::IfValidSignatureTypes<Ret, Args...> =
true
279 static auto callStaticMethod(jclass clazz,
const char *methodName, Args &&...args)
281 constexpr auto signature = QtJniTypes::methodSignature<Ret, Args...>();
282 return callStaticMethod<Ret>(clazz, methodName, signature.data(), std::forward<Args>(args)...);
284 template <
typename Klass,
typename Ret =
void,
typename ...Args
286 , QtJniTypes::IfValidSignatureTypes<Ret, Args...> =
true
289 static auto callStaticMethod(
const char *methodName, Args &&...args)
291 JNIEnv *env = QJniEnvironment::getJniEnv();
292 const jclass clazz = QJniObject::loadClass(QtJniTypes::Traits<Klass>::className().data(),
294 const jmethodID id = clazz ? getMethodID(env, clazz, methodName,
295 QtJniTypes::methodSignature<Ret, Args...>().data(),
true)
297 return callStaticMethod<Ret>(clazz, id, std::forward<Args>(args)...);
300 static QJniObject callStaticObjectMethod(
const char *className,
const char *methodName,
301 const char *signature, ...);
303 static QJniObject callStaticObjectMethod(jclass clazz,
const char *methodName,
304 const char *signature, ...);
306 static QJniObject callStaticObjectMethod(jclass clazz, jmethodID methodId, ...);
309 template <
typename Ret,
typename ...Args
311 , QtJniTypes::IfValidSignatureTypes<Ret, Args...> =
true
314 static QJniObject callStaticObjectMethod(
const char *className,
const char *methodName, Args &&...args)
316 QtJniTypes::assertObjectType<Ret>();
317 constexpr auto signature = QtJniTypes::methodSignature<Ret, Args...>();
318 LocalFrame<Args...> frame;
319 return frame.
template convertFromJni<Ret>(callStaticObjectMethod(className, methodName, signature.data(),
320 frame.convertToJni(std::forward<Args>(args))...));
323 template <
typename Ret,
typename ...Args
325 , QtJniTypes::IfValidSignatureTypes<Ret, Args...> =
true
328 static QJniObject callStaticObjectMethod(jclass clazz,
const char *methodName, Args &&...args)
330 QtJniTypes::assertObjectType<Ret>();
331 constexpr auto signature = QtJniTypes::methodSignature<Ret, Args...>();
332 LocalFrame<Args...> frame;
333 return frame.
template convertFromJni<Ret>(callStaticObjectMethod(clazz, methodName, signature.data(),
334 frame.convertToJni(std::forward<Args>(args))...));
339 , QtJniTypes::IfValidFieldType<T> =
true
342 auto getField(
const char *fieldName)
const
344 LocalFrame<T> frame(jniEnv());
345 if constexpr (QtJniTypes::isObjectType<T>()) {
346 return frame.
template convertFromJni<T>(getObjectField<T>(fieldName));
349 constexpr auto signature = QtJniTypes::fieldSignature<T>();
350 jfieldID id = getCachedFieldID(frame.jniEnv(), fieldName, signature);
352 getFieldForType<T>(frame.jniEnv(), res, object(), id);
353 if (frame.checkAndClearExceptions())
362 , QtJniTypes::IfValidFieldType<T> =
true
365 static auto getStaticField(
const char *className,
const char *fieldName)
368 if constexpr (QtJniTypes::isObjectType<T>()) {
369 return frame.
template convertFromJni<T>(getStaticObjectField<T>(className, fieldName));
371 jclass clazz = QJniObject::loadClass(className, frame.jniEnv());
374 return getStaticField<T>(clazz, fieldName);
380 , QtJniTypes::IfValidFieldType<T> =
true
383 static auto getStaticField(jclass clazz,
const char *fieldName)
386 if constexpr (QtJniTypes::isObjectType<T>()) {
387 return frame.
template convertFromJni<T>(getStaticObjectField<T>(clazz, fieldName));
390 constexpr auto signature = QtJniTypes::fieldSignature<T>();
391 jfieldID id = getFieldID(frame.jniEnv(), clazz, fieldName, signature,
true);
393 getStaticFieldForType<T>(frame.jniEnv(), res, clazz, id);
394 if (frame.checkAndClearExceptions())
401 template <
typename Klass,
typename T
403 , QtJniTypes::IfValidFieldType<T> =
true
406 static auto getStaticField(
const char *fieldName)
408 return getStaticField<T>(QtJniTypes::Traits<Klass>::className(), fieldName);
413 , std::enable_if_t<QtJniTypes::isObjectType<T>(),
bool> =
true
416 QJniObject getObjectField(
const char *fieldName)
const
418 constexpr auto signature = QtJniTypes::fieldSignature<T>();
419 return getObjectField(fieldName, signature);
422 QJniObject getObjectField(
const char *fieldName,
const char *signature)
const;
426 , std::enable_if_t<QtJniTypes::isObjectType<T>(),
bool> =
true
429 static QJniObject getStaticObjectField(
const char *className,
const char *fieldName)
431 constexpr auto signature = QtJniTypes::fieldSignature<T>();
432 return getStaticObjectField(className, fieldName, signature);
435 static QJniObject getStaticObjectField(
const char *className,
436 const char *fieldName,
437 const char *signature);
441 , std::enable_if_t<QtJniTypes::isObjectType<T>(),
bool> =
true
444 static QJniObject getStaticObjectField(jclass clazz,
const char *fieldName)
446 constexpr auto signature = QtJniTypes::fieldSignature<T>();
447 return getStaticObjectField(clazz, fieldName, signature);
450 static QJniObject getStaticObjectField(jclass clazz,
const char *fieldName,
451 const char *signature);
455 , QtJniTypes::IfValidFieldType<T> =
true
458 void setField(
const char *fieldName, T value)
460 constexpr auto signature = QtJniTypes::fieldSignature<T>();
461 jfieldID id = getCachedFieldID(jniEnv(), fieldName, signature);
463 setFieldForType<T>(jniEnv(), object(), id, value);
464 QJniEnvironment::checkAndClearExceptions(jniEnv());
470 , QtJniTypes::IfValidFieldType<T> =
true
473 void setField(
const char *fieldName,
const char *signature, T value)
475 jfieldID id = getCachedFieldID(jniEnv(), fieldName, signature);
477 setFieldForType<T>(jniEnv(), object(), id, value);
478 QJniEnvironment::checkAndClearExceptions(jniEnv());
484 , QtJniTypes::IfValidFieldType<T> =
true
487 static void setStaticField(
const char *className,
const char *fieldName, T value)
490 jclass clazz = QJniObject::loadClass(className, frame.jniEnv());
494 constexpr auto signature = QtJniTypes::fieldSignature<T>();
495 jfieldID id = getCachedFieldID(frame.jniEnv(), clazz, className, fieldName,
500 setStaticFieldForType<T>(frame.jniEnv(), clazz, id, value);
501 frame.checkAndClearExceptions();
506 , QtJniTypes::IfValidFieldType<T> =
true
509 static void setStaticField(
const char *className,
const char *fieldName,
510 const char *signature, T value)
512 JNIEnv *env = QJniEnvironment::getJniEnv();
513 jclass clazz = QJniObject::loadClass(className, env);
518 jfieldID id = getCachedFieldID(env, clazz, className, fieldName,
521 setStaticFieldForType<T>(env, clazz, id, value);
522 QJniEnvironment::checkAndClearExceptions(env);
528 , QtJniTypes::IfValidFieldType<T> =
true
531 static void setStaticField(jclass clazz,
const char *fieldName,
532 const char *signature, T value)
534 JNIEnv *env = QJniEnvironment::getJniEnv();
535 jfieldID id = getFieldID(env, clazz, fieldName, signature,
true);
538 setStaticFieldForType<T>(env, clazz, id, value);
539 QJniEnvironment::checkAndClearExceptions(env);
545 , QtJniTypes::IfValidFieldType<T> =
true
548 static void setStaticField(jclass clazz,
const char *fieldName, T value)
550 setStaticField(clazz, fieldName, QtJniTypes::fieldSignature<T>(), value);
553 template <
typename Klass,
typename T
555 , QtJniTypes::IfValidFieldType<T> =
true
558 static void setStaticField(
const char *fieldName, T value)
560 setStaticField(QtJniTypes::Traits<Klass>::className(), fieldName, value);
563 static QJniObject fromString(
const QString &string);
564 QString toString()
const;
566 static bool isClassAvailable(
const char *className);
567 bool isValid()
const;
570 static QJniObject fromLocalRef(jobject lref);
572 template <
typename T,
573 std::enable_if_t<std::is_convertible_v<T, jobject>,
bool> =
true>
574 QJniObject &operator=(T obj)
576 assign(
static_cast<T>(obj));
581 QJniObject(Qt::Initialization) {}
582 JNIEnv *jniEnv()
const noexcept;
585 static jclass loadClass(
const QByteArray &className, JNIEnv *env);
587#if QT_CORE_REMOVED_SINCE(6
, 7
)
589 static jclass loadClass(
const QByteArray &className, JNIEnv *env,
bool binEncoded);
590 static QByteArray toBinaryEncClassName(
const QByteArray &className);
591 void callVoidMethodV(JNIEnv *env, jmethodID id, va_list args)
const;
594 static jfieldID getCachedFieldID(JNIEnv *env, jclass clazz,
const QByteArray &className,
595 const char *name,
const char *signature,
596 bool isStatic =
false);
597 jfieldID getCachedFieldID(JNIEnv *env,
const char *name,
const char *signature,
598 bool isStatic =
false)
const;
599 static jmethodID getCachedMethodID(JNIEnv *env, jclass clazz,
const QByteArray &className,
600 const char *name,
const char *signature,
601 bool isStatic =
false);
602 jmethodID getCachedMethodID(JNIEnv *env,
const char *name,
const char *signature,
603 bool isStatic =
false)
const;
605 static jfieldID getFieldID(JNIEnv *env, jclass clazz,
const char *name,
606 const char *signature,
bool isStatic =
false);
607 static jmethodID getMethodID(JNIEnv *env, jclass clazz,
const char *name,
608 const char *signature,
bool isStatic =
false);
610 void callVoidMethodV(JNIEnv *env, jmethodID id, ...)
const;
612 bool isSameObject(jobject obj)
const;
613 bool isSameObject(
const QJniObject &other)
const;
614 void assign(jobject obj);
615 jobject javaObject()
const;
617 friend bool operator==(
const QJniObject &,
const QJniObject &);
618 friend bool operator!=(
const QJniObject&,
const QJniObject&);
621 static constexpr void callMethodForType(JNIEnv *env, T &res, jobject obj, jmethodID id, ...)
625 QtJniTypes::Caller<T>::callMethodForType(env, res, obj, id, args);
630 static constexpr void callStaticMethodForType(JNIEnv *env, T &res, jclass clazz,
637 QtJniTypes::Caller<T>::callStaticMethodForType(env, res, clazz, id, args);
641 static void callStaticMethodForVoid(JNIEnv *env, jclass clazz, jmethodID id, ...)
647 env->CallStaticVoidMethodV(clazz, id, args);
653 static constexpr void getFieldForType(JNIEnv *env, T &res, jobject obj, jfieldID id)
655 QtJniTypes::Caller<T>::getFieldForType(env, res, obj, id);
659 static constexpr void getStaticFieldForType(JNIEnv *env, T &res, jclass clazz, jfieldID id)
661 QtJniTypes::Caller<T>::getStaticFieldForType(env, res, clazz, id);
665 static constexpr void setFieldForType(JNIEnv *env, jobject obj, jfieldID id, T value)
667 if constexpr (QtJniTypes::isObjectType<T>()) {
668 LocalFrame<T> frame(env);
669 env->SetObjectField(obj, id,
static_cast<jobject>(frame.convertToJni(value)));
671 QtJniTypes::Caller<T>::setFieldForType(env, obj, id, value);
676 static constexpr void setStaticFieldForType(JNIEnv *env, jclass clazz, jfieldID id, T value)
678 if constexpr (QtJniTypes::isObjectType<T>()) {
679 LocalFrame<T> frame(env);
680 env->SetStaticObjectField(clazz, id,
static_cast<jobject>(frame.convertToJni(value)));
682 QtJniTypes::Caller<T>::setStaticFieldForType(env, clazz, id, value);
686 friend QJniObjectPrivate;
687 QSharedPointer<QJniObjectPrivate> d;
690inline bool operator==(
const QJniObject &obj1,
const QJniObject &obj2)
692 return obj1.isSameObject(obj2);
695inline bool operator!=(
const QJniObject &obj1,
const QJniObject &obj2)
697 return !obj1.isSameObject(obj2);
700namespace QtJniTypes {
701struct QT_TECH_PREVIEW_API JObjectBase
703 operator QJniObject()
const {
return m_object; }
705 bool isValid()
const {
return m_object.isValid(); }
706 jclass objectClass()
const {
return m_object.objectClass(); }
707 QString toString()
const {
return m_object.toString(); }
709 template <
typename T = jobject>
711 return m_object.object<T>();
715 JObjectBase() =
default;
716 JObjectBase(
const JObjectBase &) =
default;
717 JObjectBase(JObjectBase &&) =
default;
718 JObjectBase &operator=(
const JObjectBase &) =
default;
719 JObjectBase &operator=(JObjectBase &&) =
default;
720 ~JObjectBase() =
default;
722 Q_IMPLICIT JObjectBase(jobject object) : m_object(object) {}
723 Q_IMPLICIT JObjectBase(
const QJniObject &object) : m_object(object) {}
724 Q_IMPLICIT JObjectBase(QJniObject &&object)
noexcept : m_object(std::move(object)) {}
729template<
typename Type>
730class QT_TECH_PREVIEW_API JObject :
public JObjectBase
736 : JObjectBase{QJniObject(QtJniTypes::Traits<Class>::className())}
738 Q_IMPLICIT JObject(jobject object) : JObjectBase(object) {}
739 Q_IMPLICIT JObject(
const QJniObject &object) : JObjectBase(object) {}
740 Q_IMPLICIT JObject(QJniObject &&object)
noexcept : JObjectBase(std::move(object)) {}
743 JObject(
const JObject &other) =
default;
744 JObject(JObject &&other)
noexcept =
default;
745 JObject &operator=(
const JObject &other) =
default;
746 JObject &operator=(JObject &&other)
noexcept =
default;
748 ~JObject() =
default;
750 template<
typename Arg,
typename ...Args
751 , std::enable_if_t<!std::is_same_v<q20::remove_cvref_t<Arg>, JObject>,
bool> =
true
752 , IfValidSignatureTypes<Arg, Args...> =
true
754 explicit JObject(Arg && arg, Args &&...args)
755 : JObjectBase{QJniObject(QtJniTypes::Traits<Class>::className(),
756 std::forward<Arg>(arg), std::forward<Args>(args)...)}
760 static JObject fromJObject(jobject object)
762 return JObject(object);
764 template <
typename ...Args>
765 static JObject construct(Args &&...args)
767 return JObject(std::forward<Args>(args)...);
769 static JObject fromLocalRef(jobject lref)
771 return JObject(QJniObject::fromLocalRef(lref));
774 static bool registerNativeMethods(std::initializer_list<JNINativeMethod> methods)
777 return env.registerNativeMethods<Class>(methods);
781 template <
typename Ret =
void,
typename ...Args
783 , QtJniTypes::IfValidSignatureTypes<Ret, Args...> =
true
786 static auto callStaticMethod(
const char *name, Args &&...args)
788 return QJniObject::callStaticMethod<Class, Ret, Args...>(name,
789 std::forward<Args>(args)...);
793 , QtJniTypes::IfValidFieldType<T> =
true
796 static auto getStaticField(
const char *field)
798 return QJniObject::getStaticField<Class, T>(field);
802 , QtJniTypes::IfValidFieldType<T> =
true
805 static void setStaticField(
const char *field, T &&value)
807 QJniObject::setStaticField<Class, T>(field, std::forward<T>(value));
811 template <
typename Ret =
void,
typename ...Args
813 , QtJniTypes::IfValidSignatureTypes<Ret, Args...> =
true
816 auto callMethod(
const char *method, Args &&...args)
const
818 return m_object.callMethod<Ret>(method, std::forward<Args>(args)...);
822 , QtJniTypes::IfValidFieldType<T> =
true
825 auto getField(
const char *fieldName)
const
827 return m_object.getField<T>(fieldName);
832 , QtJniTypes::IfValidFieldType<T> =
true
835 void setField(
const char *fieldName, T &&value)
837 m_object.setField(fieldName, std::forward<T>(value));
840 QByteArray className()
const {
841 return QtJniTypes::Traits<Class>::className().data();
844 static bool isClassAvailable()
846 return QJniObject::isClassAvailable(QtJniTypes::Traits<Class>::className().data());
850 friend bool comparesEqual(
const JObject &lhs,
const JObject &rhs)
851 {
return lhs.m_object == rhs.m_object; }
852 Q_DECLARE_EQUALITY_COMPARABLE_NON_NOEXCEPT(JObject);
855template <
typename T>
struct Traits<JObject<T>> {
856 static constexpr auto signature() {
return Traits<T>::signature(); }
857 static constexpr auto className() {
return Traits<T>::className(); }
858 static auto convertToJni(JNIEnv *,
const JObject<T> &value)
860 return value.object();
862 static auto convertFromJni(QJniObject &&object)
864 return JObject<T>(std::move(object));
869struct Traits<QJniObject>
871 static constexpr auto className()
873 return CTString(
"java/lang/Object");
876 static constexpr auto signature()
878 return CTString(
"Ljava/lang/Object;");
881 static auto convertToJni(JNIEnv *,
const QJniObject &value)
883 return value.object();
885 static auto convertFromJni(QJniObject &&object)
887 return std::move(object);
892struct Traits<QString>
894 static constexpr auto className()
896 return CTString(
"java/lang/String");
898 static constexpr auto signature()
900 return CTString(
"Ljava/lang/String;");
903 static auto convertToJni(JNIEnv *env,
const QString &value)
905 return QtJniTypes::Detail::fromQString(value, env);
908 static auto convertFromJni(QJniObject &&object)
910 return object.toString();
\preliminary \inmodule QtCorePrivate
Q_CORE_EXPORT void unregisterNewIntentListener(NewIntentListener *listener)
Q_CORE_EXPORT int acuqireServiceSetup(int flags)
Q_CORE_EXPORT void registerNewIntentListener(NewIntentListener *listener)
Q_CORE_EXPORT void unregisterResumePauseListener(ResumePauseListener *listener)
Q_CORE_EXPORT void unregisterGenericMotionEventListener(GenericMotionEventListener *listener)
Q_CORE_EXPORT bool acquireAndroidDeadlockProtector()
Q_CORE_EXPORT void unregisterKeyEventListener(KeyEventListener *listener)
Q_CORE_EXPORT void handleResume()
Q_CORE_EXPORT void registerResumePauseListener(ResumePauseListener *listener)
Q_CORE_EXPORT void releaseAndroidDeadlockProtector()
Q_CORE_EXPORT void handleNewIntent(JNIEnv *env, jobject intent)
Q_CORE_EXPORT void setOnBindListener(OnBindListener *listener)
Q_CORE_EXPORT void registerKeyEventListener(KeyEventListener *listener)
Q_CORE_EXPORT void handlePause()
Q_CORE_EXPORT bool isUncompressedNativeLibs()
Q_CORE_EXPORT void unregisterActivityResultListener(ActivityResultListener *listener)
Q_CORE_EXPORT void registerGenericMotionEventListener(GenericMotionEventListener *listener)
Q_CORE_EXPORT void handleActivityResult(jint requestCode, jint resultCode, jobject data)
Q_CORE_EXPORT void waitForServiceSetup()
Q_CORE_EXPORT void registerActivityResultListener(ActivityResultListener *listener)
Q_GLOBAL_STATIC(DefaultRoleNames, qDefaultRoleNames, { { Qt::DisplayRole, "display" }, { Qt::DecorationRole, "decoration" }, { Qt::EditRole, "edit" }, { Qt::ToolTipRole, "toolTip" }, { Qt::StatusTipRole, "statusTip" }, { Qt::WhatsThisRole, "whatsThis" }, }) const QHash< int
Q_DECLARE_JNI_NATIVE_METHOD(dispatchKeyEvent)
Q_DECLARE_JNI_NATIVE_METHOD(dispatchGenericMotionEvent)
static jobject g_jClassLoader
static jboolean dispatchGenericMotionEvent(JNIEnv *, jclass, QtJniTypes::MotionEvent event)
Q_GLOBAL_STATIC(QReadWriteLock, g_updateMutex)
static jobject g_jActivity
Q_DECLARE_JNI_CLASS(MotionEvent, "android/view/MotionEvent")
static jboolean updateNativeActivity(JNIEnv *env, jclass=nullptr)
static jboolean dispatchKeyEvent(JNIEnv *, jclass, QtJniTypes::KeyEvent event)
static jobject g_jService