7#include <QtCore/qsharedpointer.h>
9#if defined(Q_QDOC) || defined(Q_OS_ANDROID)
11#include <QtCore/qjnienvironment.h>
19 friend class QJniArrayBase;
21 template <
typename ...Args>
24 bool hasFrame =
false;
25 explicit LocalFrame(JNIEnv *env =
nullptr) noexcept
32 env->PopLocalFrame(
nullptr);
35 auto newLocalRef(jobject
object)
38 if (jniEnv()->PushLocalFrame(
sizeof...(Args)) < 0)
42 return static_cast<T
>(jniEnv()->NewLocalRef(
object));
47 return newLocalRef<T>(
object.
template object<T>());
49 JNIEnv *jniEnv()
const
52 env = QJniEnvironment::getJniEnv();
55 bool checkAndClearExceptions()
57 return env ? QJniEnvironment::checkAndClearExceptions(env) :
false;
60 auto convertToJni(T &&
value);
68 template<
typename ...Args
70 , std::enable_if_t<!std::disjunction_v<QtJniTypes::IsStringType<std::decay_t<Args>>...>>* =
nullptr
78 template<
typename ...Args>
81 localFrame.convertToJni(
std::forward<Args>(
args))...)
86 explicit QJniObject(jclass clazz,
const char *signature, ...);
87 template<
typename ...Args
89 , std::enable_if_t<!std::disjunction_v<QtJniTypes::IsStringType<std::decay_t<Args>>...>>* =
nullptr
93 :
QJniObject(clazz, QtJniTypes::constructorSignature<Args...>().
data(),
105 template<
typename Class,
typename ...Args>
108 LocalFrame<Args...>
frame;
110 QtJniTypes::constructorSignature<Args...>().
data(),
111 frame.convertToJni(std::forward<Args>(
args))...);
115 template <
typename T> T
object()
const
117 QtJniTypes::assertObjectType<T>();
118 return static_cast<T
>(javaObject());
121 jclass objectClass()
const;
124 template <
typename Ret,
typename ...Args
126 , QtJniTypes::IfValidFieldType<Ret> =
true
129 auto callMethod(
const char *
methodName,
const char *signature, Args &&...
args)
const
131 LocalFrame<Args...>
frame(jniEnv());
132 if constexpr (QtJniTypes::isObjectType<Ret>()) {
133 return frame.template convertFromJni<Ret>(callObjectMethod(
methodName, signature,
134 frame.convertToJni(std::forward<Args>(
args))...));
136 jmethodID
id = getCachedMethodID(
frame.jniEnv(),
methodName, signature);
138 if constexpr (std::is_same_v<Ret, void>) {
139 callVoidMethodV(
frame.jniEnv(),
id,
140 frame.convertToJni(std::forward<Args>(
args))...);
141 frame.checkAndClearExceptions();
144 callMethodForType<Ret>(
frame.jniEnv(),
res,
object(),
id,
145 frame.convertToJni(std::forward<Args>(
args))...);
146 if (
frame.checkAndClearExceptions())
151 if constexpr (!std::is_same_v<Ret, void>)
156 template <
typename Ret,
typename ...Args
158 , QtJniTypes::IfValidSignatureTypes<Ret, Args...> =
true
163 constexpr auto signature = QtJniTypes::methodSignature<Ret, Args...>();
167 template <
typename Ret,
typename ...Args
169 , QtJniTypes::IfValidSignatureTypes<Ret, Args...> =
true
174 QtJniTypes::assertObjectType<Ret>();
175 constexpr auto signature = QtJniTypes::methodSignature<Ret, Args...>();
176 LocalFrame<Args...>
frame(jniEnv());
177 return frame.template convertFromJni<Ret>(callObjectMethod(
methodName, signature,
178 frame.convertToJni(std::forward<Args>(
args))...));
183 template <
typename Ret,
typename ...Args>
184 static auto callStaticMethod(
const char *
className,
const char *
methodName,
const char *signature, Args &&...
args)
186 JNIEnv *env = QJniEnvironment::getJniEnv();
187 jclass clazz = QJniObject::loadClass(
className, env);
188 return callStaticMethod<Ret>(clazz,
methodName, signature, std::forward<Args>(
args)...);
191 template <
typename Ret,
typename ...Args>
192 static auto callStaticMethod(jclass clazz,
const char *
methodName,
const char *signature, Args &&...
args)
194 JNIEnv *env = QJniEnvironment::getJniEnv();
195 jmethodID
id = clazz ? getMethodID(env, clazz,
methodName, signature,
true)
197 return callStaticMethod<Ret>(clazz,
id, std::forward<Args>(
args)...);
200 template <
typename Ret,
typename ...Args
202 , QtJniTypes::IfValidFieldType<Ret> =
true
205 static auto callStaticMethod(jclass clazz, jmethodID methodId, Args &&...
args)
207 LocalFrame<Args...>
frame;
208 if constexpr (QtJniTypes::isObjectType<Ret>()) {
209 return frame.template convertFromJni<Ret>(callStaticObjectMethod(clazz, methodId,
210 frame.convertToJni(std::forward<Args>(
args))...));
212 if (clazz && methodId) {
213 if constexpr (std::is_same_v<Ret, void>) {
214 callStaticMethodForVoid(
frame.jniEnv(), clazz, methodId,
215 frame.convertToJni(std::forward<Args>(
args))...);
216 frame.checkAndClearExceptions();
219 callStaticMethodForType<Ret>(
frame.jniEnv(),
res, clazz, methodId,
220 frame.convertToJni(std::forward<Args>(
args))...);
221 if (
frame.checkAndClearExceptions())
226 if constexpr (!std::is_same_v<Ret, void>)
231 template <
typename Ret,
typename ...Args
233 , QtJniTypes::IfValidSignatureTypes<Ret, Args...> =
true
238 JNIEnv *env = QJniEnvironment::getJniEnv();
239 jclass clazz = QJniObject::loadClass(
className, env);
240 const jmethodID
id = clazz ? getMethodID(env, clazz,
methodName,
241 QtJniTypes::methodSignature<Ret, Args...>().
data(),
true)
243 return callStaticMethod<Ret>(clazz,
id, std::forward<Args>(
args)...);
246 template <
typename Ret,
typename ...Args
248 , QtJniTypes::IfValidSignatureTypes<Ret, Args...> =
true
251 static auto callStaticMethod(jclass clazz,
const char *
methodName, Args &&...
args)
253 constexpr auto signature = QtJniTypes::methodSignature<Ret, Args...>();
256 template <
typename Klass,
typename Ret,
typename ...Args
258 , QtJniTypes::IfValidSignatureTypes<Ret, Args...> =
true
261 static auto callStaticMethod(
const char *
methodName, Args &&...
args)
263 JNIEnv *env = QJniEnvironment::getJniEnv();
264 const jclass clazz = QJniObject::loadClass(QtJniTypes::Traits<Klass>::className().
data(),
266 const jmethodID
id = clazz ? getMethodID(env, clazz,
methodName,
267 QtJniTypes::methodSignature<Ret, Args...>().
data(),
true)
269 return callStaticMethod<Ret>(clazz,
id, std::forward<Args>(
args)...);
273 const char *signature, ...);
276 const char *signature, ...);
278 static QJniObject callStaticObjectMethod(jclass clazz, jmethodID methodId, ...);
281 template <
typename Ret,
typename ...Args
283 , QtJniTypes::IfValidSignatureTypes<Ret, Args...> =
true
288 QtJniTypes::assertObjectType<Ret>();
289 constexpr auto signature = QtJniTypes::methodSignature<Ret, Args...>();
290 LocalFrame<Args...>
frame;
292 frame.convertToJni(std::forward<Args>(
args))...));
295 template <
typename Ret,
typename ...Args
297 , QtJniTypes::IfValidSignatureTypes<Ret, Args...> =
true
302 QtJniTypes::assertObjectType<Ret>();
303 constexpr auto signature = QtJniTypes::methodSignature<Ret, Args...>();
304 LocalFrame<Args...>
frame;
306 frame.convertToJni(std::forward<Args>(
args))...));
311 , QtJniTypes::IfValidFieldType<T> =
true
314 auto getField(
const char *fieldName)
const
316 LocalFrame<T>
frame(jniEnv());
317 if constexpr (QtJniTypes::isObjectType<T>()) {
318 return frame.template convertFromJni<T>(getObjectField<T>(fieldName));
321 constexpr auto signature = QtJniTypes::fieldSignature<T>();
322 jfieldID
id = getCachedFieldID(
frame.jniEnv(), fieldName, signature);
324 getFieldForType<T>(
frame.jniEnv(),
res,
object(),
id);
325 if (
frame.checkAndClearExceptions())
334 , QtJniTypes::IfValidFieldType<T> =
true
337 static auto getStaticField(
const char *
className,
const char *fieldName)
340 if constexpr (QtJniTypes::isObjectType<T>()) {
341 return frame.template convertFromJni<T>(getStaticObjectField<T>(
className, fieldName));
346 return getStaticField<T>(clazz, fieldName);
352 , QtJniTypes::IfValidFieldType<T> =
true
355 static auto getStaticField(jclass clazz,
const char *fieldName)
358 if constexpr (QtJniTypes::isObjectType<T>()) {
359 return frame.template convertFromJni<T>(getStaticObjectField<T>(clazz, fieldName));
362 constexpr auto signature = QtJniTypes::fieldSignature<T>();
363 jfieldID
id = getFieldID(
frame.jniEnv(), clazz, fieldName, signature,
true);
365 getStaticFieldForType<T>(
frame.jniEnv(),
res, clazz,
id);
366 if (
frame.checkAndClearExceptions())
373 template <
typename Klass,
typename T
375 , QtJniTypes::IfValidFieldType<T> =
true
378 static auto getStaticField(
const char *fieldName)
380 return getStaticField<T>(QtJniTypes::Traits<Klass>::className(), fieldName);
385 , std::enable_if_t<QtJniTypes::isObjectType<T>(),
bool> =
true
388 QJniObject getObjectField(
const char *fieldName)
const
390 constexpr auto signature = QtJniTypes::fieldSignature<T>();
391 return getObjectField(fieldName, signature);
394 QJniObject getObjectField(
const char *fieldName,
const char *signature)
const;
398 , std::enable_if_t<QtJniTypes::isObjectType<T>(),
bool> =
true
403 constexpr auto signature = QtJniTypes::fieldSignature<T>();
404 return getStaticObjectField(
className, fieldName, signature);
408 const char *fieldName,
409 const char *signature);
413 , std::enable_if_t<QtJniTypes::isObjectType<T>(),
bool> =
true
416 static QJniObject getStaticObjectField(jclass clazz,
const char *fieldName)
418 constexpr auto signature = QtJniTypes::fieldSignature<T>();
419 return getStaticObjectField(clazz, fieldName, signature);
422 static QJniObject getStaticObjectField(jclass clazz,
const char *fieldName,
423 const char *signature);
427 , QtJniTypes::IfValidFieldType<T> =
true
430 void setField(
const char *fieldName, T
value)
432 constexpr auto signature = QtJniTypes::fieldSignature<T>();
433 jfieldID
id = getCachedFieldID(jniEnv(), fieldName, signature);
435 setFieldForType<T>(jniEnv(),
object(),
id,
value);
436 QJniEnvironment::checkAndClearExceptions(jniEnv());
442 , QtJniTypes::IfValidFieldType<T> =
true
445 void setField(
const char *fieldName,
const char *signature, T
value)
447 jfieldID
id = getCachedFieldID(jniEnv(), fieldName, signature);
449 setFieldForType<T>(jniEnv(),
object(),
id,
value);
450 QJniEnvironment::checkAndClearExceptions(jniEnv());
456 , QtJniTypes::IfValidFieldType<T> =
true
459 static void setStaticField(
const char *
className,
const char *fieldName, T
value)
466 constexpr auto signature = QtJniTypes::fieldSignature<T>();
467 jfieldID
id = getCachedFieldID(
frame.jniEnv(), clazz,
className, fieldName,
472 setStaticFieldForType<T>(
frame.jniEnv(), clazz,
id,
value);
473 frame.checkAndClearExceptions();
478 , QtJniTypes::IfValidFieldType<T> =
true
481 static void setStaticField(
const char *
className,
const char *fieldName,
482 const char *signature, T
value)
484 JNIEnv *env = QJniEnvironment::getJniEnv();
485 jclass clazz = QJniObject::loadClass(
className, env);
490 jfieldID
id = getCachedFieldID(env, clazz,
className, fieldName,
493 setStaticFieldForType<T>(env, clazz,
id,
value);
494 QJniEnvironment::checkAndClearExceptions(env);
500 , QtJniTypes::IfValidFieldType<T> =
true
503 static void setStaticField(jclass clazz,
const char *fieldName,
504 const char *signature, T
value)
506 JNIEnv *env = QJniEnvironment::getJniEnv();
507 jfieldID
id = getFieldID(env, clazz, fieldName, signature,
true);
510 setStaticFieldForType<T>(env, clazz,
id,
value);
511 QJniEnvironment::checkAndClearExceptions(env);
517 , QtJniTypes::IfValidFieldType<T> =
true
520 static void setStaticField(jclass clazz,
const char *fieldName, T
value)
522 setStaticField(clazz, fieldName, QtJniTypes::fieldSignature<T>(),
value);
525 template <
typename Klass,
typename T
527 , QtJniTypes::IfValidFieldType<T> =
true
530 static void setStaticField(
const char *fieldName, T
value)
532 setStaticField(QtJniTypes::Traits<Klass>::className(), fieldName,
value);
538 static bool isClassAvailable(
const char *
className);
539 bool isValid()
const;
544 template <
typename T,
545 std::enable_if_t<std::is_convertible_v<T, jobject>,
bool> =
true>
548 assign(
static_cast<T
>(
obj));
554 JNIEnv *jniEnv() const noexcept;
559#if QT_CORE_REMOVED_SINCE(6, 7)
563 void callVoidMethodV(JNIEnv *env, jmethodID
id, va_list
args)
const;
567 const char *
name,
const char *signature,
568 bool isStatic =
false);
569 jfieldID getCachedFieldID(JNIEnv *env,
const char *
name,
const char *signature,
570 bool isStatic =
false)
const;
572 const char *
name,
const char *signature,
573 bool isStatic =
false);
574 jmethodID getCachedMethodID(JNIEnv *env,
const char *
name,
const char *signature,
575 bool isStatic =
false)
const;
577 static jfieldID getFieldID(JNIEnv *env, jclass clazz,
const char *
name,
578 const char *signature,
bool isStatic =
false);
579 static jmethodID getMethodID(JNIEnv *env, jclass clazz,
const char *
name,
580 const char *signature,
bool isStatic =
false);
582 void callVoidMethodV(JNIEnv *env, jmethodID
id, ...)
const;
584 bool isSameObject(jobject
obj)
const;
586 void assign(jobject
obj);
587 jobject javaObject()
const;
593 static constexpr void callMethodForType(JNIEnv *env, T &
res, jobject
obj, jmethodID
id, ...)
597 QtJniTypes::Caller<T>::callMethodForType(env,
res,
obj,
id,
args);
602 static constexpr void callStaticMethodForType(JNIEnv *env, T &
res, jclass clazz,
609 QtJniTypes::Caller<T>::callStaticMethodForType(env,
res, clazz,
id,
args);
613 static void callStaticMethodForVoid(JNIEnv *env, jclass clazz, jmethodID
id, ...)
619 env->CallStaticVoidMethodV(clazz,
id,
args);
625 static constexpr void getFieldForType(JNIEnv *env, T &
res, jobject
obj, jfieldID
id)
627 QtJniTypes::Caller<T>::getFieldForType(env,
res,
obj,
id);
631 static constexpr void getStaticFieldForType(JNIEnv *env, T &
res, jclass clazz, jfieldID
id)
633 QtJniTypes::Caller<T>::getStaticFieldForType(env,
res, clazz,
id);
637 static constexpr void setFieldForType(JNIEnv *env, jobject
obj, jfieldID
id, T
value)
639 if constexpr (QtJniTypes::isObjectType<T>()) {
640 LocalFrame<T>
frame(env);
641 env->SetObjectField(
obj,
id,
static_cast<jobject
>(
frame.convertToJni(
value)));
643 QtJniTypes::Caller<T>::setFieldForType(env,
obj,
id,
value);
648 static constexpr void setStaticFieldForType(JNIEnv *env, jclass clazz, jfieldID
id, T
value)
650 if constexpr (QtJniTypes::isObjectType<T>()) {
651 LocalFrame<T>
frame(env);
652 env->SetStaticObjectField(clazz,
id,
static_cast<jobject
>(
frame.convertToJni(
value)));
654 QtJniTypes::Caller<T>::setStaticFieldForType(env, clazz,
id,
value);
659 QSharedPointer<QJniObjectPrivate>
d;
664 return obj1.isSameObject(obj2);
669 return !obj1.isSameObject(obj2);
672namespace QtJniTypes {
675 operator QJniObject()
const {
return m_object; }
677 bool isValid()
const {
return m_object.isValid(); }
678 jclass objectClass()
const {
return m_object.objectClass(); }
681 template <
typename T = j
object>
683 return m_object.object<T>();
687 JObjectBase() =
default;
688 ~JObjectBase() =
default;
697template<
typename Type>
711 JObject(
const JObject &
other) =
default;
712 JObject(JObject &&
other)
noexcept =
default;
713 JObject &operator=(
const JObject &
other) =
default;
714 JObject &operator=(JObject &&
other)
noexcept =
default;
716 ~JObject() =
default;
718 template<
typename Arg,
typename ...Args
719 , std::enable_if_t<!std::is_same_v<Arg, JObject>,
bool> = true
720 , IfValidSignatureTypes<Arg, Args...> =
true
722 explicit JObject(Arg &&
arg, Args &&...
args)
728 static Type fromJObject(jobject
object) {
return Type(
object); }
729 template <
typename ...Args>
731 static Type fromLocalRef(jobject lref) {
return Type(QJniObject::fromLocalRef(lref)); }
733 static bool registerNativeMethods(std::initializer_list<JNINativeMethod>
methods)
740 template <
typename Ret,
typename ...Args
742 , QtJniTypes::IfValidSignatureTypes<Ret, Args...> =
true
745 static auto callStaticMethod(
const char *
name, Args &&...
args)
747 return QJniObject::callStaticMethod<
Class, Ret, Args...>(
name,
748 std::forward<Args>(
args)...);
752 , QtJniTypes::IfValidFieldType<T> =
true
755 static auto getStaticField(
const char *field)
757 return QJniObject::getStaticField<Class, T>(field);
761 , QtJniTypes::IfValidFieldType<T> =
true
764 static void setStaticField(
const char *field, T &&
value)
766 QJniObject::setStaticField<Class, T>(field, std::forward<T>(
value));
770 template <
typename Ret,
typename ...Args
772 , QtJniTypes::IfValidSignatureTypes<Ret, Args...> =
true
775 auto callMethod(
const char *
method, Args &&...
args)
const
777 return m_object.callMethod<Ret>(
method, std::forward<Args>(
args)...);
781 , QtJniTypes::IfValidFieldType<T> =
true
784 auto getField(
const char *fieldName)
const
786 return m_object.getField<T>(fieldName);
791 , QtJniTypes::IfValidFieldType<T> =
true
794 void setField(
const char *fieldName, T &&
value)
796 m_object.setField(fieldName, std::forward<T>(
value));
800 return QtJniTypes::Traits<Class>::className().data();
804 friend bool comparesEqual(
const JObject &lhs,
const JObject &rhs)
noexcept
805 {
return lhs.m_object == rhs.m_object; }
813#include <QtCore/qjniarray.h>
816template <
typename ...Args>
818auto QJniObject::LocalFrame<Args...>::convertToJni(T &&
value)
821 if constexpr (std::is_same_v<Type, QString>) {
822 return newLocalRef<jstring>(QJniObject::fromString(
value));
823 }
else if constexpr (QtJniTypes::IsJniArray<Type>::value) {
824 return value.arrayObject();
825 }
else if constexpr (QJniArrayBase::canConvert<T>) {
826 using QJniArrayType =
decltype(QJniArrayBase::fromContainer(std::forward<T>(
value)));
827 using ArrayType =
decltype(std::declval<QJniArrayType>().arrayObject());
828 return newLocalRef<ArrayType>(QJniArrayBase::fromContainer(std::forward<T>(
value)).
template object<jobject>());
829 }
else if constexpr (std::is_base_of_v<QJniObject, Type>
830 || std::is_base_of_v<QtJniTypes::JObjectBase, Type>) {
831 return value.object();
833 return std::forward<T>(
value);
837template <
typename ...Args>
839auto QJniObject::LocalFrame<Args...>::convertFromJni(
QJniObject &&
object)
842 if constexpr (std::is_same_v<Type, QString>) {
843 return object.toString();
844 }
else if constexpr (QtJniTypes::IsJniArray<Type>::value) {
845 return T(std::move(
object));
846 }
else if constexpr (QJniArrayBase::canConvert<Type>) {
848 using QJniArrayType =
decltype(QJniArrayBase::fromContainer(std::declval<Type>()));
850 using ElementType =
typename QJniArrayType::Type;
852 return QJniArray<ElementType>(
object.
template object<jarray>()).toContainer();
853 }
else if constexpr (std::is_array_v<Type>) {
854 using ElementType = std::remove_extent_t<Type>;
855 return QJniArray<ElementType>(std::move(
object));
856 }
else if constexpr (std::is_base_of_v<QJniObject, Type>
857 && !std::is_same_v<QJniObject, Type>) {
858 return T{std::move(
object)};
859 }
else if constexpr (std::is_base_of_v<QtJniTypes::JObjectBase, Type>) {
860 return T{std::move(
object)};
862 return std::move(
object);
static JNINativeMethod methods[]
\macro QT_RESTRICTED_CAST_FROM_ASCII
Combined button and popup list for selecting options.
std::array< typename ArrayTypeHelper< ManualType, Types... >::type, sizeof...(Types)> ArrayType
std::remove_cv_t< std::remove_reference_t< T > > remove_cvref_t
#define Q_DECLARE_EQUALITY_COMPARABLE_LITERAL_TYPE(...)
constexpr bool operator!=(const timespec &t1, const timespec &t2)
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char * method
static QString methodName(const QDBusIntrospection::Method &method)
bool comparesEqual(const QDir &lhs, const QDir &rhs)
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
static bool fromString(const QMetaObject *mo, QString s, Allocate &&allocate)
bool operator==(const QRandomGenerator &rng1, const QRandomGenerator &rng2)
#define QT_TECH_PREVIEW_API
const char className[16]
[1]
char * toString(const MyType &t)
[31]