blob: 32a5fc9c9fbd581bc9ba3bf9b33b96906af10b06 [file] [log] [blame]
[email protected]fe0f1ab2012-02-09 21:02:271// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]396b67232011-08-11 11:23:522// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
[email protected]61c86c62011-08-02 16:11:164
5#include "base/android/jni_array.h"
6
Hans Wennborg9f3bb63d2020-04-21 11:12:387#include <ostream>
8
[email protected]61c86c62011-08-02 16:11:169#include "base/android/jni_android.h"
[email protected]f98d7b92011-09-09 10:17:3510#include "base/android/jni_string.h"
Hans Wennborgc3cffa62020-04-27 10:09:1211#include "base/check_op.h"
[email protected]61c86c62011-08-02 16:11:1612
13namespace base {
14namespace android {
jdduke54720d12015-01-10 01:55:2115namespace {
16
17// As |GetArrayLength| makes no guarantees about the returned value (e.g., it
18// may be -1 if |array| is not a valid Java array), provide a safe wrapper
19// that always returns a valid, non-negative size.
20template <typename JavaArrayType>
Torne (Richard Coles)3c22e8302018-10-12 18:34:2221size_t SafeGetArrayLength(JNIEnv* env, const JavaRef<JavaArrayType>& jarray) {
jdduke54720d12015-01-10 01:55:2122 DCHECK(jarray);
Torne (Richard Coles)3c22e8302018-10-12 18:34:2223 jsize length = env->GetArrayLength(jarray.obj());
jdduke54720d12015-01-10 01:55:2124 DCHECK_GE(length, 0) << "Invalid array length: " << length;
25 return static_cast<size_t>(std::max(0, length));
26}
27
28} // namespace
[email protected]61c86c62011-08-02 16:11:1629
scheib1be6fde2015-11-03 18:15:2530ScopedJavaLocalRef<jbyteArray> ToJavaByteArray(JNIEnv* env,
31 const uint8_t* bytes,
32 size_t len) {
[email protected]61c86c62011-08-02 16:11:1633 jbyteArray byte_array = env->NewByteArray(len);
[email protected]f98d7b92011-09-09 10:17:3534 CheckException(env);
[email protected]a42d4632011-10-26 21:48:0035 DCHECK(byte_array);
[email protected]61c86c62011-08-02 16:11:1636
Martin Kreichgauer067518e2020-03-19 19:09:4637 env->SetByteArrayRegion(byte_array, 0, len,
38 reinterpret_cast<const jbyte*>(bytes));
[email protected]61c86c62011-08-02 16:11:1639 CheckException(env);
40
[email protected]fe0f1ab2012-02-09 21:02:2741 return ScopedJavaLocalRef<jbyteArray>(env, byte_array);
[email protected]61c86c62011-08-02 16:11:1642}
43
scheib1be6fde2015-11-03 18:15:2544ScopedJavaLocalRef<jbyteArray> ToJavaByteArray(
45 JNIEnv* env,
Martin Kreichgauer067518e2020-03-19 19:09:4646 base::span<const uint8_t> bytes) {
scheib1be6fde2015-11-03 18:15:2547 return ToJavaByteArray(env, bytes.data(), bytes.size());
48}
49
Torne (Richard Coles)cd5fa3f2018-10-02 16:09:5750ScopedJavaLocalRef<jbyteArray> ToJavaByteArray(JNIEnv* env,
51 const std::string& str) {
52 return ToJavaByteArray(env, reinterpret_cast<const uint8_t*>(str.data()),
53 str.size());
54}
55
vitaliiif5491922017-05-15 09:11:0756ScopedJavaLocalRef<jbooleanArray> ToJavaBooleanArray(JNIEnv* env,
57 const bool* bools,
58 size_t len) {
59 jbooleanArray boolean_array = env->NewBooleanArray(len);
60 CheckException(env);
61 DCHECK(boolean_array);
62
63 env->SetBooleanArrayRegion(boolean_array, 0, len,
64 reinterpret_cast<const jboolean*>(bools));
65 CheckException(env);
66
67 return ScopedJavaLocalRef<jbooleanArray>(env, boolean_array);
68}
69
Martin Kreichgauer067518e2020-03-19 19:09:4670ScopedJavaLocalRef<jintArray> ToJavaIntArray(JNIEnv* env,
71 const int* ints,
72 size_t len) {
[email protected]2fd6b7032013-09-11 00:20:2573 jintArray int_array = env->NewIntArray(len);
74 CheckException(env);
75 DCHECK(int_array);
76
Martin Kreichgauer067518e2020-03-19 19:09:4677 env->SetIntArrayRegion(int_array, 0, len,
78 reinterpret_cast<const jint*>(ints));
[email protected]2fd6b7032013-09-11 00:20:2579 CheckException(env);
80
81 return ScopedJavaLocalRef<jintArray>(env, int_array);
82}
83
Martin Kreichgauer067518e2020-03-19 19:09:4684ScopedJavaLocalRef<jintArray> ToJavaIntArray(JNIEnv* env,
85 base::span<const int> ints) {
jdduke9f355f212015-05-05 07:34:0586 return ToJavaIntArray(env, ints.data(), ints.size());
[email protected]2fd6b7032013-09-11 00:20:2587}
88
scheib1be6fde2015-11-03 18:15:2589ScopedJavaLocalRef<jlongArray> ToJavaLongArray(JNIEnv* env,
90 const int64_t* longs,
91 size_t len) {
[email protected]2a3a0592013-02-22 18:53:0492 jlongArray long_array = env->NewLongArray(len);
93 CheckException(env);
94 DCHECK(long_array);
95
Martin Kreichgauer067518e2020-03-19 19:09:4696 env->SetLongArrayRegion(long_array, 0, len,
97 reinterpret_cast<const jlong*>(longs));
[email protected]2a3a0592013-02-22 18:53:0498 CheckException(env);
99
100 return ScopedJavaLocalRef<jlongArray>(env, long_array);
101}
102
scheib1be6fde2015-11-03 18:15:25103// Returns a new Java long array converted from the given int64_t array.
[email protected]2a3a0592013-02-22 18:53:04104BASE_EXPORT ScopedJavaLocalRef<jlongArray> ToJavaLongArray(
scheib1be6fde2015-11-03 18:15:25105 JNIEnv* env,
Martin Kreichgauer067518e2020-03-19 19:09:46106 base::span<const int64_t> longs) {
jdduke9f355f212015-05-05 07:34:05107 return ToJavaLongArray(env, longs.data(), longs.size());
[email protected]2a3a0592013-02-22 18:53:04108}
109
kinabae07c4b72016-02-10 12:42:08110// Returns a new Java float array converted from the given C++ float array.
Martin Kreichgauer067518e2020-03-19 19:09:46111BASE_EXPORT ScopedJavaLocalRef<jfloatArray>
112ToJavaFloatArray(JNIEnv* env, const float* floats, size_t len) {
kinabae07c4b72016-02-10 12:42:08113 jfloatArray float_array = env->NewFloatArray(len);
114 CheckException(env);
115 DCHECK(float_array);
116
Martin Kreichgauer067518e2020-03-19 19:09:46117 env->SetFloatArrayRegion(float_array, 0, len,
118 reinterpret_cast<const jfloat*>(floats));
kinabae07c4b72016-02-10 12:42:08119 CheckException(env);
120
121 return ScopedJavaLocalRef<jfloatArray>(env, float_array);
122}
123
124BASE_EXPORT ScopedJavaLocalRef<jfloatArray> ToJavaFloatArray(
125 JNIEnv* env,
Martin Kreichgauer067518e2020-03-19 19:09:46126 base::span<const float> floats) {
kinabae07c4b72016-02-10 12:42:08127 return ToJavaFloatArray(env, floats.data(), floats.size());
128}
129
Miyoung Shin95132582019-04-17 22:54:55130BASE_EXPORT ScopedJavaLocalRef<jdoubleArray>
131ToJavaDoubleArray(JNIEnv* env, const double* doubles, size_t len) {
132 jdoubleArray double_array = env->NewDoubleArray(len);
133 CheckException(env);
134 DCHECK(double_array);
135
136 env->SetDoubleArrayRegion(double_array, 0, len,
137 reinterpret_cast<const jdouble*>(doubles));
138 CheckException(env);
139
140 return ScopedJavaLocalRef<jdoubleArray>(env, double_array);
141}
142
143BASE_EXPORT ScopedJavaLocalRef<jdoubleArray> ToJavaDoubleArray(
144 JNIEnv* env,
Martin Kreichgauer067518e2020-03-19 19:09:46145 base::span<const double> doubles) {
Miyoung Shin95132582019-04-17 22:54:55146 return ToJavaDoubleArray(env, doubles.data(), doubles.size());
147}
148
[email protected]fe0f1ab2012-02-09 21:02:27149ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfByteArray(
Martin Kreichgauer067518e2020-03-19 19:09:46150 JNIEnv* env,
151 base::span<const std::string> v) {
[email protected]fe0f1ab2012-02-09 21:02:27152 ScopedJavaLocalRef<jclass> byte_array_clazz = GetClass(env, "[B");
Martin Kreichgauer067518e2020-03-19 19:09:46153 jobjectArray joa =
154 env->NewObjectArray(v.size(), byte_array_clazz.obj(), nullptr);
[email protected]f98d7b92011-09-09 10:17:35155 CheckException(env);
[email protected]61c86c62011-08-02 16:11:16156
[email protected]f98d7b92011-09-09 10:17:35157 for (size_t i = 0; i < v.size(); ++i) {
scheib1be6fde2015-11-03 18:15:25158 ScopedJavaLocalRef<jbyteArray> byte_array = ToJavaByteArray(
159 env, reinterpret_cast<const uint8_t*>(v[i].data()), v[i].length());
[email protected]61c86c62011-08-02 16:11:16160 env->SetObjectArrayElement(joa, i, byte_array.obj());
161 }
[email protected]fe0f1ab2012-02-09 21:02:27162 return ScopedJavaLocalRef<jobjectArray>(env, joa);
[email protected]61c86c62011-08-02 16:11:16163}
164
Martin Kreichgauer067518e2020-03-19 19:09:46165ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfByteArray(
166 JNIEnv* env,
Adam Langley05372602020-09-14 19:31:21167 base::span<const std::vector<uint8_t>> v) {
Martin Kreichgauer067518e2020-03-19 19:09:46168 ScopedJavaLocalRef<jclass> byte_array_clazz = GetClass(env, "[B");
169 jobjectArray joa =
170 env->NewObjectArray(v.size(), byte_array_clazz.obj(), nullptr);
171 CheckException(env);
172
173 for (size_t i = 0; i < v.size(); ++i) {
174 ScopedJavaLocalRef<jbyteArray> byte_array =
175 ToJavaByteArray(env, v[i].data(), v[i].size());
176 env->SetObjectArrayElement(joa, i, byte_array.obj());
177 }
178 return ScopedJavaLocalRef<jobjectArray>(env, joa);
179}
180
[email protected]fe0f1ab2012-02-09 21:02:27181ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStrings(
Martin Kreichgauer067518e2020-03-19 19:09:46182 JNIEnv* env,
183 base::span<const std::string> v) {
[email protected]fe0f1ab2012-02-09 21:02:27184 ScopedJavaLocalRef<jclass> string_clazz = GetClass(env, "java/lang/String");
Martin Kreichgauer067518e2020-03-19 19:09:46185 jobjectArray joa = env->NewObjectArray(v.size(), string_clazz.obj(), nullptr);
[email protected]f98d7b92011-09-09 10:17:35186 CheckException(env);
187
188 for (size_t i = 0; i < v.size(); ++i) {
[email protected]fe0f1ab2012-02-09 21:02:27189 ScopedJavaLocalRef<jstring> item = ConvertUTF8ToJavaString(env, v[i]);
[email protected]f98d7b92011-09-09 10:17:35190 env->SetObjectArrayElement(joa, i, item.obj());
191 }
[email protected]fe0f1ab2012-02-09 21:02:27192 return ScopedJavaLocalRef<jobjectArray>(env, joa);
193}
194
Henry Jian73253b42019-05-28 23:17:00195ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStringArray(
196 JNIEnv* env,
Martin Kreichgauer067518e2020-03-19 19:09:46197 base::span<const std::vector<string16>> vec_outer) {
Henry Jian73253b42019-05-28 23:17:00198 ScopedJavaLocalRef<jclass> string_array_clazz =
199 GetClass(env, "[Ljava/lang/String;");
200
201 jobjectArray joa =
Martin Kreichgauer067518e2020-03-19 19:09:46202 env->NewObjectArray(vec_outer.size(), string_array_clazz.obj(), nullptr);
Henry Jian73253b42019-05-28 23:17:00203 CheckException(env);
204
205 for (size_t i = 0; i < vec_outer.size(); ++i) {
206 ScopedJavaLocalRef<jobjectArray> inner =
207 ToJavaArrayOfStrings(env, vec_outer[i]);
208 env->SetObjectArrayElement(joa, i, inner.obj());
209 }
210
211 return ScopedJavaLocalRef<jobjectArray>(env, joa);
212}
213
[email protected]80ec0c32012-04-24 23:55:20214ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStrings(
Martin Kreichgauer067518e2020-03-19 19:09:46215 JNIEnv* env,
216 base::span<const string16> v) {
[email protected]80ec0c32012-04-24 23:55:20217 ScopedJavaLocalRef<jclass> string_clazz = GetClass(env, "java/lang/String");
Martin Kreichgauer067518e2020-03-19 19:09:46218 jobjectArray joa = env->NewObjectArray(v.size(), string_clazz.obj(), nullptr);
[email protected]80ec0c32012-04-24 23:55:20219 CheckException(env);
220
221 for (size_t i = 0; i < v.size(); ++i) {
222 ScopedJavaLocalRef<jstring> item = ConvertUTF16ToJavaString(env, v[i]);
223 env->SetObjectArrayElement(joa, i, item.obj());
224 }
225 return ScopedJavaLocalRef<jobjectArray>(env, joa);
226}
227
228void AppendJavaStringArrayToStringVector(JNIEnv* env,
Torne (Richard Coles)3c22e8302018-10-12 18:34:22229 const JavaRef<jobjectArray>& array,
[email protected]80ec0c32012-04-24 23:55:20230 std::vector<string16>* out) {
231 DCHECK(out);
[email protected]b8452fa2012-06-15 01:41:41232 if (!array)
[email protected]80ec0c32012-04-24 23:55:20233 return;
jdduke54720d12015-01-10 01:55:21234 size_t len = SafeGetArrayLength(env, array);
[email protected]df0d7142012-12-14 01:31:17235 size_t back = out->size();
236 out->resize(back + len);
jdduke54720d12015-01-10 01:55:21237 for (size_t i = 0; i < len; ++i) {
Torne (Richard Coles)3c22e8302018-10-12 18:34:22238 ScopedJavaLocalRef<jstring> str(
239 env, static_cast<jstring>(env->GetObjectArrayElement(array.obj(), i)));
vitaliiif5491922017-05-15 09:11:07240 ConvertJavaStringToUTF16(env, str.obj(), out->data() + back + i);
[email protected]80ec0c32012-04-24 23:55:20241 }
242}
243
[email protected]380a2ce2012-06-18 18:48:55244void AppendJavaStringArrayToStringVector(JNIEnv* env,
Torne (Richard Coles)3c22e8302018-10-12 18:34:22245 const JavaRef<jobjectArray>& array,
[email protected]380a2ce2012-06-18 18:48:55246 std::vector<std::string>* out) {
247 DCHECK(out);
248 if (!array)
249 return;
jdduke54720d12015-01-10 01:55:21250 size_t len = SafeGetArrayLength(env, array);
[email protected]df0d7142012-12-14 01:31:17251 size_t back = out->size();
252 out->resize(back + len);
jdduke54720d12015-01-10 01:55:21253 for (size_t i = 0; i < len; ++i) {
Torne (Richard Coles)3c22e8302018-10-12 18:34:22254 ScopedJavaLocalRef<jstring> str(
255 env, static_cast<jstring>(env->GetObjectArrayElement(array.obj(), i)));
vitaliiif5491922017-05-15 09:11:07256 ConvertJavaStringToUTF8(env, str.obj(), out->data() + back + i);
[email protected]380a2ce2012-06-18 18:48:55257 }
258}
259
[email protected]fe0f1ab2012-02-09 21:02:27260void AppendJavaByteArrayToByteVector(JNIEnv* env,
Torne (Richard Coles)3c22e8302018-10-12 18:34:22261 const JavaRef<jbyteArray>& byte_array,
scheib1be6fde2015-11-03 18:15:25262 std::vector<uint8_t>* out) {
[email protected]fe0f1ab2012-02-09 21:02:27263 DCHECK(out);
264 if (!byte_array)
265 return;
jdduke54720d12015-01-10 01:55:21266 size_t len = SafeGetArrayLength(env, byte_array);
267 if (!len)
268 return;
269 size_t back = out->size();
270 out->resize(back + len);
Torne (Richard Coles)3c22e8302018-10-12 18:34:22271 env->GetByteArrayRegion(byte_array.obj(), 0, len,
vitaliiif5491922017-05-15 09:11:07272 reinterpret_cast<int8_t*>(out->data() + back));
[email protected]fe0f1ab2012-02-09 21:02:27273}
274
275void JavaByteArrayToByteVector(JNIEnv* env,
Torne (Richard Coles)3c22e8302018-10-12 18:34:22276 const JavaRef<jbyteArray>& byte_array,
scheib1be6fde2015-11-03 18:15:25277 std::vector<uint8_t>* out) {
[email protected]fe0f1ab2012-02-09 21:02:27278 DCHECK(out);
jdduke54720d12015-01-10 01:55:21279 DCHECK(byte_array);
[email protected]fe0f1ab2012-02-09 21:02:27280 out->clear();
281 AppendJavaByteArrayToByteVector(env, byte_array, out);
[email protected]f98d7b92011-09-09 10:17:35282}
283
Torne (Richard Coles)cd5fa3f2018-10-02 16:09:57284void JavaByteArrayToString(JNIEnv* env,
Torne (Richard Coles)3c22e8302018-10-12 18:34:22285 const JavaRef<jbyteArray>& byte_array,
Torne (Richard Coles)cd5fa3f2018-10-02 16:09:57286 std::string* out) {
287 DCHECK(out);
288 DCHECK(byte_array);
289
290 std::vector<uint8_t> byte_vector;
291 JavaByteArrayToByteVector(env, byte_array, &byte_vector);
292 out->assign(byte_vector.begin(), byte_vector.end());
293}
294
vitaliiif5491922017-05-15 09:11:07295void JavaBooleanArrayToBoolVector(JNIEnv* env,
Torne (Richard Coles)3c22e8302018-10-12 18:34:22296 const JavaRef<jbooleanArray>& boolean_array,
vitaliiif5491922017-05-15 09:11:07297 std::vector<bool>* out) {
298 DCHECK(out);
299 if (!boolean_array)
300 return;
301 size_t len = SafeGetArrayLength(env, boolean_array);
302 if (!len)
303 return;
304 out->resize(len);
305 // It is not possible to get bool* out of vector<bool>.
Torne (Richard Coles)3c22e8302018-10-12 18:34:22306 jboolean* values = env->GetBooleanArrayElements(boolean_array.obj(), nullptr);
vitaliiif5491922017-05-15 09:11:07307 for (size_t i = 0; i < len; ++i) {
308 out->at(i) = static_cast<bool>(values[i]);
309 }
Torne (Richard Coles)6f77e532018-10-12 20:11:05310 env->ReleaseBooleanArrayElements(boolean_array.obj(), values, JNI_ABORT);
vitaliiif5491922017-05-15 09:11:07311}
312
[email protected]30935362012-06-28 21:26:23313void JavaIntArrayToIntVector(JNIEnv* env,
Torne (Richard Coles)3c22e8302018-10-12 18:34:22314 const JavaRef<jintArray>& int_array,
[email protected]30935362012-06-28 21:26:23315 std::vector<int>* out) {
316 DCHECK(out);
jdduke54720d12015-01-10 01:55:21317 size_t len = SafeGetArrayLength(env, int_array);
318 out->resize(len);
319 if (!len)
320 return;
Torne (Richard Coles)3c22e8302018-10-12 18:34:22321 env->GetIntArrayRegion(int_array.obj(), 0, len, out->data());
[email protected]433461802013-05-22 21:32:27322}
323
fgorski59ab07f32015-08-26 21:06:36324void JavaLongArrayToInt64Vector(JNIEnv* env,
Torne (Richard Coles)3c22e8302018-10-12 18:34:22325 const JavaRef<jlongArray>& long_array,
scheib1be6fde2015-11-03 18:15:25326 std::vector<int64_t>* out) {
fgorski59ab07f32015-08-26 21:06:36327 DCHECK(out);
328 std::vector<jlong> temp;
329 JavaLongArrayToLongVector(env, long_array, &temp);
330 out->resize(0);
331 out->insert(out->begin(), temp.begin(), temp.end());
332}
333
[email protected]1b9f6bf92014-07-18 22:50:46334void JavaLongArrayToLongVector(JNIEnv* env,
Torne (Richard Coles)3c22e8302018-10-12 18:34:22335 const JavaRef<jlongArray>& long_array,
jdduke54720d12015-01-10 01:55:21336 std::vector<jlong>* out) {
[email protected]1b9f6bf92014-07-18 22:50:46337 DCHECK(out);
jdduke54720d12015-01-10 01:55:21338 size_t len = SafeGetArrayLength(env, long_array);
339 out->resize(len);
340 if (!len)
341 return;
Torne (Richard Coles)3c22e8302018-10-12 18:34:22342 env->GetLongArrayRegion(long_array.obj(), 0, len, out->data());
[email protected]1b9f6bf92014-07-18 22:50:46343}
344
[email protected]433461802013-05-22 21:32:27345void JavaFloatArrayToFloatVector(JNIEnv* env,
Torne (Richard Coles)3c22e8302018-10-12 18:34:22346 const JavaRef<jfloatArray>& float_array,
[email protected]433461802013-05-22 21:32:27347 std::vector<float>* out) {
348 DCHECK(out);
jdduke54720d12015-01-10 01:55:21349 size_t len = SafeGetArrayLength(env, float_array);
350 out->resize(len);
351 if (!len)
352 return;
Torne (Richard Coles)3c22e8302018-10-12 18:34:22353 env->GetFloatArrayRegion(float_array.obj(), 0, len, out->data());
[email protected]30935362012-06-28 21:26:23354}
355
Dan Harrington2f6e4a12020-04-30 18:33:34356void JavaDoubleArrayToDoubleVector(JNIEnv* env,
357 const JavaRef<jdoubleArray>& double_array,
358 std::vector<double>* out) {
359 DCHECK(out);
360 size_t len = SafeGetArrayLength(env, double_array);
361 out->resize(len);
362 if (!len)
363 return;
364 env->GetDoubleArrayRegion(double_array.obj(), 0, len, out->data());
365}
366
Torne (Richard Coles)3c22e8302018-10-12 18:34:22367void JavaArrayOfByteArrayToStringVector(JNIEnv* env,
368 const JavaRef<jobjectArray>& array,
369 std::vector<std::string>* out) {
[email protected]65d58352012-12-05 15:00:28370 DCHECK(out);
jdduke54720d12015-01-10 01:55:21371 size_t len = SafeGetArrayLength(env, array);
[email protected]df0d7142012-12-14 01:31:17372 out->resize(len);
jdduke54720d12015-01-10 01:55:21373 for (size_t i = 0; i < len; ++i) {
[email protected]db45c212014-05-06 17:40:20374 ScopedJavaLocalRef<jbyteArray> bytes_array(
Torne (Richard Coles)3c22e8302018-10-12 18:34:22375 env,
376 static_cast<jbyteArray>(env->GetObjectArrayElement(array.obj(), i)));
[email protected]db45c212014-05-06 17:40:20377 jsize bytes_len = env->GetArrayLength(bytes_array.obj());
twellingtonaf303ba2015-10-29 23:15:57378 jbyte* bytes = env->GetByteArrayElements(bytes_array.obj(), nullptr);
[email protected]df0d7142012-12-14 01:31:17379 (*out)[i].assign(reinterpret_cast<const char*>(bytes), bytes_len);
[email protected]db45c212014-05-06 17:40:20380 env->ReleaseByteArrayElements(bytes_array.obj(), bytes, JNI_ABORT);
[email protected]65d58352012-12-05 15:00:28381 }
382}
383
Rushan Suleymanov1c8f8eb2019-12-20 09:44:49384void JavaArrayOfByteArrayToBytesVector(JNIEnv* env,
385 const JavaRef<jobjectArray>& array,
386 std::vector<std::vector<uint8_t>>* out) {
387 DCHECK(out);
388 const size_t len = SafeGetArrayLength(env, array);
389 out->resize(len);
390 for (size_t i = 0; i < len; ++i) {
391 ScopedJavaLocalRef<jbyteArray> bytes_array(
392 env,
393 static_cast<jbyteArray>(env->GetObjectArrayElement(array.obj(), i)));
394 JavaByteArrayToByteVector(env, bytes_array, &(*out)[i]);
395 }
396}
397
Henry Jian73253b42019-05-28 23:17:00398void Java2dStringArrayTo2dStringVector(
399 JNIEnv* env,
400 const JavaRef<jobjectArray>& array,
401 std::vector<std::vector<string16>>* out) {
402 DCHECK(out);
403 size_t len = SafeGetArrayLength(env, array);
404 out->resize(len);
405 for (size_t i = 0; i < len; ++i) {
406 ScopedJavaLocalRef<jobjectArray> strings_array(
407 env,
408 static_cast<jobjectArray>(env->GetObjectArrayElement(array.obj(), i)));
409
410 out->at(i).clear();
411 AppendJavaStringArrayToStringVector(env, strings_array, &out->at(i));
412 }
413}
414
Torne (Richard Coles)3c22e8302018-10-12 18:34:22415void JavaArrayOfIntArrayToIntVector(JNIEnv* env,
416 const JavaRef<jobjectArray>& array,
417 std::vector<std::vector<int>>* out) {
twellingtonaf303ba2015-10-29 23:15:57418 DCHECK(out);
419 size_t len = SafeGetArrayLength(env, array);
420 out->resize(len);
421 for (size_t i = 0; i < len; ++i) {
422 ScopedJavaLocalRef<jintArray> int_array(
Torne (Richard Coles)3c22e8302018-10-12 18:34:22423 env,
424 static_cast<jintArray>(env->GetObjectArrayElement(array.obj(), i)));
425 JavaIntArrayToIntVector(env, int_array, &out->at(i));
twellingtonaf303ba2015-10-29 23:15:57426 }
427}
428
[email protected]61c86c62011-08-02 16:11:16429} // namespace android
430} // namespace base