File indexing completed on 2024-06-23 05:08:44
0001 /* 0002 SPDX-FileCopyrightText: 2019 Volker Krause <vkrause@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #ifndef KANDROIDEXTRAS_JNITYPES_H 0008 #define KANDROIDEXTRAS_JNITYPES_H 0009 0010 #include "jnipp.h" 0011 0012 /** C++/Android integration utilities built on top of @c QJniObject. */ 0013 namespace KAndroidExtras { 0014 0015 ///@cond internal 0016 0017 // preprocessor "iteration" for regular classes 0018 #define JNI_TYPE_1(name, type, ...) \ 0019 struct type { static constexpr const char* jniName() { return name #type; } }; 0020 #define JNI_TYPE_2(name, type, ...) \ 0021 namespace type { JNI_TYPE_1(name #type "/", __VA_ARGS__) } 0022 #define JNI_TYPE_3(name, type, ...) \ 0023 namespace type { JNI_TYPE_2(name #type "/", __VA_ARGS__) } 0024 #define JNI_TYPE_4(name, type, ...) \ 0025 namespace type { JNI_TYPE_3(name #type "/", __VA_ARGS__) } 0026 #define JNI_TYPE_5(name, type, ...) \ 0027 namespace type { JNI_TYPE_4(name #type "/", __VA_ARGS__) } 0028 #define JNI_TYPE_6(name, type, ...) \ 0029 namespace type { JNI_TYPE_5(name #type "/", __VA_ARGS__) } 0030 #define JNI_TYPE_7(name, type, ...) \ 0031 namespace type { JNI_TYPE_6(#type "/", __VA_ARGS__) } 0032 #define JNI_TYPE_(N, name, ...) JNI_PP_CONCAT(JNI_TYPE_, N)(name, __VA_ARGS__) 0033 0034 // preprocessor "iteration" for nested classes 0035 #define JNI_NESTED_TYPE_2(name, type, nested_type, ...) \ 0036 struct type ## _ ## nested_type { static constexpr const char* jniName() { return name #type "$" #nested_type; } }; 0037 #define JNI_NESTED_TYPE_3(name, type, ...) \ 0038 namespace type { JNI_NESTED_TYPE_2(name #type "/", __VA_ARGS__) } 0039 #define JNI_NESTED_TYPE_4(name, type, ...) \ 0040 namespace type { JNI_NESTED_TYPE_3(name #type "/", __VA_ARGS__) } 0041 #define JNI_NESTED_TYPE_5(name, type, ...) \ 0042 namespace type { JNI_NESTED_TYPE_4(name #type "/", __VA_ARGS__) } 0043 #define JNI_NESTED_TYPE_6(name, type, ...) \ 0044 namespace type { JNI_NESTED_TYPE_5(name #type "/", __VA_ARGS__) } 0045 #define JNI_NESTED_TYPE_7(name, type, ...) \ 0046 namespace type { JNI_NESTED_TYPE_6(#type "/", __VA_ARGS__) } 0047 #define JNI_NESTED_TYPE_(N, name, ...) JNI_PP_CONCAT(JNI_NESTED_TYPE_, N)(name, __VA_ARGS__) 0048 0049 ///@endcond 0050 0051 /** Macro to define Java types with their corresponding JNI signature strings. */ 0052 #define JNI_TYPE(...) JNI_TYPE_(JNI_PP_NARG(__VA_ARGS__), "", __VA_ARGS__) 0053 0054 /** Macro to define a nested Java class with its corresponding JNI signature string. */ 0055 #define JNI_NESTED_TYPE(...) JNI_NESTED_TYPE_(JNI_PP_NARG(__VA_ARGS__), "", __VA_ARGS__) 0056 0057 /** Functions for interfacing with the Java Native Interface (JNI). */ 0058 namespace Jni 0059 { 0060 /** Returns the JNI type name of the given template argument. */ 0061 template <typename T> inline constexpr const char* typeName() { return T::jniName(); } 0062 } 0063 0064 } 0065 0066 #endif // KANDROIDEXTRAS_JNITYPES_H