1 // Copyright 2024 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef _JNI_ZERO_STUB_CONVERSIONS_H_
6 #define _JNI_ZERO_STUB_CONVERSIONS_H_
7
8 #include <cstdint>
9 #include <map>
10 #include <optional>
11 #include <string>
12 #include <vector>
13
14 #include "third_party/jni_zero/jni_zero.h"
15 #include "third_party/jni_zero/test/sample_for_tests.h"
16
17 // This file contains empty conversion functions needed by the compile tests.
18
19 #define EMPTY_TYPE_CONVERSIONS(T) \
20 template <> \
21 T FromJniType<T>(JNIEnv * env, const JavaRef<jobject>& j_object) { \
22 return {}; \
23 } \
24 template <> \
25 ScopedJavaLocalRef<jobject> ToJniType<T>(JNIEnv * env, const T& input) { \
26 return nullptr; \
27 }
28
29 #define EMPTY_PRIMITIVE_ARRAY_CONVERSIONS(T) \
30 template <> \
31 std::vector<T> FromJniArray<std::vector<T>>( \
32 JNIEnv * env, const JavaRef<jobject>& j_object) { \
33 return {}; \
34 } \
35 template <> \
36 ScopedJavaLocalRef<jarray> ToJniArray<std::vector<T>>( \
37 JNIEnv * env, const std::vector<T>& vec) { \
38 return nullptr; \
39 }
40
41 #define EMPTY_OBJECT_ARRAY_CONVERSIONS(T) \
42 template <> \
43 std::vector<T> FromJniArray<std::vector<T>>( \
44 JNIEnv * env, const JavaRef<jobject>& j_object) { \
45 return {}; \
46 } \
47 template <> \
48 ScopedJavaLocalRef<jobjectArray> ToJniArray<std::vector<T>>( \
49 JNIEnv * env, const std::vector<T>& vec, jclass clazz) { \
50 return nullptr; \
51 }
52
53 #define EMPTY_LIST_CONVERSIONS(T) \
54 template <> \
55 ScopedJavaLocalRef<jobject> ToJniList<std::vector<T>>( \
56 JNIEnv * env, const std::vector<T>& vec) { \
57 return nullptr; \
58 }
59
60 #define EMPTY_COLLECTION_CONVERSIONS(T) \
61 template <> \
62 std::vector<T> FromJniCollection<std::vector<T>>( \
63 JNIEnv * env, const JavaRef<jobject>& j_object) { \
64 return {}; \
65 }
66
67 namespace jni_zero {
68
69 // These conversion functions are normally provided by the embedding app.
70 EMPTY_TYPE_CONVERSIONS(tests::CPPClass)
EMPTY_TYPE_CONVERSIONS(std::string)71 EMPTY_TYPE_CONVERSIONS(std::string)
72 EMPTY_TYPE_CONVERSIONS(std::u16string)
73 EMPTY_TYPE_CONVERSIONS(std::optional<std::string>)
74 template <>
75 ScopedJavaLocalRef<jobject> ToJniType<const char>(JNIEnv* env,
76 const char* input) {
77 return {};
78 }
79
80 template <>
81 tests::CPPClass* FromJniType<tests::CPPClass*>(JNIEnv* env,
82 const JavaRef<jobject>& j_obj) {
83 return nullptr;
84 }
85
86 // If concepts are unavailable, we need these stubs to replace
87 // default_conversions.h/cc
88 #ifndef JNI_ZERO_ENABLE_TYPE_CONVERSIONS
89 EMPTY_PRIMITIVE_ARRAY_CONVERSIONS(int64_t)
EMPTY_PRIMITIVE_ARRAY_CONVERSIONS(int32_t)90 EMPTY_PRIMITIVE_ARRAY_CONVERSIONS(int32_t)
91 EMPTY_PRIMITIVE_ARRAY_CONVERSIONS(int16_t)
92 EMPTY_PRIMITIVE_ARRAY_CONVERSIONS(uint16_t)
93 EMPTY_PRIMITIVE_ARRAY_CONVERSIONS(uint8_t)
94 EMPTY_PRIMITIVE_ARRAY_CONVERSIONS(float)
95 EMPTY_PRIMITIVE_ARRAY_CONVERSIONS(double)
96 EMPTY_PRIMITIVE_ARRAY_CONVERSIONS(bool)
97
98 EMPTY_OBJECT_ARRAY_CONVERSIONS(const char*)
99 EMPTY_OBJECT_ARRAY_CONVERSIONS(std::string)
100 EMPTY_OBJECT_ARRAY_CONVERSIONS(ScopedJavaLocalRef<jobject>)
101 EMPTY_OBJECT_ARRAY_CONVERSIONS(tests::CPPClass)
102
103 EMPTY_LIST_CONVERSIONS(std::string)
104 EMPTY_LIST_CONVERSIONS(ScopedJavaLocalRef<jobject>)
105
106 EMPTY_COLLECTION_CONVERSIONS(std::string)
107 EMPTY_COLLECTION_CONVERSIONS(ScopedJavaLocalRef<jobject>)
108
109 template <>
110 std::map<std::string, std::string>
111 FromJniType<std::map<std::string, std::string>>(JNIEnv* env,
112 const JavaRef<jobject>& input) {
113 return {};
114 }
115 template <>
116 ScopedJavaLocalRef<jobject> ToJniType<std::map<std::string, std::string>>(
117 JNIEnv* env,
118 const std::map<std::string, std::string>& input) {
119 return {};
120 }
121
122 template <>
123 inline ByteArrayView FromJniArray<ByteArrayView>(
124 JNIEnv* env,
125 const JavaRef<jobject>& j_object) {
126 return ByteArrayView(env, nullptr);
127 }
128 #endif // #ifndef JNI_ZERO_ENABLE_TYPE_CONVERSIONS
129
130 } // namespace jni_zero
131 #endif
132