xref: /aosp_15_r20/external/cronet/base/android/jni_array.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_ANDROID_JNI_ARRAY_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_ANDROID_JNI_ARRAY_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <jni.h>
9*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
10*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
11*6777b538SAndroid Build Coastguard Worker #include <ostream>
12*6777b538SAndroid Build Coastguard Worker #include <string>
13*6777b538SAndroid Build Coastguard Worker #include <vector>
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker #include "base/android/scoped_java_ref.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/check_op.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h"
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker namespace base::android {
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker // As |GetArrayLength| makes no guarantees about the returned value (e.g., it
22*6777b538SAndroid Build Coastguard Worker // may be -1 if |array| is not a valid Java array), provide a safe wrapper
23*6777b538SAndroid Build Coastguard Worker // that always returns a valid, non-negative size.
24*6777b538SAndroid Build Coastguard Worker // Returns the length of Java array.
25*6777b538SAndroid Build Coastguard Worker template <typename JavaArrayType>
SafeGetArrayLength(JNIEnv * env,const JavaRef<JavaArrayType> & jarray)26*6777b538SAndroid Build Coastguard Worker BASE_EXPORT size_t SafeGetArrayLength(JNIEnv* env,
27*6777b538SAndroid Build Coastguard Worker                                       const JavaRef<JavaArrayType>& jarray) {
28*6777b538SAndroid Build Coastguard Worker   DCHECK(jarray);
29*6777b538SAndroid Build Coastguard Worker   jsize length = env->GetArrayLength(jarray.obj());
30*6777b538SAndroid Build Coastguard Worker   DCHECK_GE(length, 0) << "Invalid array length: " << length;
31*6777b538SAndroid Build Coastguard Worker   return static_cast<size_t>(std::max(0, length));
32*6777b538SAndroid Build Coastguard Worker }
33*6777b538SAndroid Build Coastguard Worker 
34*6777b538SAndroid Build Coastguard Worker // Returns a new Java byte array converted from the given bytes array.
35*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jbyteArray> ToJavaByteArray(JNIEnv* env,
36*6777b538SAndroid Build Coastguard Worker                                                            const uint8_t* bytes,
37*6777b538SAndroid Build Coastguard Worker                                                            size_t len);
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jbyteArray> ToJavaByteArray(
40*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
41*6777b538SAndroid Build Coastguard Worker     base::span<const uint8_t> bytes);
42*6777b538SAndroid Build Coastguard Worker 
43*6777b538SAndroid Build Coastguard Worker // Returns a new Java byte array converted from the given string. No UTF-8
44*6777b538SAndroid Build Coastguard Worker // conversion is performed.
45*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jbyteArray> ToJavaByteArray(
46*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
47*6777b538SAndroid Build Coastguard Worker     const std::string& str);
48*6777b538SAndroid Build Coastguard Worker 
49*6777b538SAndroid Build Coastguard Worker // Returns a new Java boolean array converted from the given bool array.
50*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jbooleanArray>
51*6777b538SAndroid Build Coastguard Worker ToJavaBooleanArray(JNIEnv* env, const bool* bools, size_t len);
52*6777b538SAndroid Build Coastguard Worker 
53*6777b538SAndroid Build Coastguard Worker // Returns a new Java int array converted from the given int array.
54*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jintArray> ToJavaIntArray(
55*6777b538SAndroid Build Coastguard Worker     JNIEnv* env, const int* ints, size_t len);
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jintArray> ToJavaIntArray(
58*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
59*6777b538SAndroid Build Coastguard Worker     base::span<const int> ints);
60*6777b538SAndroid Build Coastguard Worker 
61*6777b538SAndroid Build Coastguard Worker // Returns a new Java long array converted from the given int64_t array.
62*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jlongArray> ToJavaLongArray(JNIEnv* env,
63*6777b538SAndroid Build Coastguard Worker                                                            const int64_t* longs,
64*6777b538SAndroid Build Coastguard Worker                                                            size_t len);
65*6777b538SAndroid Build Coastguard Worker 
66*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jlongArray> ToJavaLongArray(
67*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
68*6777b538SAndroid Build Coastguard Worker     base::span<const int64_t> longs);
69*6777b538SAndroid Build Coastguard Worker 
70*6777b538SAndroid Build Coastguard Worker // Returns a new Java float array converted from the given C++ float array.
71*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jfloatArray> ToJavaFloatArray(
72*6777b538SAndroid Build Coastguard Worker     JNIEnv* env, const float* floats, size_t len);
73*6777b538SAndroid Build Coastguard Worker 
74*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jfloatArray> ToJavaFloatArray(
75*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
76*6777b538SAndroid Build Coastguard Worker     base::span<const float> floats);
77*6777b538SAndroid Build Coastguard Worker 
78*6777b538SAndroid Build Coastguard Worker // Returns a new Java double array converted from the given C++ double array.
79*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jdoubleArray>
80*6777b538SAndroid Build Coastguard Worker ToJavaDoubleArray(JNIEnv* env, const double* doubles, size_t len);
81*6777b538SAndroid Build Coastguard Worker 
82*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jdoubleArray> ToJavaDoubleArray(
83*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
84*6777b538SAndroid Build Coastguard Worker     base::span<const double> doubles);
85*6777b538SAndroid Build Coastguard Worker 
86*6777b538SAndroid Build Coastguard Worker // Returns a new clazz[] with the content of |v|.
87*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfObjects(
88*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
89*6777b538SAndroid Build Coastguard Worker     jclass clazz,
90*6777b538SAndroid Build Coastguard Worker     base::span<const ScopedJavaLocalRef<jobject>> v);
91*6777b538SAndroid Build Coastguard Worker 
92*6777b538SAndroid Build Coastguard Worker // Returns a new Object[] with the content of |v|.
93*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfObjects(
94*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
95*6777b538SAndroid Build Coastguard Worker     base::span<const ScopedJavaLocalRef<jobject>> v);
96*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfObjects(
97*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
98*6777b538SAndroid Build Coastguard Worker     base::span<const ScopedJavaGlobalRef<jobject>> v);
99*6777b538SAndroid Build Coastguard Worker 
100*6777b538SAndroid Build Coastguard Worker // Returns a new Type[] with the content of |v|.
101*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToTypedJavaArrayOfObjects(
102*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
103*6777b538SAndroid Build Coastguard Worker     base::span<const ScopedJavaLocalRef<jobject>> v,
104*6777b538SAndroid Build Coastguard Worker     jclass type);
105*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToTypedJavaArrayOfObjects(
106*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
107*6777b538SAndroid Build Coastguard Worker     base::span<const ScopedJavaGlobalRef<jobject>> v,
108*6777b538SAndroid Build Coastguard Worker     jclass type);
109*6777b538SAndroid Build Coastguard Worker 
110*6777b538SAndroid Build Coastguard Worker // Returns a array of Java byte array converted from |v|.
111*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfByteArray(
112*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
113*6777b538SAndroid Build Coastguard Worker     base::span<const std::string> v);
114*6777b538SAndroid Build Coastguard Worker 
115*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfByteArray(
116*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
117*6777b538SAndroid Build Coastguard Worker     base::span<const std::vector<uint8_t>> v);
118*6777b538SAndroid Build Coastguard Worker 
119*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStrings(
120*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
121*6777b538SAndroid Build Coastguard Worker     base::span<const std::string> v);
122*6777b538SAndroid Build Coastguard Worker 
123*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStrings(
124*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
125*6777b538SAndroid Build Coastguard Worker     base::span<const std::u16string> v);
126*6777b538SAndroid Build Coastguard Worker 
127*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStringArray(
128*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
129*6777b538SAndroid Build Coastguard Worker     base::span<const std::vector<std::string>> v);
130*6777b538SAndroid Build Coastguard Worker 
131*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStringArray(
132*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
133*6777b538SAndroid Build Coastguard Worker     base::span<const std::vector<std::u16string>> v);
134*6777b538SAndroid Build Coastguard Worker 
135*6777b538SAndroid Build Coastguard Worker // Converts a Java string array to a native array.
136*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void AppendJavaStringArrayToStringVector(
137*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
138*6777b538SAndroid Build Coastguard Worker     const JavaRef<jobjectArray>& array,
139*6777b538SAndroid Build Coastguard Worker     std::vector<std::u16string>* out);
140*6777b538SAndroid Build Coastguard Worker 
141*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void AppendJavaStringArrayToStringVector(
142*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
143*6777b538SAndroid Build Coastguard Worker     const JavaRef<jobjectArray>& array,
144*6777b538SAndroid Build Coastguard Worker     std::vector<std::string>* out);
145*6777b538SAndroid Build Coastguard Worker 
146*6777b538SAndroid Build Coastguard Worker // Appends the Java bytes in |bytes_array| onto the end of |out|.
147*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void AppendJavaByteArrayToByteVector(
148*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
149*6777b538SAndroid Build Coastguard Worker     const JavaRef<jbyteArray>& byte_array,
150*6777b538SAndroid Build Coastguard Worker     std::vector<uint8_t>* out);
151*6777b538SAndroid Build Coastguard Worker 
152*6777b538SAndroid Build Coastguard Worker // Replaces the content of |out| with the Java bytes in |byte_array|.
153*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void JavaByteArrayToByteVector(
154*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
155*6777b538SAndroid Build Coastguard Worker     const JavaRef<jbyteArray>& byte_array,
156*6777b538SAndroid Build Coastguard Worker     std::vector<uint8_t>* out);
157*6777b538SAndroid Build Coastguard Worker 
158*6777b538SAndroid Build Coastguard Worker // Copy the contents of java |byte_array| into |dest|. The span must be larger
159*6777b538SAndroid Build Coastguard Worker // than or equal to the array.
160*6777b538SAndroid Build Coastguard Worker // Returns the number of bytes copied.
161*6777b538SAndroid Build Coastguard Worker BASE_EXPORT size_t
162*6777b538SAndroid Build Coastguard Worker JavaByteArrayToByteSpan(JNIEnv* env,
163*6777b538SAndroid Build Coastguard Worker                         const JavaRef<jbyteArray>& byte_array,
164*6777b538SAndroid Build Coastguard Worker                         base::span<uint8_t> dest);
165*6777b538SAndroid Build Coastguard Worker 
166*6777b538SAndroid Build Coastguard Worker // Replaces the content of |out| with the Java bytes in |byte_array|. No UTF-8
167*6777b538SAndroid Build Coastguard Worker // conversion is performed.
168*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void JavaByteArrayToString(JNIEnv* env,
169*6777b538SAndroid Build Coastguard Worker                                        const JavaRef<jbyteArray>& byte_array,
170*6777b538SAndroid Build Coastguard Worker                                        std::string* out);
171*6777b538SAndroid Build Coastguard Worker 
172*6777b538SAndroid Build Coastguard Worker // Replaces the content of |out| with the Java booleans in |boolean_array|.
173*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void JavaBooleanArrayToBoolVector(
174*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
175*6777b538SAndroid Build Coastguard Worker     const JavaRef<jbooleanArray>& boolean_array,
176*6777b538SAndroid Build Coastguard Worker     std::vector<bool>* out);
177*6777b538SAndroid Build Coastguard Worker 
178*6777b538SAndroid Build Coastguard Worker // Replaces the content of |out| with the Java ints in |int_array|.
179*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void JavaIntArrayToIntVector(JNIEnv* env,
180*6777b538SAndroid Build Coastguard Worker                                          const JavaRef<jintArray>& int_array,
181*6777b538SAndroid Build Coastguard Worker                                          std::vector<int>* out);
182*6777b538SAndroid Build Coastguard Worker 
183*6777b538SAndroid Build Coastguard Worker // Replaces the content of |out| with the Java longs in |long_array|.
184*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void JavaLongArrayToInt64Vector(
185*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
186*6777b538SAndroid Build Coastguard Worker     const JavaRef<jlongArray>& long_array,
187*6777b538SAndroid Build Coastguard Worker     std::vector<int64_t>* out);
188*6777b538SAndroid Build Coastguard Worker 
189*6777b538SAndroid Build Coastguard Worker // Replaces the content of |out| with the Java longs in |long_array|.
190*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void JavaLongArrayToLongVector(
191*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
192*6777b538SAndroid Build Coastguard Worker     const JavaRef<jlongArray>& long_array,
193*6777b538SAndroid Build Coastguard Worker     std::vector<jlong>* out);
194*6777b538SAndroid Build Coastguard Worker 
195*6777b538SAndroid Build Coastguard Worker // Replaces the content of |out| with the Java floats in |float_array|.
196*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void JavaFloatArrayToFloatVector(
197*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
198*6777b538SAndroid Build Coastguard Worker     const JavaRef<jfloatArray>& float_array,
199*6777b538SAndroid Build Coastguard Worker     std::vector<float>* out);
200*6777b538SAndroid Build Coastguard Worker 
201*6777b538SAndroid Build Coastguard Worker // Replaces the content of |out| with the Java doubles in |double_array|.
202*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void JavaDoubleArrayToDoubleVector(
203*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
204*6777b538SAndroid Build Coastguard Worker     const JavaRef<jdoubleArray>& double_array,
205*6777b538SAndroid Build Coastguard Worker     std::vector<double>* out);
206*6777b538SAndroid Build Coastguard Worker 
207*6777b538SAndroid Build Coastguard Worker // Assuming |array| is an byte[][] (array of byte arrays), replaces the
208*6777b538SAndroid Build Coastguard Worker // content of |out| with the corresponding vector of strings. No UTF-8
209*6777b538SAndroid Build Coastguard Worker // conversion is performed.
210*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void JavaArrayOfByteArrayToStringVector(
211*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
212*6777b538SAndroid Build Coastguard Worker     const JavaRef<jobjectArray>& array,
213*6777b538SAndroid Build Coastguard Worker     std::vector<std::string>* out);
214*6777b538SAndroid Build Coastguard Worker 
215*6777b538SAndroid Build Coastguard Worker // Assuming |array| is an byte[][] (array of byte arrays), replaces the
216*6777b538SAndroid Build Coastguard Worker // content of |out| with the corresponding vector of vector of uint8. No UTF-8
217*6777b538SAndroid Build Coastguard Worker // conversion is performed.
218*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void JavaArrayOfByteArrayToBytesVector(
219*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
220*6777b538SAndroid Build Coastguard Worker     const JavaRef<jobjectArray>& array,
221*6777b538SAndroid Build Coastguard Worker     std::vector<std::vector<uint8_t>>* out);
222*6777b538SAndroid Build Coastguard Worker 
223*6777b538SAndroid Build Coastguard Worker // Assuming |array| is an String[][] (array of String arrays), replaces the
224*6777b538SAndroid Build Coastguard Worker // content of |out| with the corresponding vector of string vectors.
225*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void Java2dStringArrayTo2dStringVector(
226*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
227*6777b538SAndroid Build Coastguard Worker     const JavaRef<jobjectArray>& array,
228*6777b538SAndroid Build Coastguard Worker     std::vector<std::vector<std::string>>* out);
229*6777b538SAndroid Build Coastguard Worker 
230*6777b538SAndroid Build Coastguard Worker // Assuming |array| is an String[][] (array of String arrays), replaces the
231*6777b538SAndroid Build Coastguard Worker // content of |out| with the corresponding vector of string vectors. No UTF-8
232*6777b538SAndroid Build Coastguard Worker // conversion is performed.
233*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void Java2dStringArrayTo2dStringVector(
234*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
235*6777b538SAndroid Build Coastguard Worker     const JavaRef<jobjectArray>& array,
236*6777b538SAndroid Build Coastguard Worker     std::vector<std::vector<std::u16string>>* out);
237*6777b538SAndroid Build Coastguard Worker 
238*6777b538SAndroid Build Coastguard Worker // Assuming |array| is an int[][] (array of int arrays), replaces the
239*6777b538SAndroid Build Coastguard Worker // contents of |out| with the corresponding vectors of ints.
240*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void JavaArrayOfIntArrayToIntVector(
241*6777b538SAndroid Build Coastguard Worker     JNIEnv* env,
242*6777b538SAndroid Build Coastguard Worker     const JavaRef<jobjectArray>& array,
243*6777b538SAndroid Build Coastguard Worker     std::vector<std::vector<int>>* out);
244*6777b538SAndroid Build Coastguard Worker 
245*6777b538SAndroid Build Coastguard Worker }  // namespace base::android
246*6777b538SAndroid Build Coastguard Worker 
247*6777b538SAndroid Build Coastguard Worker #endif  // BASE_ANDROID_JNI_ARRAY_H_
248