7#include <QtCore/qsharedpointer.h>
9#if defined(Q_QDOC) || defined(Q_OS_ANDROID)
11#include <QtCore/qjnienvironment.h>
12#include <QtCore/qjnitypes.h>
24 template<
typename ...Args
26 , std::enable_if_t<!std::disjunction_v<QtJniTypes::IsStringType<std::decay_t<Args>>...>>* =
nullptr
34 explicit QJniObject(jclass clazz,
const char *signature, ...);
35 template<
typename ...Args
37 , std::enable_if_t<!std::disjunction_v<QtJniTypes::IsStringType<std::decay_t<Args>>...>>* =
nullptr
41 :
QJniObject(clazz, QtJniTypes::constructorSignature<Args...>().
data(),
48 template<
typename Class,
typename ...Args>
52 QtJniTypes::constructorSignature<Args...>().
data(),
53 std::forward<Args>(
args)...);
57 template <
typename T> T
object()
const
59 QtJniTypes::assertObjectType<T>();
60 return static_cast<T
>(javaObject());
63 jclass objectClass()
const;
66 template <
typename Ret,
typename ...Args>
67 auto callMethod(
const char *
methodName,
const char *signature, Args &&...
args)
const
69 if constexpr (QtJniTypes::isObjectType<Ret>()) {
70 return callObjectMethod(
methodName, signature, std::forward<Args>(
args)...);
72 QtJniTypes::assertPrimitiveType<Ret>();
74 jmethodID
id = getCachedMethodID(env.jniEnv(),
methodName, signature);
76 if constexpr (std::is_same<Ret, void>::value) {
77 callVoidMethodV(env.jniEnv(),
id, std::forward<Args>(
args)...);
78 env.checkAndClearExceptions();
81 callMethodForType<Ret>(env.jniEnv(),
res,
object(),
id, std::forward<Args>(
args)...);
82 if (env.checkAndClearExceptions())
87 if constexpr (!std::is_same<Ret, void>::value)
92 template <
typename Ret,
typename ...Args>
95 constexpr auto signature = QtJniTypes::methodSignature<Ret, Args...>();
96 if constexpr (std::is_same<Ret, void>::value) {
103 template <
typename Ret,
typename ...Args>
106 QtJniTypes::assertObjectType<Ret>();
107 constexpr auto signature = QtJniTypes::methodSignature<Ret, Args...>();
113 template <
typename Ret,
typename ...Args>
114 static auto callStaticMethod(
const char *
className,
const char *
methodName,
const char *signature, Args &&...
args)
117 jclass clazz = QJniObject::loadClass(
className, env.jniEnv());
118 return callStaticMethod<Ret>(clazz,
methodName, signature, std::forward<Args>(
args)...);
121 template <
typename Ret,
typename ...Args>
122 static auto callStaticMethod(jclass clazz,
const char *
methodName,
const char *signature, Args &&...
args)
125 jmethodID
id = getMethodID(env.jniEnv(), clazz,
methodName, signature,
true);
126 return callStaticMethod<Ret, Args...>(clazz,
id, std::forward<Args>(
args)...);
129 template <
typename Ret,
typename ...Args>
130 static auto callStaticMethod(jclass clazz, jmethodID methodId, Args &&...
args)
132 if constexpr (QtJniTypes::isObjectType<Ret>()) {
133 return callStaticObjectMethod(clazz, methodId, std::forward<Args>(
args)...);
135 QtJniTypes::assertPrimitiveType<Ret>();
137 if (clazz && methodId) {
138 if constexpr (std::is_same<Ret, void>::value) {
139 callStaticMethodForVoid(env.jniEnv(), clazz, methodId, std::forward<Args>(
args)...);
140 env.checkAndClearExceptions();
143 callStaticMethodForType<Ret>(env.jniEnv(),
res, clazz, methodId, std::forward<Args>(
args)...);
144 if (env.checkAndClearExceptions())
149 if constexpr (!std::is_same<Ret, void>::value)
154 template <
typename Ret,
typename ...Args>
158 jclass clazz = QJniObject::loadClass(
className, env.jniEnv());
159 return callStaticMethod<Ret, Args...>(clazz,
methodName, std::forward<Args>(
args)...);
162 template <
typename Ret,
typename ...Args>
163 static auto callStaticMethod(jclass clazz,
const char *
methodName, Args &&...
args)
165 constexpr auto signature = QtJniTypes::methodSignature<Ret, Args...>();
170 const char *signature, ...);
173 const char *signature, ...);
175 static QJniObject callStaticObjectMethod(jclass clazz, jmethodID methodId, ...);
178 template <
typename Ret,
typename ...Args>
181 QtJniTypes::assertObjectType<Ret>();
182 constexpr auto signature = QtJniTypes::methodSignature<Ret, Args...>();
186 template <
typename Ret,
typename ...Args>
189 QtJniTypes::assertObjectType<Ret>();
190 constexpr auto signature = QtJniTypes::methodSignature<Ret, Args...>();
194 template <
typename T>
auto getField(
const char *fieldName)
const
196 if constexpr (QtJniTypes::isObjectType<T>()) {
197 return getObjectField<T>(fieldName);
199 QtJniTypes::assertPrimitiveType<T>();
202 constexpr auto signature = QtJniTypes::fieldSignature<T>();
203 jfieldID
id = getCachedFieldID(env.jniEnv(), fieldName, signature);
205 getFieldForType<T>(env.jniEnv(),
res,
object(),
id);
206 if (env.checkAndClearExceptions())
213 template <
typename T>
214 static auto getStaticField(
const char *
className,
const char *fieldName)
216 if constexpr (QtJniTypes::isObjectType<T>()) {
217 return getStaticObjectField<T>(
className, fieldName);
219 QtJniTypes::assertPrimitiveType<T>();
221 jclass clazz = QJniObject::loadClass(
className, env.jniEnv());
226 constexpr auto signature = QtJniTypes::fieldSignature<T>();
227 jfieldID
id = getCachedFieldID(env.jniEnv(), clazz,
228 QJniObject::toBinaryEncClassName(
className),
234 getStaticFieldForType<T>(env.jniEnv(),
res, clazz,
id);
235 if (env.checkAndClearExceptions())
241 template <
typename T>
242 static auto getStaticField(jclass clazz,
const char *fieldName)
244 if constexpr (QtJniTypes::isObjectType<T>()) {
245 return getStaticObjectField<T>(clazz, fieldName);
247 QtJniTypes::assertPrimitiveType<T>();
250 constexpr auto signature = QtJniTypes::fieldSignature<T>();
251 jfieldID
id = getFieldID(env.jniEnv(), clazz, fieldName, signature,
true);
253 getStaticFieldForType<T>(env.jniEnv(),
res, clazz,
id);
254 if (env.checkAndClearExceptions())
261 template <
typename Klass,
typename T>
262 static auto getStaticField(
const char *fieldName)
264 return getStaticField<T>(QtJniTypes::className<Klass>(), fieldName);
267 template <
typename T>
268 QJniObject getObjectField(
const char *fieldName)
const
270 QtJniTypes::assertObjectType<T>();
271 constexpr auto signature = QtJniTypes::fieldSignature<T>();
272 return getObjectField(fieldName, signature);
275 QJniObject getObjectField(
const char *fieldName,
const char *signature)
const;
277 template <
typename T>
280 QtJniTypes::assertObjectType<T>();
281 constexpr auto signature = QtJniTypes::fieldSignature<T>();
282 return getStaticObjectField(
className, fieldName, signature);
286 const char *fieldName,
287 const char *signature);
289 template <
typename T>
290 static QJniObject getStaticObjectField(jclass clazz,
const char *fieldName)
292 QtJniTypes::assertObjectType<T>();
293 constexpr auto signature = QtJniTypes::fieldSignature<T>();
294 return getStaticObjectField(clazz, fieldName, signature);
297 static QJniObject getStaticObjectField(jclass clazz,
const char *fieldName,
298 const char *signature);
300 template <
typename T>
void setField(
const char *fieldName, T
value)
302 QtJniTypes::assertType<T>();
304 constexpr auto signature = QtJniTypes::fieldSignature<T>();
305 jfieldID
id = getCachedFieldID(env.jniEnv(), fieldName, signature);
307 setFieldForType<T>(env.jniEnv(),
object(),
id,
value);
308 env.checkAndClearExceptions();
312 template <
typename T>
313 void setField(
const char *fieldName,
const char *signature, T
value)
315 QtJniTypes::assertType<T>();
317 jfieldID
id = getCachedFieldID(env.jniEnv(), fieldName, signature);
319 setFieldForType<T>(env.jniEnv(),
object(),
id,
value);
320 env.checkAndClearExceptions();
324 template <
typename T>
325 static void setStaticField(
const char *
className,
const char *fieldName, T
value)
327 QtJniTypes::assertType<T>();
329 jclass clazz = QJniObject::loadClass(
className, env.jniEnv());
333 constexpr auto signature = QtJniTypes::fieldSignature<T>();
334 jfieldID
id = getCachedFieldID(env.jniEnv(), clazz,
className, fieldName,
339 setStaticFieldForType<T>(env.jniEnv(), clazz,
id,
value);
340 env.checkAndClearExceptions();
343 template <
typename T>
344 static void setStaticField(
const char *
className,
const char *fieldName,
345 const char *signature, T
value)
347 QtJniTypes::assertType<T>();
349 jclass clazz = QJniObject::loadClass(
className, env.jniEnv());
354 jfieldID
id = getCachedFieldID(env.jniEnv(), clazz,
className, fieldName,
357 setStaticFieldForType<T>(env.jniEnv(), clazz,
id,
value);
358 env.checkAndClearExceptions();
362 template <
typename T>
363 static void setStaticField(jclass clazz,
const char *fieldName,
364 const char *signature, T
value)
366 QtJniTypes::assertType<T>();
368 jfieldID
id = getFieldID(env.jniEnv(), clazz, fieldName, signature,
true);
371 setStaticFieldForType<T>(env.jniEnv(), clazz,
id,
value);
372 env.checkAndClearExceptions();
376 template <
typename T>
377 static void setStaticField(jclass clazz,
const char *fieldName, T
value)
379 QtJniTypes::assertType<T>();
381 constexpr auto signature = QtJniTypes::fieldSignature<T>();
382 jfieldID
id = getFieldID(env.jniEnv(), clazz, fieldName, signature,
true);
384 setStaticFieldForType<T>(env.jniEnv(), clazz,
id,
value);
385 env.checkAndClearExceptions();
389 template <
typename Klass,
typename T>
390 static void setStaticField(
const char *fieldName, T
value)
392 setStaticField(QtJniTypes::className<Klass>(), fieldName,
value);
398 static bool isClassAvailable(
const char *
className);
399 bool isValid()
const;
406 QtJniTypes::assertType<T>();
407 assign(
static_cast<T
>(
obj));
412 struct QVaListPrivate {
operator va_list &()
const {
return m_args; } va_list &m_args; };
414 QJniObject(jclass clazz,
const char *signature,
const QVaListPrivate &
args);
416 static jclass loadClass(
const QByteArray &
className, JNIEnv *env,
bool binEncoded =
false);
421 const char *
name,
const char *signature,
422 bool isStatic =
false);
423 jfieldID getCachedFieldID(JNIEnv *env,
const char *
name,
const char *signature,
424 bool isStatic =
false)
const;
426 const char *
name,
const char *signature,
427 bool isStatic =
false);
428 jmethodID getCachedMethodID(JNIEnv *env,
const char *
name,
const char *signature,
429 bool isStatic =
false)
const;
431 static jfieldID getFieldID(JNIEnv *env, jclass clazz,
const char *
name,
432 const char *signature,
bool isStatic =
false);
433 static jmethodID getMethodID(JNIEnv *env, jclass clazz,
const char *
name,
434 const char *signature,
bool isStatic =
false);
436 void callVoidMethodV(JNIEnv *env, jmethodID
id, ...)
const;
438 void callVoidMethodV(JNIEnv *env, jmethodID
id, va_list
args)
const;
444 const char *signature, va_list
args);
447 const char *signature, va_list
args);
449 bool isSameObject(jobject
obj)
const;
451 void assign(jobject
obj);
452 jobject javaObject()
const;
458 static constexpr void callMethodForType(JNIEnv *env, T &
res, jobject
obj,
464 if constexpr(std::is_same<T, jboolean>::value)
466 else if constexpr(std::is_same<T, jbyte>::value)
468 else if constexpr(std::is_same<T, jchar>::value)
470 else if constexpr(std::is_same<T, jshort>::value)
472 else if constexpr(std::is_same<T, jint>::value)
474 else if constexpr(std::is_same<T, jlong>::value)
476 else if constexpr(std::is_same<T, jfloat>::value)
478 else if constexpr(std::is_same<T, jdouble>::value)
481 QtJniTypes::staticAssertTypeMismatch();
486 static constexpr void callStaticMethodForType(JNIEnv *env, T &
res, jclass clazz,
491 if constexpr(std::is_same<T, jboolean>::value)
492 res = env->CallStaticBooleanMethodV(clazz,
id,
args);
493 else if constexpr(std::is_same<T, jbyte>::value)
494 res = env->CallStaticByteMethodV(clazz,
id,
args);
495 else if constexpr(std::is_same<T, jchar>::value)
496 res = env->CallStaticCharMethodV(clazz,
id,
args);
497 else if constexpr(std::is_same<T, jshort>::value)
498 res = env->CallStaticShortMethodV(clazz,
id,
args);
499 else if constexpr(std::is_same<T, jint>::value)
500 res = env->CallStaticIntMethodV(clazz,
id,
args);
501 else if constexpr(std::is_same<T, jlong>::value)
502 res = env->CallStaticLongMethodV(clazz,
id,
args);
503 else if constexpr(std::is_same<T, jfloat>::value)
504 res = env->CallStaticFloatMethodV(clazz,
id,
args);
505 else if constexpr(std::is_same<T, jdouble>::value)
506 res = env->CallStaticDoubleMethodV(clazz,
id,
args);
508 QtJniTypes::staticAssertTypeMismatch();
512 static void callStaticMethodForVoid(JNIEnv *env, jclass clazz, jmethodID
id, ...)
516 env->CallStaticVoidMethodV(clazz,
id,
args);
522 static constexpr void getFieldForType(JNIEnv *env, T &
res, jobject
obj,
525 if constexpr(std::is_same<T, jboolean>::value)
526 res = env->GetBooleanField(
obj,
id);
527 else if constexpr(std::is_same<T, jbyte>::value)
528 res = env->GetByteField(
obj,
id);
529 else if constexpr(std::is_same<T, jchar>::value)
530 res = env->GetCharField(
obj,
id);
531 else if constexpr(std::is_same<T, jshort>::value)
532 res = env->GetShortField(
obj,
id);
533 else if constexpr(std::is_same<T, jint>::value)
534 res = env->GetIntField(
obj,
id);
535 else if constexpr(std::is_same<T, jlong>::value)
536 res = env->GetLongField(
obj,
id);
537 else if constexpr(std::is_same<T, jfloat>::value)
538 res = env->GetFloatField(
obj,
id);
539 else if constexpr(std::is_same<T, jdouble>::value)
540 res = env->GetDoubleField(
obj,
id);
542 QtJniTypes::staticAssertTypeMismatch();
546 static constexpr void getStaticFieldForType(JNIEnv *env, T &
res, jclass clazz,
549 if constexpr(std::is_same<T, jboolean>::value)
550 res = env->GetStaticBooleanField(clazz,
id);
551 else if constexpr(std::is_same<T, jbyte>::value)
552 res = env->GetStaticByteField(clazz,
id);
553 else if constexpr(std::is_same<T, jchar>::value)
554 res = env->GetStaticCharField(clazz,
id);
555 else if constexpr(std::is_same<T, jshort>::value)
556 res = env->GetStaticShortField(clazz,
id);
557 else if constexpr(std::is_same<T, jint>::value)
558 res = env->GetStaticIntField(clazz,
id);
559 else if constexpr(std::is_same<T, jlong>::value)
560 res = env->GetStaticLongField(clazz,
id);
561 else if constexpr(std::is_same<T, jfloat>::value)
562 res = env->GetStaticFloatField(clazz,
id);
563 else if constexpr(std::is_same<T, jdouble>::value)
564 res = env->GetStaticDoubleField(clazz,
id);
566 QtJniTypes::staticAssertTypeMismatch();
570 static constexpr void setFieldForType(JNIEnv *env, jobject
obj,
571 jfieldID
id, T
value)
573 if constexpr(std::is_same<T, jboolean>::value)
574 env->SetBooleanField(
obj,
id,
value);
575 else if constexpr(std::is_same<T, jbyte>::value)
577 else if constexpr(std::is_same<T, jchar>::value)
579 else if constexpr(std::is_same<T, jshort>::value)
581 else if constexpr(std::is_same<T, jint>::value)
583 else if constexpr(std::is_same<T, jlong>::value)
585 else if constexpr(std::is_same<T, jfloat>::value)
587 else if constexpr(std::is_same<T, jdouble>::value)
588 env->SetDoubleField(
obj,
id,
value);
589 else if constexpr(std::is_convertible<T, jobject>::value)
590 env->SetObjectField(
obj,
id,
value);
592 QtJniTypes::staticAssertTypeMismatch();
596 static constexpr void setStaticFieldForType(JNIEnv *env, jclass clazz,
597 jfieldID
id, T
value)
599 if constexpr(std::is_same<T, jboolean>::value)
600 env->SetStaticBooleanField(clazz,
id,
value);
601 else if constexpr(std::is_same<T, jbyte>::value)
602 env->SetStaticByteField(clazz,
id,
value);
603 else if constexpr(std::is_same<T, jchar>::value)
604 env->SetStaticCharField(clazz,
id,
value);
605 else if constexpr(std::is_same<T, jshort>::value)
606 env->SetStaticShortField(clazz,
id,
value);
607 else if constexpr(std::is_same<T, jint>::value)
608 env->SetStaticIntField(clazz,
id,
value);
609 else if constexpr(std::is_same<T, jlong>::value)
610 env->SetStaticLongField(clazz,
id,
value);
611 else if constexpr(std::is_same<T, jfloat>::value)
612 env->SetStaticFloatField(clazz,
id,
value);
613 else if constexpr(std::is_same<T, jdouble>::value)
614 env->SetStaticDoubleField(clazz,
id,
value);
615 else if constexpr(std::is_convertible<T, jobject>::value)
616 env->SetStaticObjectField(clazz,
id,
value);
618 QtJniTypes::staticAssertTypeMismatch();
627 return obj1.isSameObject(obj2);
632 return !obj1.isSameObject(obj2);
\macro QT_RESTRICTED_CAST_FROM_ASCII
Combined button and popup list for selecting options.
constexpr bool operator!=(const timespec &t1, const timespec &t2)
static QString methodName(const QDBusIntrospection::Method &method)
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)
const char className[16]
[1]
char * toString(const MyType &t)
[31]