Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qjnienvironment.h
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QJNI_ENVIRONMENT_H
6#define QJNI_ENVIRONMENT_H
7
8#include <QtCore/QScopedPointer>
9
10#if defined(Q_QDOC) || defined(Q_OS_ANDROID)
11#include <jni.h>
12#include <QtCore/qjnitypes_impl.h>
13
14QT_BEGIN_NAMESPACE
15
16class QJniEnvironmentPrivate;
17
18class Q_CORE_EXPORT QJniEnvironment
19{
20public:
21 QJniEnvironment();
22 ~QJniEnvironment();
23 bool isValid() const;
24 JNIEnv *operator->() const;
25 JNIEnv &operator*() const;
26 JNIEnv *jniEnv() const;
27 jclass findClass(const char *className);
28 template<typename Class>
29 jclass findClass() { return findClass(QtJniTypes::Traits<Class>::className().data()); }
30 jmethodID findMethod(jclass clazz, const char *methodName, const char *signature);
31 template<typename ...Args>
32 jmethodID findMethod(jclass clazz, const char *methodName) {
33 constexpr auto signature = QtJniTypes::methodSignature<Args...>();
34 return findMethod(clazz, methodName, signature.data());
35 }
36 jmethodID findStaticMethod(jclass clazz, const char *methodName, const char *signature);
37 template<typename ...Args>
38 jmethodID findStaticMethod(jclass clazz, const char *methodName) {
39 constexpr auto signature = QtJniTypes::methodSignature<Args...>();
40 return findStaticMethod(clazz, methodName, signature.data());
41 }
42 jfieldID findField(jclass clazz, const char *fieldName, const char *signature);
43 template<typename T>
44 jfieldID findField(jclass clazz, const char *fieldName) {
45 constexpr auto signature = QtJniTypes::fieldSignature<T>();
46 return findField(clazz, fieldName, signature.data());
47 }
48 jfieldID findStaticField(jclass clazz, const char *fieldName, const char *signature);
49 template<typename T>
50 jfieldID findStaticField(jclass clazz, const char *fieldName) {
51 constexpr auto signature = QtJniTypes::fieldSignature<T>();
52 return findStaticField(clazz, fieldName, signature.data());
53 }
54 static JavaVM *javaVM();
55 bool registerNativeMethods(const char *className, const JNINativeMethod methods[], int size);
56 bool registerNativeMethods(jclass clazz, const JNINativeMethod methods[], int size);
57
58 bool registerNativeMethods(const char *className, std::initializer_list<JNINativeMethod> methods)
59 {
60 return registerNativeMethods(className, std::data(methods), methods.size());
61 }
62
63 bool registerNativeMethods(jclass clazz, std::initializer_list<JNINativeMethod> methods)
64 {
65 return registerNativeMethods(clazz, std::data(methods), methods.size());
66 }
67
68 template<typename Class
69#ifndef Q_QDOC
70 , std::enable_if_t<QtJniTypes::isObjectType<Class>(), bool> = true
71#endif
72 >
73 bool registerNativeMethods(std::initializer_list<JNINativeMethod> methods)
74 {
75 return registerNativeMethods(QtJniTypes::Traits<Class>::className().data(), methods);
76 }
77
78#if QT_DEPRECATED_SINCE(6, 2)
79 // ### Qt 7: remove
80 QT_DEPRECATED_VERSION_X_6_2("Use the overload with a const JNINativeMethod[] instead.")
81 bool registerNativeMethods(const char *className, JNINativeMethod methods[], int size);
82#endif
83
84 enum class OutputMode {
85 Silent,
86 Verbose
87 };
88
89 bool checkAndClearExceptions(OutputMode outputMode = OutputMode::Verbose);
90 static bool checkAndClearExceptions(JNIEnv *env, OutputMode outputMode = OutputMode::Verbose);
91
92 static JNIEnv *getJniEnv();
93 static QStringList stackTrace(jthrowable exception);
94
95private:
96 Q_DISABLE_COPY_MOVE(QJniEnvironment)
97 std::unique_ptr<QJniEnvironmentPrivate> d;
98};
99
100QT_END_NAMESPACE
101
102#endif
103
104#endif // QJNI_ENVIRONMENT_H
Combined button and popup list for selecting options.