7#include <QtCore/qglobal.h>
9#if defined(Q_QDOC) || defined(Q_OS_ANDROID)
11#include <QtCore/qjnitypes_impl.h>
12#include <QtCore/qjniobject.h>
13#include <QtCore/qjniarray.h>
17#pragma qt_class(QtJniTypes)
22#define Q_DECLARE_JNI_TYPE_HELPER(Type) struct
23 Type##Tag { explicit Type##Tag() = default; }; using
24 Type = JObject<Type##Tag>;
27#define Q_DECLARE_JNI_TYPE(Type, Signature) namespace
28 QtJniTypes { Q_DECLARE_JNI_TYPE_HELPER
30} template
32 ::QtJniTypes::Traits<QtJniTypes::Type##Tag> {
33 static constexpr auto signature()
35 constexpr QtJniTypes::CTString sig(Signature);
36 static_assert((sig.startsWith('L') || sig.startsWith("[L"))
38 "Type signature needs to start with 'L' or"
39 " '[L', and end with ';'");
42};
44#define Q_DECLARE_JNI_CLASS_2(Type, _) Q_DECLARE_JNI_TYPE_HELPER
47#define Q_DECLARE_JNI_CLASS_SPECIALIZATION_2(Type, Signature) template
49 QtJniTypes::Traits<QtJniTypes::Type##Tag> {
50 static constexpr auto className()
52 return QtJniTypes::CTString(Signature);
54 static constexpr auto signature()
56 return QtJniTypes::CTString("L")
58 + QtJniTypes::CTString(";");
60};
62#define Q_DECLARE_JNI_CLASS_3(NS0, NS1, Type) namespace
64 NS1 { Q_DECLARE_JNI_CLASS_2
66} \
67}
69#define Q_DECLARE_JNI_CLASS_SPECIALIZATION_3(NS0, NS1, Type)
70 Q_DECLARE_JNI_CLASS_SPECIALIZATION_2(NS0::NS1::Type,
71 #NS0 "/" #NS1 "/" #Type)
73#define Q_DECLARE_JNI_CLASS_4(NS0, NS1, NS2, Type) namespace
74 NS0 { Q_DECLARE_JNI_CLASS_3
76}
78#define Q_DECLARE_JNI_CLASS_SPECIALIZATION_4(NS0, NS1, NS2, Type)
79 Q_DECLARE_JNI_CLASS_SPECIALIZATION_2(NS0::NS1::NS2::Type,
80 #NS0 "/" #NS1 "/" #NS2 "/" #Type)
82#define Q_DECLARE_JNI_CLASS_5(NS0, NS1, NS2, NS3, Type) namespace
83 NS0 { Q_DECLARE_JNI_CLASS_4
84 (NS1, NS2, NS3, Type) \
85}
87#define Q_DECLARE_JNI_CLASS_SPECIALIZATION_5(NS0, NS1, NS2, NS3, Type)
88 Q_DECLARE_JNI_CLASS_SPECIALIZATION_2(NS0::NS1::NS2::NS3::Type,
89 #NS0 "/" #NS1 "/" #NS2 "/" #NS3 "/" #Type)
91#define Q_DECLARE_JNI_CLASS_6(NS0, NS1, NS2, NS3, NS4, Type) namespace
92 NS0 { Q_DECLARE_JNI_CLASS_5
93 (NS1, NS2, NS3, NS4, Type) \
94}
96#define Q_DECLARE_JNI_CLASS_SPECIALIZATION_6(NS0, NS1, NS2, NS3, NS4, Type)
97 Q_DECLARE_JNI_CLASS_SPECIALIZATION_2(NS0::NS1::NS2::NS3::NS4::Type,
98 #NS0 "/" #NS1 "/" #NS2 "/" #NS3 "/" #NS4 "/" #Type)
100#define Q_DECLARE_JNI_CLASS_7(NS0, NS1, NS2, NS3, NS4, NS5, Type) namespace
101 NS0 { Q_DECLARE_JNI_CLASS_6
102 (NS1, NS2, NS3, NS4, NS5, Type) \
103}
105#define Q_DECLARE_JNI_CLASS_SPECIALIZATION_7(NS0, NS1, NS2, NS3, NS4, NS5, Type)
106 Q_DECLARE_JNI_CLASS_SPECIALIZATION_2(NS0::NS1::NS2::NS3::NS4::NS5::Type,
107 #NS0 "/" #NS1 "/" #NS2 "/" #NS3 "/" #NS4 "/" #NS5 "/" #Type)
109#define Q_DECLARE_JNI_CLASS_8(NS0, NS1, NS2, NS3, NS4, NS5, NS6, Type) namespace
110 NS0 { Q_DECLARE_JNI_CLASS_7
111 (NS1, NS2, NS3, NS4, NS5, NS6, Type) \
112}
114#define Q_DECLARE_JNI_CLASS_SPECIALIZATION_8(NS0, NS1, NS2, NS3, NS4, NS5, NS6, Type)
115 Q_DECLARE_JNI_CLASS_SPECIALIZATION_2(NS0::NS1::NS2::NS3::NS4::NS5::NS6::Type,
116 #NS0 "/" #NS1 "/" #NS2 "/" #NS3 "/" #NS4 "/" #NS5 "/" #NS6 "/" #Type)
118#define Q_DECLARE_JNI_CLASS_9(NS0, NS1, NS2, NS3, NS4, NS5, NS6, NS7, Type) namespace
119 NS0 { Q_DECLARE_JNI_CLASS_8
120 (NS1, NS2, NS3, NS4, NS5, NS6, NS7, Type) \
121}
123#define Q_DECLARE_JNI_CLASS_SPECIALIZATION_9(NS0, NS1, NS2, NS3, NS4, NS5, NS6, NS7, Type)
124 Q_DECLARE_JNI_CLASS_SPECIALIZATION_2(NS0::NS1::NS2::NS3::NS4::NS5::NS6::NS7::Type,
125 #NS0 "/" #NS1 "/" #NS2 "/" #NS3 "/" #NS4 "/" #NS5 "/" #NS6 "/" #NS7 "/" #Type)
127#define Q_DECLARE_JNI_CLASS(...) namespace
128 QtJniTypes { QT_OVERLOADED_MACRO
129 (Q_DECLARE_JNI_CLASS, __VA_ARGS__) \
130} QT_OVERLOADED_MACRO
131 (Q_DECLARE_JNI_CLASS_SPECIALIZATION, __VA_ARGS__)
135namespace QtJniMethods {
142template <
typename Arg>
143struct JNITypeForArgImpl
145 using JNIType =
decltype(QtJniTypes::Traits<Arg>::convertToJni(
nullptr, {}));
146 static Arg fromVarArg(JNIType t)
151 if constexpr (std::is_same_v<JNIType, Arg>) {
154 return QtJniTypes::Traits<Arg>::convertFromJni(t);
159template <
typename Arg>
160using JNITypeForArg =
typename JNITypeForArgImpl<std::decay_t<Arg>>::JNIType;
169#define Q_DECLARE_JNI_NATIVE_METHOD_HELPER(Method, Postfix, Name) struct
170 Method##_##Postfix { template
171 <typename Ret, typename JType, typename... Args> JNICALL
173 call(JNIEnv *env, JType thiz, QtJniMethods::Detail::JNITypeForArg<Args> ...args) \
174{
175 return Method(env, thiz, QtJniMethods::Detail::JNITypeForArgImpl<
176 std::decay_t<Args>>::fromVarArg(args)...
178} static
179 constexpr auto signature = QtJniTypes::nativeMethodSignature(Method); template
180 <typename Ret, typename JType, typename ...Args> static
181 constexpr JNINativeMethod makeJNIMethod(Ret(*)(JNIEnv *, JType, Args...)) \
182{
183 return JNINativeMethod {
184 #Name, signature.data(),
185 reinterpret_cast<void *>(&call<Ret, JType, Args...>)
187} \
188};
190#define Q_DECLARE_JNI_NATIVE_METHOD(...)
191 QT_OVERLOADED_MACRO(QT_DECLARE_JNI_NATIVE_METHOD, __VA_ARGS__)
193#define QT_DECLARE_JNI_NATIVE_METHOD_2(Method, Name) namespace
194 QtJniMethods { Q_DECLARE_JNI_NATIVE_METHOD_HELPER
195 (Method, Helper, Name) \
196}
198#define QT_DECLARE_JNI_NATIVE_METHOD_1(Method)
199 QT_DECLARE_JNI_NATIVE_METHOD_2(Method, Method)
201#define Q_JNI_NATIVE_METHOD(Method)
202 QtJniMethods::Method##_Helper::makeJNIMethod(QT_PREPEND_NAMESPACE(Method))
204#define Q_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE(...)
205 QT_OVERLOADED_MACRO(QT_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE, __VA_ARGS__)
207#define QT_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE_2(Method, Name)
208 Q_DECLARE_JNI_NATIVE_METHOD_HELPER(Method, QtJniMethod, Name)
210#define QT_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE_1(Method)
211 QT_DECLARE_JNI_NATIVE_METHOD_IN_CURRENT_SCOPE_2(Method, Method)
213#define Q_JNI_NATIVE_SCOPED_METHOD(Method, Scope)
214 Scope::Method##_QtJniMethod::makeJNIMethod(Scope::Method)
217Q_DECLARE_JNI_CLASS(String,
"java/lang/String")
218Q_DECLARE_JNI_CLASS(Integer,
"java/lang/Integer");
219Q_DECLARE_JNI_CLASS(Long,
"java/lang/Long");
220Q_DECLARE_JNI_CLASS(Double,
"java/lang/Double");
221Q_DECLARE_JNI_CLASS(Float,
"java/lang/Float");
222Q_DECLARE_JNI_CLASS(Boolean,
"java/lang/Boolean");
223Q_DECLARE_JNI_CLASS(Void,
"java/lang/Void");
226Q_DECLARE_JNI_CLASS(UUID,
"java/util/UUID")
227Q_DECLARE_JNI_CLASS(ArrayList,
"java/util/ArrayList")
228Q_DECLARE_JNI_CLASS(HashMap,
"java/util/HashMap")
229Q_DECLARE_JNI_CLASS(Set,
"java/util/Set")
230Q_DECLARE_JNI_CLASS(File,
"java/io/File");
233Q_DECLARE_JNI_CLASS(Uri,
"android/net/Uri");
234Q_DECLARE_JNI_CLASS(Parcelable,
"android/os/Parcelable");
235Q_DECLARE_JNI_CLASS(Context,
"android/content/Context");
236Q_DECLARE_JNI_CLASS(Intent,
"android/content/Intent");
237Q_DECLARE_JNI_CLASS(ContentResolver,
"android/content/ContentResolver");
238Q_DECLARE_JNI_CLASS(Activity,
"android/app/Activity");
239Q_DECLARE_JNI_CLASS(Service,
"android/app/Service");
241#define QT_DECLARE_JNI_CLASS_STANDARD_TYPES