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 #include "base/android/jni_array.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include "base/android/jni_android.h"
8*6777b538SAndroid Build Coastguard Worker #include "base/android/jni_string.h"
9*6777b538SAndroid Build Coastguard Worker #include "base/check_op.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/numerics/safe_conversions.h"
11*6777b538SAndroid Build Coastguard Worker
12*6777b538SAndroid Build Coastguard Worker namespace base::android {
13*6777b538SAndroid Build Coastguard Worker
ToJavaByteArray(JNIEnv * env,const uint8_t * bytes,size_t len)14*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jbyteArray> ToJavaByteArray(JNIEnv* env,
15*6777b538SAndroid Build Coastguard Worker const uint8_t* bytes,
16*6777b538SAndroid Build Coastguard Worker size_t len) {
17*6777b538SAndroid Build Coastguard Worker const jsize len_jsize = checked_cast<jsize>(len);
18*6777b538SAndroid Build Coastguard Worker jbyteArray byte_array = env->NewByteArray(len_jsize);
19*6777b538SAndroid Build Coastguard Worker CheckException(env);
20*6777b538SAndroid Build Coastguard Worker DCHECK(byte_array);
21*6777b538SAndroid Build Coastguard Worker
22*6777b538SAndroid Build Coastguard Worker env->SetByteArrayRegion(byte_array, 0, len_jsize,
23*6777b538SAndroid Build Coastguard Worker reinterpret_cast<const jbyte*>(bytes));
24*6777b538SAndroid Build Coastguard Worker CheckException(env);
25*6777b538SAndroid Build Coastguard Worker
26*6777b538SAndroid Build Coastguard Worker return ScopedJavaLocalRef<jbyteArray>(env, byte_array);
27*6777b538SAndroid Build Coastguard Worker }
28*6777b538SAndroid Build Coastguard Worker
ToJavaByteArray(JNIEnv * env,base::span<const uint8_t> bytes)29*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jbyteArray> ToJavaByteArray(
30*6777b538SAndroid Build Coastguard Worker JNIEnv* env,
31*6777b538SAndroid Build Coastguard Worker base::span<const uint8_t> bytes) {
32*6777b538SAndroid Build Coastguard Worker return ToJavaByteArray(env, bytes.data(), bytes.size());
33*6777b538SAndroid Build Coastguard Worker }
34*6777b538SAndroid Build Coastguard Worker
ToJavaByteArray(JNIEnv * env,const std::string & str)35*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jbyteArray> ToJavaByteArray(JNIEnv* env,
36*6777b538SAndroid Build Coastguard Worker const std::string& str) {
37*6777b538SAndroid Build Coastguard Worker return ToJavaByteArray(env, base::as_byte_span(str));
38*6777b538SAndroid Build Coastguard Worker }
39*6777b538SAndroid Build Coastguard Worker
ToJavaBooleanArray(JNIEnv * env,const bool * bools,size_t len)40*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jbooleanArray> ToJavaBooleanArray(JNIEnv* env,
41*6777b538SAndroid Build Coastguard Worker const bool* bools,
42*6777b538SAndroid Build Coastguard Worker size_t len) {
43*6777b538SAndroid Build Coastguard Worker const jsize len_jsize = checked_cast<jsize>(len);
44*6777b538SAndroid Build Coastguard Worker jbooleanArray boolean_array = env->NewBooleanArray(len_jsize);
45*6777b538SAndroid Build Coastguard Worker CheckException(env);
46*6777b538SAndroid Build Coastguard Worker DCHECK(boolean_array);
47*6777b538SAndroid Build Coastguard Worker
48*6777b538SAndroid Build Coastguard Worker env->SetBooleanArrayRegion(boolean_array, 0, len_jsize,
49*6777b538SAndroid Build Coastguard Worker reinterpret_cast<const jboolean*>(bools));
50*6777b538SAndroid Build Coastguard Worker CheckException(env);
51*6777b538SAndroid Build Coastguard Worker
52*6777b538SAndroid Build Coastguard Worker return ScopedJavaLocalRef<jbooleanArray>(env, boolean_array);
53*6777b538SAndroid Build Coastguard Worker }
54*6777b538SAndroid Build Coastguard Worker
ToJavaIntArray(JNIEnv * env,const int * ints,size_t len)55*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jintArray> ToJavaIntArray(JNIEnv* env,
56*6777b538SAndroid Build Coastguard Worker const int* ints,
57*6777b538SAndroid Build Coastguard Worker size_t len) {
58*6777b538SAndroid Build Coastguard Worker const jsize len_jsize = checked_cast<jsize>(len);
59*6777b538SAndroid Build Coastguard Worker jintArray int_array = env->NewIntArray(len_jsize);
60*6777b538SAndroid Build Coastguard Worker CheckException(env);
61*6777b538SAndroid Build Coastguard Worker DCHECK(int_array);
62*6777b538SAndroid Build Coastguard Worker
63*6777b538SAndroid Build Coastguard Worker env->SetIntArrayRegion(int_array, 0, len_jsize,
64*6777b538SAndroid Build Coastguard Worker reinterpret_cast<const jint*>(ints));
65*6777b538SAndroid Build Coastguard Worker CheckException(env);
66*6777b538SAndroid Build Coastguard Worker
67*6777b538SAndroid Build Coastguard Worker return ScopedJavaLocalRef<jintArray>(env, int_array);
68*6777b538SAndroid Build Coastguard Worker }
69*6777b538SAndroid Build Coastguard Worker
ToJavaIntArray(JNIEnv * env,base::span<const int> ints)70*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jintArray> ToJavaIntArray(JNIEnv* env,
71*6777b538SAndroid Build Coastguard Worker base::span<const int> ints) {
72*6777b538SAndroid Build Coastguard Worker return ToJavaIntArray(env, ints.data(), ints.size());
73*6777b538SAndroid Build Coastguard Worker }
74*6777b538SAndroid Build Coastguard Worker
ToJavaLongArray(JNIEnv * env,const int64_t * longs,size_t len)75*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jlongArray> ToJavaLongArray(JNIEnv* env,
76*6777b538SAndroid Build Coastguard Worker const int64_t* longs,
77*6777b538SAndroid Build Coastguard Worker size_t len) {
78*6777b538SAndroid Build Coastguard Worker const jsize len_jsize = checked_cast<jsize>(len);
79*6777b538SAndroid Build Coastguard Worker jlongArray long_array = env->NewLongArray(len_jsize);
80*6777b538SAndroid Build Coastguard Worker CheckException(env);
81*6777b538SAndroid Build Coastguard Worker DCHECK(long_array);
82*6777b538SAndroid Build Coastguard Worker
83*6777b538SAndroid Build Coastguard Worker env->SetLongArrayRegion(long_array, 0, len_jsize,
84*6777b538SAndroid Build Coastguard Worker reinterpret_cast<const jlong*>(longs));
85*6777b538SAndroid Build Coastguard Worker CheckException(env);
86*6777b538SAndroid Build Coastguard Worker
87*6777b538SAndroid Build Coastguard Worker return ScopedJavaLocalRef<jlongArray>(env, long_array);
88*6777b538SAndroid Build Coastguard Worker }
89*6777b538SAndroid Build Coastguard Worker
90*6777b538SAndroid Build Coastguard Worker // Returns a new Java long array converted from the given int64_t array.
ToJavaLongArray(JNIEnv * env,base::span<const int64_t> longs)91*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jlongArray> ToJavaLongArray(
92*6777b538SAndroid Build Coastguard Worker JNIEnv* env,
93*6777b538SAndroid Build Coastguard Worker base::span<const int64_t> longs) {
94*6777b538SAndroid Build Coastguard Worker return ToJavaLongArray(env, longs.data(), longs.size());
95*6777b538SAndroid Build Coastguard Worker }
96*6777b538SAndroid Build Coastguard Worker
97*6777b538SAndroid Build Coastguard Worker // Returns a new Java float array converted from the given C++ float array.
98*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jfloatArray>
ToJavaFloatArray(JNIEnv * env,const float * floats,size_t len)99*6777b538SAndroid Build Coastguard Worker ToJavaFloatArray(JNIEnv* env, const float* floats, size_t len) {
100*6777b538SAndroid Build Coastguard Worker const jsize len_jsize = checked_cast<jsize>(len);
101*6777b538SAndroid Build Coastguard Worker jfloatArray float_array = env->NewFloatArray(len_jsize);
102*6777b538SAndroid Build Coastguard Worker CheckException(env);
103*6777b538SAndroid Build Coastguard Worker DCHECK(float_array);
104*6777b538SAndroid Build Coastguard Worker
105*6777b538SAndroid Build Coastguard Worker env->SetFloatArrayRegion(float_array, 0, len_jsize,
106*6777b538SAndroid Build Coastguard Worker reinterpret_cast<const jfloat*>(floats));
107*6777b538SAndroid Build Coastguard Worker CheckException(env);
108*6777b538SAndroid Build Coastguard Worker
109*6777b538SAndroid Build Coastguard Worker return ScopedJavaLocalRef<jfloatArray>(env, float_array);
110*6777b538SAndroid Build Coastguard Worker }
111*6777b538SAndroid Build Coastguard Worker
ToJavaFloatArray(JNIEnv * env,base::span<const float> floats)112*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jfloatArray> ToJavaFloatArray(
113*6777b538SAndroid Build Coastguard Worker JNIEnv* env,
114*6777b538SAndroid Build Coastguard Worker base::span<const float> floats) {
115*6777b538SAndroid Build Coastguard Worker return ToJavaFloatArray(env, floats.data(), floats.size());
116*6777b538SAndroid Build Coastguard Worker }
117*6777b538SAndroid Build Coastguard Worker
118*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jdoubleArray>
ToJavaDoubleArray(JNIEnv * env,const double * doubles,size_t len)119*6777b538SAndroid Build Coastguard Worker ToJavaDoubleArray(JNIEnv* env, const double* doubles, size_t len) {
120*6777b538SAndroid Build Coastguard Worker const jsize len_jsize = checked_cast<jsize>(len);
121*6777b538SAndroid Build Coastguard Worker jdoubleArray double_array = env->NewDoubleArray(len_jsize);
122*6777b538SAndroid Build Coastguard Worker CheckException(env);
123*6777b538SAndroid Build Coastguard Worker DCHECK(double_array);
124*6777b538SAndroid Build Coastguard Worker
125*6777b538SAndroid Build Coastguard Worker env->SetDoubleArrayRegion(double_array, 0, len_jsize,
126*6777b538SAndroid Build Coastguard Worker reinterpret_cast<const jdouble*>(doubles));
127*6777b538SAndroid Build Coastguard Worker CheckException(env);
128*6777b538SAndroid Build Coastguard Worker
129*6777b538SAndroid Build Coastguard Worker return ScopedJavaLocalRef<jdoubleArray>(env, double_array);
130*6777b538SAndroid Build Coastguard Worker }
131*6777b538SAndroid Build Coastguard Worker
ToJavaDoubleArray(JNIEnv * env,base::span<const double> doubles)132*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jdoubleArray> ToJavaDoubleArray(
133*6777b538SAndroid Build Coastguard Worker JNIEnv* env,
134*6777b538SAndroid Build Coastguard Worker base::span<const double> doubles) {
135*6777b538SAndroid Build Coastguard Worker return ToJavaDoubleArray(env, doubles.data(), doubles.size());
136*6777b538SAndroid Build Coastguard Worker }
137*6777b538SAndroid Build Coastguard Worker
ToJavaArrayOfObjects(JNIEnv * env,jclass clazz,base::span<const ScopedJavaLocalRef<jobject>> v)138*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfObjects(
139*6777b538SAndroid Build Coastguard Worker JNIEnv* env,
140*6777b538SAndroid Build Coastguard Worker jclass clazz,
141*6777b538SAndroid Build Coastguard Worker base::span<const ScopedJavaLocalRef<jobject>> v) {
142*6777b538SAndroid Build Coastguard Worker jobjectArray joa =
143*6777b538SAndroid Build Coastguard Worker env->NewObjectArray(checked_cast<jsize>(v.size()), clazz, nullptr);
144*6777b538SAndroid Build Coastguard Worker CheckException(env);
145*6777b538SAndroid Build Coastguard Worker
146*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < v.size(); ++i) {
147*6777b538SAndroid Build Coastguard Worker env->SetObjectArrayElement(joa, static_cast<jsize>(i), v[i].obj());
148*6777b538SAndroid Build Coastguard Worker }
149*6777b538SAndroid Build Coastguard Worker return ScopedJavaLocalRef<jobjectArray>(env, joa);
150*6777b538SAndroid Build Coastguard Worker }
151*6777b538SAndroid Build Coastguard Worker
ToJavaArrayOfObjects(JNIEnv * env,base::span<const ScopedJavaLocalRef<jobject>> v)152*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfObjects(
153*6777b538SAndroid Build Coastguard Worker JNIEnv* env,
154*6777b538SAndroid Build Coastguard Worker base::span<const ScopedJavaLocalRef<jobject>> v) {
155*6777b538SAndroid Build Coastguard Worker return ToJavaArrayOfObjects(env, jni_zero::g_object_class, v);
156*6777b538SAndroid Build Coastguard Worker }
157*6777b538SAndroid Build Coastguard Worker
ToJavaArrayOfObjects(JNIEnv * env,base::span<const ScopedJavaGlobalRef<jobject>> v)158*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfObjects(
159*6777b538SAndroid Build Coastguard Worker JNIEnv* env,
160*6777b538SAndroid Build Coastguard Worker base::span<const ScopedJavaGlobalRef<jobject>> v) {
161*6777b538SAndroid Build Coastguard Worker jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(v.size()),
162*6777b538SAndroid Build Coastguard Worker jni_zero::g_object_class, nullptr);
163*6777b538SAndroid Build Coastguard Worker CheckException(env);
164*6777b538SAndroid Build Coastguard Worker
165*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < v.size(); ++i) {
166*6777b538SAndroid Build Coastguard Worker env->SetObjectArrayElement(joa, static_cast<jsize>(i), v[i].obj());
167*6777b538SAndroid Build Coastguard Worker }
168*6777b538SAndroid Build Coastguard Worker return ScopedJavaLocalRef<jobjectArray>(env, joa);
169*6777b538SAndroid Build Coastguard Worker }
170*6777b538SAndroid Build Coastguard Worker
ToTypedJavaArrayOfObjects(JNIEnv * env,base::span<const ScopedJavaLocalRef<jobject>> v,jclass type)171*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToTypedJavaArrayOfObjects(
172*6777b538SAndroid Build Coastguard Worker JNIEnv* env,
173*6777b538SAndroid Build Coastguard Worker base::span<const ScopedJavaLocalRef<jobject>> v,
174*6777b538SAndroid Build Coastguard Worker jclass type) {
175*6777b538SAndroid Build Coastguard Worker jobjectArray joa =
176*6777b538SAndroid Build Coastguard Worker env->NewObjectArray(checked_cast<jsize>(v.size()), type, nullptr);
177*6777b538SAndroid Build Coastguard Worker CheckException(env);
178*6777b538SAndroid Build Coastguard Worker
179*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < v.size(); ++i) {
180*6777b538SAndroid Build Coastguard Worker env->SetObjectArrayElement(joa, static_cast<jsize>(i), v[i].obj());
181*6777b538SAndroid Build Coastguard Worker }
182*6777b538SAndroid Build Coastguard Worker return ScopedJavaLocalRef<jobjectArray>(env, joa);
183*6777b538SAndroid Build Coastguard Worker }
184*6777b538SAndroid Build Coastguard Worker
ToTypedJavaArrayOfObjects(JNIEnv * env,base::span<const ScopedJavaGlobalRef<jobject>> v,jclass type)185*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToTypedJavaArrayOfObjects(
186*6777b538SAndroid Build Coastguard Worker JNIEnv* env,
187*6777b538SAndroid Build Coastguard Worker base::span<const ScopedJavaGlobalRef<jobject>> v,
188*6777b538SAndroid Build Coastguard Worker jclass type) {
189*6777b538SAndroid Build Coastguard Worker jobjectArray joa =
190*6777b538SAndroid Build Coastguard Worker env->NewObjectArray(checked_cast<jsize>(v.size()), type, nullptr);
191*6777b538SAndroid Build Coastguard Worker CheckException(env);
192*6777b538SAndroid Build Coastguard Worker
193*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < v.size(); ++i) {
194*6777b538SAndroid Build Coastguard Worker env->SetObjectArrayElement(joa, static_cast<jsize>(i), v[i].obj());
195*6777b538SAndroid Build Coastguard Worker }
196*6777b538SAndroid Build Coastguard Worker return ScopedJavaLocalRef<jobjectArray>(env, joa);
197*6777b538SAndroid Build Coastguard Worker }
198*6777b538SAndroid Build Coastguard Worker
ToJavaArrayOfByteArray(JNIEnv * env,base::span<const std::string> v)199*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfByteArray(
200*6777b538SAndroid Build Coastguard Worker JNIEnv* env,
201*6777b538SAndroid Build Coastguard Worker base::span<const std::string> v) {
202*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jclass> byte_array_clazz = GetClass(env, "[B");
203*6777b538SAndroid Build Coastguard Worker jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(v.size()),
204*6777b538SAndroid Build Coastguard Worker byte_array_clazz.obj(), nullptr);
205*6777b538SAndroid Build Coastguard Worker CheckException(env);
206*6777b538SAndroid Build Coastguard Worker
207*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < v.size(); ++i) {
208*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jbyteArray> byte_array = ToJavaByteArray(env, v[i]);
209*6777b538SAndroid Build Coastguard Worker env->SetObjectArrayElement(joa, static_cast<jsize>(i), byte_array.obj());
210*6777b538SAndroid Build Coastguard Worker }
211*6777b538SAndroid Build Coastguard Worker return ScopedJavaLocalRef<jobjectArray>(env, joa);
212*6777b538SAndroid Build Coastguard Worker }
213*6777b538SAndroid Build Coastguard Worker
ToJavaArrayOfByteArray(JNIEnv * env,base::span<const std::vector<uint8_t>> v)214*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfByteArray(
215*6777b538SAndroid Build Coastguard Worker JNIEnv* env,
216*6777b538SAndroid Build Coastguard Worker base::span<const std::vector<uint8_t>> v) {
217*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jclass> byte_array_clazz = GetClass(env, "[B");
218*6777b538SAndroid Build Coastguard Worker jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(v.size()),
219*6777b538SAndroid Build Coastguard Worker byte_array_clazz.obj(), nullptr);
220*6777b538SAndroid Build Coastguard Worker CheckException(env);
221*6777b538SAndroid Build Coastguard Worker
222*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < v.size(); ++i) {
223*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jbyteArray> byte_array = ToJavaByteArray(env, v[i]);
224*6777b538SAndroid Build Coastguard Worker env->SetObjectArrayElement(joa, static_cast<jsize>(i), byte_array.obj());
225*6777b538SAndroid Build Coastguard Worker }
226*6777b538SAndroid Build Coastguard Worker return ScopedJavaLocalRef<jobjectArray>(env, joa);
227*6777b538SAndroid Build Coastguard Worker }
228*6777b538SAndroid Build Coastguard Worker
ToJavaArrayOfStrings(JNIEnv * env,base::span<const std::string> v)229*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStrings(
230*6777b538SAndroid Build Coastguard Worker JNIEnv* env,
231*6777b538SAndroid Build Coastguard Worker base::span<const std::string> v) {
232*6777b538SAndroid Build Coastguard Worker jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(v.size()),
233*6777b538SAndroid Build Coastguard Worker jni_zero::g_string_class, nullptr);
234*6777b538SAndroid Build Coastguard Worker CheckException(env);
235*6777b538SAndroid Build Coastguard Worker
236*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < v.size(); ++i) {
237*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jstring> item = ConvertUTF8ToJavaString(env, v[i]);
238*6777b538SAndroid Build Coastguard Worker env->SetObjectArrayElement(joa, static_cast<jsize>(i), item.obj());
239*6777b538SAndroid Build Coastguard Worker }
240*6777b538SAndroid Build Coastguard Worker return ScopedJavaLocalRef<jobjectArray>(env, joa);
241*6777b538SAndroid Build Coastguard Worker }
242*6777b538SAndroid Build Coastguard Worker
ToJavaArrayOfStringArray(JNIEnv * env,base::span<const std::vector<std::string>> vec_outer)243*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStringArray(
244*6777b538SAndroid Build Coastguard Worker JNIEnv* env,
245*6777b538SAndroid Build Coastguard Worker base::span<const std::vector<std::string>> vec_outer) {
246*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jclass> string_array_clazz =
247*6777b538SAndroid Build Coastguard Worker GetClass(env, "[Ljava/lang/String;");
248*6777b538SAndroid Build Coastguard Worker
249*6777b538SAndroid Build Coastguard Worker jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(vec_outer.size()),
250*6777b538SAndroid Build Coastguard Worker string_array_clazz.obj(), nullptr);
251*6777b538SAndroid Build Coastguard Worker CheckException(env);
252*6777b538SAndroid Build Coastguard Worker
253*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < vec_outer.size(); ++i) {
254*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jobjectArray> inner =
255*6777b538SAndroid Build Coastguard Worker ToJavaArrayOfStrings(env, vec_outer[i]);
256*6777b538SAndroid Build Coastguard Worker env->SetObjectArrayElement(joa, static_cast<jsize>(i), inner.obj());
257*6777b538SAndroid Build Coastguard Worker }
258*6777b538SAndroid Build Coastguard Worker
259*6777b538SAndroid Build Coastguard Worker return ScopedJavaLocalRef<jobjectArray>(env, joa);
260*6777b538SAndroid Build Coastguard Worker }
261*6777b538SAndroid Build Coastguard Worker
ToJavaArrayOfStringArray(JNIEnv * env,base::span<const std::vector<std::u16string>> vec_outer)262*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStringArray(
263*6777b538SAndroid Build Coastguard Worker JNIEnv* env,
264*6777b538SAndroid Build Coastguard Worker base::span<const std::vector<std::u16string>> vec_outer) {
265*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jclass> string_array_clazz =
266*6777b538SAndroid Build Coastguard Worker GetClass(env, "[Ljava/lang/String;");
267*6777b538SAndroid Build Coastguard Worker
268*6777b538SAndroid Build Coastguard Worker jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(vec_outer.size()),
269*6777b538SAndroid Build Coastguard Worker string_array_clazz.obj(), nullptr);
270*6777b538SAndroid Build Coastguard Worker CheckException(env);
271*6777b538SAndroid Build Coastguard Worker
272*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < vec_outer.size(); ++i) {
273*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jobjectArray> inner =
274*6777b538SAndroid Build Coastguard Worker ToJavaArrayOfStrings(env, vec_outer[i]);
275*6777b538SAndroid Build Coastguard Worker env->SetObjectArrayElement(joa, static_cast<jsize>(i), inner.obj());
276*6777b538SAndroid Build Coastguard Worker }
277*6777b538SAndroid Build Coastguard Worker
278*6777b538SAndroid Build Coastguard Worker return ScopedJavaLocalRef<jobjectArray>(env, joa);
279*6777b538SAndroid Build Coastguard Worker }
280*6777b538SAndroid Build Coastguard Worker
ToJavaArrayOfStrings(JNIEnv * env,base::span<const std::u16string> v)281*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStrings(
282*6777b538SAndroid Build Coastguard Worker JNIEnv* env,
283*6777b538SAndroid Build Coastguard Worker base::span<const std::u16string> v) {
284*6777b538SAndroid Build Coastguard Worker jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(v.size()),
285*6777b538SAndroid Build Coastguard Worker jni_zero::g_string_class, nullptr);
286*6777b538SAndroid Build Coastguard Worker CheckException(env);
287*6777b538SAndroid Build Coastguard Worker
288*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < v.size(); ++i) {
289*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jstring> item = ConvertUTF16ToJavaString(env, v[i]);
290*6777b538SAndroid Build Coastguard Worker env->SetObjectArrayElement(joa, static_cast<jsize>(i), item.obj());
291*6777b538SAndroid Build Coastguard Worker }
292*6777b538SAndroid Build Coastguard Worker return ScopedJavaLocalRef<jobjectArray>(env, joa);
293*6777b538SAndroid Build Coastguard Worker }
294*6777b538SAndroid Build Coastguard Worker
AppendJavaStringArrayToStringVector(JNIEnv * env,const JavaRef<jobjectArray> & array,std::vector<std::u16string> * out)295*6777b538SAndroid Build Coastguard Worker void AppendJavaStringArrayToStringVector(JNIEnv* env,
296*6777b538SAndroid Build Coastguard Worker const JavaRef<jobjectArray>& array,
297*6777b538SAndroid Build Coastguard Worker std::vector<std::u16string>* out) {
298*6777b538SAndroid Build Coastguard Worker DCHECK(out);
299*6777b538SAndroid Build Coastguard Worker if (!array)
300*6777b538SAndroid Build Coastguard Worker return;
301*6777b538SAndroid Build Coastguard Worker size_t len = SafeGetArrayLength(env, array);
302*6777b538SAndroid Build Coastguard Worker size_t back = out->size();
303*6777b538SAndroid Build Coastguard Worker out->resize(back + len);
304*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < len; ++i) {
305*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jstring> str(
306*6777b538SAndroid Build Coastguard Worker env, static_cast<jstring>(env->GetObjectArrayElement(
307*6777b538SAndroid Build Coastguard Worker array.obj(), static_cast<jsize>(i))));
308*6777b538SAndroid Build Coastguard Worker ConvertJavaStringToUTF16(env, str.obj(), out->data() + back + i);
309*6777b538SAndroid Build Coastguard Worker }
310*6777b538SAndroid Build Coastguard Worker }
311*6777b538SAndroid Build Coastguard Worker
AppendJavaStringArrayToStringVector(JNIEnv * env,const JavaRef<jobjectArray> & array,std::vector<std::string> * out)312*6777b538SAndroid Build Coastguard Worker void AppendJavaStringArrayToStringVector(JNIEnv* env,
313*6777b538SAndroid Build Coastguard Worker const JavaRef<jobjectArray>& array,
314*6777b538SAndroid Build Coastguard Worker std::vector<std::string>* out) {
315*6777b538SAndroid Build Coastguard Worker DCHECK(out);
316*6777b538SAndroid Build Coastguard Worker if (!array)
317*6777b538SAndroid Build Coastguard Worker return;
318*6777b538SAndroid Build Coastguard Worker size_t len = SafeGetArrayLength(env, array);
319*6777b538SAndroid Build Coastguard Worker size_t back = out->size();
320*6777b538SAndroid Build Coastguard Worker out->resize(back + len);
321*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < len; ++i) {
322*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jstring> str(
323*6777b538SAndroid Build Coastguard Worker env, static_cast<jstring>(env->GetObjectArrayElement(
324*6777b538SAndroid Build Coastguard Worker array.obj(), static_cast<jsize>(i))));
325*6777b538SAndroid Build Coastguard Worker ConvertJavaStringToUTF8(env, str.obj(), out->data() + back + i);
326*6777b538SAndroid Build Coastguard Worker }
327*6777b538SAndroid Build Coastguard Worker }
328*6777b538SAndroid Build Coastguard Worker
AppendJavaByteArrayToByteVector(JNIEnv * env,const JavaRef<jbyteArray> & byte_array,std::vector<uint8_t> * out)329*6777b538SAndroid Build Coastguard Worker void AppendJavaByteArrayToByteVector(JNIEnv* env,
330*6777b538SAndroid Build Coastguard Worker const JavaRef<jbyteArray>& byte_array,
331*6777b538SAndroid Build Coastguard Worker std::vector<uint8_t>* out) {
332*6777b538SAndroid Build Coastguard Worker DCHECK(out);
333*6777b538SAndroid Build Coastguard Worker if (!byte_array)
334*6777b538SAndroid Build Coastguard Worker return;
335*6777b538SAndroid Build Coastguard Worker size_t len = SafeGetArrayLength(env, byte_array);
336*6777b538SAndroid Build Coastguard Worker if (!len)
337*6777b538SAndroid Build Coastguard Worker return;
338*6777b538SAndroid Build Coastguard Worker size_t back = out->size();
339*6777b538SAndroid Build Coastguard Worker out->resize(back + len);
340*6777b538SAndroid Build Coastguard Worker env->GetByteArrayRegion(byte_array.obj(), 0, static_cast<jsize>(len),
341*6777b538SAndroid Build Coastguard Worker reinterpret_cast<int8_t*>(out->data() + back));
342*6777b538SAndroid Build Coastguard Worker }
343*6777b538SAndroid Build Coastguard Worker
JavaByteArrayToByteVector(JNIEnv * env,const JavaRef<jbyteArray> & byte_array,std::vector<uint8_t> * out)344*6777b538SAndroid Build Coastguard Worker void JavaByteArrayToByteVector(JNIEnv* env,
345*6777b538SAndroid Build Coastguard Worker const JavaRef<jbyteArray>& byte_array,
346*6777b538SAndroid Build Coastguard Worker std::vector<uint8_t>* out) {
347*6777b538SAndroid Build Coastguard Worker DCHECK(out);
348*6777b538SAndroid Build Coastguard Worker DCHECK(byte_array);
349*6777b538SAndroid Build Coastguard Worker out->clear();
350*6777b538SAndroid Build Coastguard Worker AppendJavaByteArrayToByteVector(env, byte_array, out);
351*6777b538SAndroid Build Coastguard Worker }
352*6777b538SAndroid Build Coastguard Worker
JavaByteArrayToByteSpan(JNIEnv * env,const JavaRef<jbyteArray> & byte_array,base::span<uint8_t> dest)353*6777b538SAndroid Build Coastguard Worker size_t JavaByteArrayToByteSpan(JNIEnv* env,
354*6777b538SAndroid Build Coastguard Worker const JavaRef<jbyteArray>& byte_array,
355*6777b538SAndroid Build Coastguard Worker base::span<uint8_t> dest) {
356*6777b538SAndroid Build Coastguard Worker CHECK(byte_array);
357*6777b538SAndroid Build Coastguard Worker size_t len = SafeGetArrayLength(env, byte_array);
358*6777b538SAndroid Build Coastguard Worker size_t span_len = dest.size_bytes();
359*6777b538SAndroid Build Coastguard Worker CHECK_GE(span_len, len) << "Target span is too small, java array size: "
360*6777b538SAndroid Build Coastguard Worker << len << ", span size: " << span_len;
361*6777b538SAndroid Build Coastguard Worker env->GetByteArrayRegion(byte_array.obj(), 0, static_cast<jsize>(len),
362*6777b538SAndroid Build Coastguard Worker reinterpret_cast<int8_t*>(dest.data()));
363*6777b538SAndroid Build Coastguard Worker return len;
364*6777b538SAndroid Build Coastguard Worker }
365*6777b538SAndroid Build Coastguard Worker
JavaByteArrayToString(JNIEnv * env,const JavaRef<jbyteArray> & byte_array,std::string * out)366*6777b538SAndroid Build Coastguard Worker void JavaByteArrayToString(JNIEnv* env,
367*6777b538SAndroid Build Coastguard Worker const JavaRef<jbyteArray>& byte_array,
368*6777b538SAndroid Build Coastguard Worker std::string* out) {
369*6777b538SAndroid Build Coastguard Worker DCHECK(out);
370*6777b538SAndroid Build Coastguard Worker DCHECK(byte_array);
371*6777b538SAndroid Build Coastguard Worker
372*6777b538SAndroid Build Coastguard Worker std::vector<uint8_t> byte_vector;
373*6777b538SAndroid Build Coastguard Worker JavaByteArrayToByteVector(env, byte_array, &byte_vector);
374*6777b538SAndroid Build Coastguard Worker out->assign(byte_vector.begin(), byte_vector.end());
375*6777b538SAndroid Build Coastguard Worker }
376*6777b538SAndroid Build Coastguard Worker
JavaBooleanArrayToBoolVector(JNIEnv * env,const JavaRef<jbooleanArray> & boolean_array,std::vector<bool> * out)377*6777b538SAndroid Build Coastguard Worker void JavaBooleanArrayToBoolVector(JNIEnv* env,
378*6777b538SAndroid Build Coastguard Worker const JavaRef<jbooleanArray>& boolean_array,
379*6777b538SAndroid Build Coastguard Worker std::vector<bool>* out) {
380*6777b538SAndroid Build Coastguard Worker DCHECK(out);
381*6777b538SAndroid Build Coastguard Worker if (!boolean_array)
382*6777b538SAndroid Build Coastguard Worker return;
383*6777b538SAndroid Build Coastguard Worker size_t len = SafeGetArrayLength(env, boolean_array);
384*6777b538SAndroid Build Coastguard Worker if (!len)
385*6777b538SAndroid Build Coastguard Worker return;
386*6777b538SAndroid Build Coastguard Worker out->resize(len);
387*6777b538SAndroid Build Coastguard Worker // It is not possible to get bool* out of vector<bool>.
388*6777b538SAndroid Build Coastguard Worker jboolean* values = env->GetBooleanArrayElements(boolean_array.obj(), nullptr);
389*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < len; ++i) {
390*6777b538SAndroid Build Coastguard Worker out->at(i) = static_cast<bool>(values[i]);
391*6777b538SAndroid Build Coastguard Worker }
392*6777b538SAndroid Build Coastguard Worker env->ReleaseBooleanArrayElements(boolean_array.obj(), values, JNI_ABORT);
393*6777b538SAndroid Build Coastguard Worker }
394*6777b538SAndroid Build Coastguard Worker
JavaIntArrayToIntVector(JNIEnv * env,const JavaRef<jintArray> & int_array,std::vector<int> * out)395*6777b538SAndroid Build Coastguard Worker void JavaIntArrayToIntVector(JNIEnv* env,
396*6777b538SAndroid Build Coastguard Worker const JavaRef<jintArray>& int_array,
397*6777b538SAndroid Build Coastguard Worker std::vector<int>* out) {
398*6777b538SAndroid Build Coastguard Worker DCHECK(out);
399*6777b538SAndroid Build Coastguard Worker size_t len = SafeGetArrayLength(env, int_array);
400*6777b538SAndroid Build Coastguard Worker out->resize(len);
401*6777b538SAndroid Build Coastguard Worker if (!len)
402*6777b538SAndroid Build Coastguard Worker return;
403*6777b538SAndroid Build Coastguard Worker env->GetIntArrayRegion(int_array.obj(), 0, static_cast<jsize>(len),
404*6777b538SAndroid Build Coastguard Worker out->data());
405*6777b538SAndroid Build Coastguard Worker }
406*6777b538SAndroid Build Coastguard Worker
JavaLongArrayToInt64Vector(JNIEnv * env,const JavaRef<jlongArray> & long_array,std::vector<int64_t> * out)407*6777b538SAndroid Build Coastguard Worker void JavaLongArrayToInt64Vector(JNIEnv* env,
408*6777b538SAndroid Build Coastguard Worker const JavaRef<jlongArray>& long_array,
409*6777b538SAndroid Build Coastguard Worker std::vector<int64_t>* out) {
410*6777b538SAndroid Build Coastguard Worker DCHECK(out);
411*6777b538SAndroid Build Coastguard Worker std::vector<jlong> temp;
412*6777b538SAndroid Build Coastguard Worker JavaLongArrayToLongVector(env, long_array, &temp);
413*6777b538SAndroid Build Coastguard Worker out->resize(0);
414*6777b538SAndroid Build Coastguard Worker out->insert(out->begin(), temp.begin(), temp.end());
415*6777b538SAndroid Build Coastguard Worker }
416*6777b538SAndroid Build Coastguard Worker
JavaLongArrayToLongVector(JNIEnv * env,const JavaRef<jlongArray> & long_array,std::vector<jlong> * out)417*6777b538SAndroid Build Coastguard Worker void JavaLongArrayToLongVector(JNIEnv* env,
418*6777b538SAndroid Build Coastguard Worker const JavaRef<jlongArray>& long_array,
419*6777b538SAndroid Build Coastguard Worker std::vector<jlong>* out) {
420*6777b538SAndroid Build Coastguard Worker DCHECK(out);
421*6777b538SAndroid Build Coastguard Worker size_t len = SafeGetArrayLength(env, long_array);
422*6777b538SAndroid Build Coastguard Worker out->resize(len);
423*6777b538SAndroid Build Coastguard Worker if (!len)
424*6777b538SAndroid Build Coastguard Worker return;
425*6777b538SAndroid Build Coastguard Worker env->GetLongArrayRegion(long_array.obj(), 0, static_cast<jsize>(len),
426*6777b538SAndroid Build Coastguard Worker out->data());
427*6777b538SAndroid Build Coastguard Worker }
428*6777b538SAndroid Build Coastguard Worker
JavaFloatArrayToFloatVector(JNIEnv * env,const JavaRef<jfloatArray> & float_array,std::vector<float> * out)429*6777b538SAndroid Build Coastguard Worker void JavaFloatArrayToFloatVector(JNIEnv* env,
430*6777b538SAndroid Build Coastguard Worker const JavaRef<jfloatArray>& float_array,
431*6777b538SAndroid Build Coastguard Worker std::vector<float>* out) {
432*6777b538SAndroid Build Coastguard Worker DCHECK(out);
433*6777b538SAndroid Build Coastguard Worker size_t len = SafeGetArrayLength(env, float_array);
434*6777b538SAndroid Build Coastguard Worker out->resize(len);
435*6777b538SAndroid Build Coastguard Worker if (!len)
436*6777b538SAndroid Build Coastguard Worker return;
437*6777b538SAndroid Build Coastguard Worker env->GetFloatArrayRegion(float_array.obj(), 0, static_cast<jsize>(len),
438*6777b538SAndroid Build Coastguard Worker out->data());
439*6777b538SAndroid Build Coastguard Worker }
440*6777b538SAndroid Build Coastguard Worker
JavaDoubleArrayToDoubleVector(JNIEnv * env,const JavaRef<jdoubleArray> & double_array,std::vector<double> * out)441*6777b538SAndroid Build Coastguard Worker void JavaDoubleArrayToDoubleVector(JNIEnv* env,
442*6777b538SAndroid Build Coastguard Worker const JavaRef<jdoubleArray>& double_array,
443*6777b538SAndroid Build Coastguard Worker std::vector<double>* out) {
444*6777b538SAndroid Build Coastguard Worker DCHECK(out);
445*6777b538SAndroid Build Coastguard Worker size_t len = SafeGetArrayLength(env, double_array);
446*6777b538SAndroid Build Coastguard Worker out->resize(len);
447*6777b538SAndroid Build Coastguard Worker if (!len)
448*6777b538SAndroid Build Coastguard Worker return;
449*6777b538SAndroid Build Coastguard Worker env->GetDoubleArrayRegion(double_array.obj(), 0, static_cast<jsize>(len),
450*6777b538SAndroid Build Coastguard Worker out->data());
451*6777b538SAndroid Build Coastguard Worker }
452*6777b538SAndroid Build Coastguard Worker
JavaArrayOfByteArrayToStringVector(JNIEnv * env,const JavaRef<jobjectArray> & array,std::vector<std::string> * out)453*6777b538SAndroid Build Coastguard Worker void JavaArrayOfByteArrayToStringVector(JNIEnv* env,
454*6777b538SAndroid Build Coastguard Worker const JavaRef<jobjectArray>& array,
455*6777b538SAndroid Build Coastguard Worker std::vector<std::string>* out) {
456*6777b538SAndroid Build Coastguard Worker DCHECK(out);
457*6777b538SAndroid Build Coastguard Worker size_t len = SafeGetArrayLength(env, array);
458*6777b538SAndroid Build Coastguard Worker out->resize(len);
459*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < len; ++i) {
460*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jbyteArray> bytes_array(
461*6777b538SAndroid Build Coastguard Worker env, static_cast<jbyteArray>(env->GetObjectArrayElement(
462*6777b538SAndroid Build Coastguard Worker array.obj(), static_cast<jsize>(i))));
463*6777b538SAndroid Build Coastguard Worker size_t bytes_len = SafeGetArrayLength(env, bytes_array);
464*6777b538SAndroid Build Coastguard Worker jbyte* bytes = env->GetByteArrayElements(bytes_array.obj(), nullptr);
465*6777b538SAndroid Build Coastguard Worker (*out)[i].assign(reinterpret_cast<const char*>(bytes), bytes_len);
466*6777b538SAndroid Build Coastguard Worker env->ReleaseByteArrayElements(bytes_array.obj(), bytes, JNI_ABORT);
467*6777b538SAndroid Build Coastguard Worker }
468*6777b538SAndroid Build Coastguard Worker }
469*6777b538SAndroid Build Coastguard Worker
JavaArrayOfByteArrayToBytesVector(JNIEnv * env,const JavaRef<jobjectArray> & array,std::vector<std::vector<uint8_t>> * out)470*6777b538SAndroid Build Coastguard Worker void JavaArrayOfByteArrayToBytesVector(JNIEnv* env,
471*6777b538SAndroid Build Coastguard Worker const JavaRef<jobjectArray>& array,
472*6777b538SAndroid Build Coastguard Worker std::vector<std::vector<uint8_t>>* out) {
473*6777b538SAndroid Build Coastguard Worker DCHECK(out);
474*6777b538SAndroid Build Coastguard Worker const size_t len = SafeGetArrayLength(env, array);
475*6777b538SAndroid Build Coastguard Worker out->resize(len);
476*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < len; ++i) {
477*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jbyteArray> bytes_array(
478*6777b538SAndroid Build Coastguard Worker env, static_cast<jbyteArray>(env->GetObjectArrayElement(
479*6777b538SAndroid Build Coastguard Worker array.obj(), static_cast<jsize>(i))));
480*6777b538SAndroid Build Coastguard Worker JavaByteArrayToByteVector(env, bytes_array, &(*out)[i]);
481*6777b538SAndroid Build Coastguard Worker }
482*6777b538SAndroid Build Coastguard Worker }
483*6777b538SAndroid Build Coastguard Worker
Java2dStringArrayTo2dStringVector(JNIEnv * env,const JavaRef<jobjectArray> & array,std::vector<std::vector<std::u16string>> * out)484*6777b538SAndroid Build Coastguard Worker void Java2dStringArrayTo2dStringVector(
485*6777b538SAndroid Build Coastguard Worker JNIEnv* env,
486*6777b538SAndroid Build Coastguard Worker const JavaRef<jobjectArray>& array,
487*6777b538SAndroid Build Coastguard Worker std::vector<std::vector<std::u16string>>* out) {
488*6777b538SAndroid Build Coastguard Worker DCHECK(out);
489*6777b538SAndroid Build Coastguard Worker size_t len = SafeGetArrayLength(env, array);
490*6777b538SAndroid Build Coastguard Worker out->resize(len);
491*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < len; ++i) {
492*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jobjectArray> strings_array(
493*6777b538SAndroid Build Coastguard Worker env, static_cast<jobjectArray>(env->GetObjectArrayElement(
494*6777b538SAndroid Build Coastguard Worker array.obj(), static_cast<jsize>(i))));
495*6777b538SAndroid Build Coastguard Worker
496*6777b538SAndroid Build Coastguard Worker out->at(i).clear();
497*6777b538SAndroid Build Coastguard Worker AppendJavaStringArrayToStringVector(env, strings_array, &out->at(i));
498*6777b538SAndroid Build Coastguard Worker }
499*6777b538SAndroid Build Coastguard Worker }
500*6777b538SAndroid Build Coastguard Worker
Java2dStringArrayTo2dStringVector(JNIEnv * env,const JavaRef<jobjectArray> & array,std::vector<std::vector<std::string>> * out)501*6777b538SAndroid Build Coastguard Worker void Java2dStringArrayTo2dStringVector(
502*6777b538SAndroid Build Coastguard Worker JNIEnv* env,
503*6777b538SAndroid Build Coastguard Worker const JavaRef<jobjectArray>& array,
504*6777b538SAndroid Build Coastguard Worker std::vector<std::vector<std::string>>* out) {
505*6777b538SAndroid Build Coastguard Worker DCHECK(out);
506*6777b538SAndroid Build Coastguard Worker size_t len = SafeGetArrayLength(env, array);
507*6777b538SAndroid Build Coastguard Worker out->resize(len);
508*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < len; ++i) {
509*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jobjectArray> strings_array(
510*6777b538SAndroid Build Coastguard Worker env, static_cast<jobjectArray>(env->GetObjectArrayElement(
511*6777b538SAndroid Build Coastguard Worker array.obj(), static_cast<jsize>(i))));
512*6777b538SAndroid Build Coastguard Worker
513*6777b538SAndroid Build Coastguard Worker out->at(i).clear();
514*6777b538SAndroid Build Coastguard Worker AppendJavaStringArrayToStringVector(env, strings_array, &out->at(i));
515*6777b538SAndroid Build Coastguard Worker }
516*6777b538SAndroid Build Coastguard Worker }
517*6777b538SAndroid Build Coastguard Worker
JavaArrayOfIntArrayToIntVector(JNIEnv * env,const JavaRef<jobjectArray> & array,std::vector<std::vector<int>> * out)518*6777b538SAndroid Build Coastguard Worker void JavaArrayOfIntArrayToIntVector(JNIEnv* env,
519*6777b538SAndroid Build Coastguard Worker const JavaRef<jobjectArray>& array,
520*6777b538SAndroid Build Coastguard Worker std::vector<std::vector<int>>* out) {
521*6777b538SAndroid Build Coastguard Worker DCHECK(out);
522*6777b538SAndroid Build Coastguard Worker size_t len = SafeGetArrayLength(env, array);
523*6777b538SAndroid Build Coastguard Worker out->resize(len);
524*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < len; ++i) {
525*6777b538SAndroid Build Coastguard Worker ScopedJavaLocalRef<jintArray> int_array(
526*6777b538SAndroid Build Coastguard Worker env, static_cast<jintArray>(env->GetObjectArrayElement(
527*6777b538SAndroid Build Coastguard Worker array.obj(), static_cast<jsize>(i))));
528*6777b538SAndroid Build Coastguard Worker JavaIntArrayToIntVector(env, int_array, &out->at(i));
529*6777b538SAndroid Build Coastguard Worker }
530*6777b538SAndroid Build Coastguard Worker }
531*6777b538SAndroid Build Coastguard Worker
532*6777b538SAndroid Build Coastguard Worker } // namespace base::android
533