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