4#ifndef QJNI_ENVIRONMENT_H
5#define QJNI_ENVIRONMENT_H
7#include <QtCore/QScopedPointer>
9#if defined(Q_QDOC) || defined(Q_OS_ANDROID)
11#include <QtCore/qjnitypes_impl.h>
15class QJniEnvironmentPrivate;
17class Q_CORE_EXPORT QJniEnvironment
23 JNIEnv *operator->()
const;
24 JNIEnv &operator*()
const;
25 JNIEnv *jniEnv()
const;
26 jclass findClass(
const char *className);
27 template<
typename Class>
28 jclass findClass() {
return findClass(QtJniTypes::Traits<Class>::className().data()); }
29 jmethodID findMethod(jclass clazz,
const char *methodName,
const char *signature);
30 template<
typename ...Args>
31 jmethodID findMethod(jclass clazz,
const char *methodName) {
32 constexpr auto signature = QtJniTypes::methodSignature<Args...>();
33 return findMethod(clazz, methodName, signature.data());
35 jmethodID findStaticMethod(jclass clazz,
const char *methodName,
const char *signature);
36 template<
typename ...Args>
37 jmethodID findStaticMethod(jclass clazz,
const char *methodName) {
38 constexpr auto signature = QtJniTypes::methodSignature<Args...>();
39 return findStaticMethod(clazz, methodName, signature.data());
41 jfieldID findField(jclass clazz,
const char *fieldName,
const char *signature);
43 jfieldID findField(jclass clazz,
const char *fieldName) {
44 constexpr auto signature = QtJniTypes::fieldSignature<T>();
45 return findField(clazz, fieldName, signature.data());
47 jfieldID findStaticField(jclass clazz,
const char *fieldName,
const char *signature);
49 jfieldID findStaticField(jclass clazz,
const char *fieldName) {
50 constexpr auto signature = QtJniTypes::fieldSignature<T>();
51 return findStaticField(clazz, fieldName, signature.data());
53 static JavaVM *javaVM();
54 bool registerNativeMethods(
const char *className,
const JNINativeMethod methods[],
int size);
55 bool registerNativeMethods(jclass clazz,
const JNINativeMethod methods[],
int size);
57 bool registerNativeMethods(
const char *className, std::initializer_list<JNINativeMethod> methods)
59 return registerNativeMethods(className, std::data(methods), methods.size());
62 bool registerNativeMethods(jclass clazz, std::initializer_list<JNINativeMethod> methods)
64 return registerNativeMethods(clazz, std::data(methods), methods.size());
67 template<
typename Class
69 , std::enable_if_t<QtJniTypes::isObjectType<Class>(),
bool> =
true
72 bool registerNativeMethods(std::initializer_list<JNINativeMethod> methods)
74 return registerNativeMethods(QtJniTypes::Traits<Class>::className().data(), methods);
77#if QT_DEPRECATED_SINCE(6
, 2
)
79 QT_DEPRECATED_VERSION_X_6_2(
"Use the overload with a const JNINativeMethod[] instead.")
80 bool registerNativeMethods(
const char *className, JNINativeMethod methods[],
int size);
83 enum class OutputMode {
88 bool checkAndClearExceptions(OutputMode outputMode = OutputMode::Verbose);
89 static bool checkAndClearExceptions(JNIEnv *env, OutputMode outputMode = OutputMode::Verbose);
91 static JNIEnv *getJniEnv();
94 Q_DISABLE_COPY_MOVE(QJniEnvironment)
95 std::unique_ptr<QJniEnvironmentPrivate> d;
~QJniEnvironmentPrivateTLS()