1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Worker #include "base/android/jni_array.h"
6*635a8641SAndroid Build Coastguard Worker
7*635a8641SAndroid Build Coastguard Worker #include "base/android/jni_android.h"
8*635a8641SAndroid Build Coastguard Worker #include "base/android/jni_string.h"
9*635a8641SAndroid Build Coastguard Worker #include "base/logging.h"
10*635a8641SAndroid Build Coastguard Worker
11*635a8641SAndroid Build Coastguard Worker namespace base {
12*635a8641SAndroid Build Coastguard Worker namespace android {
13*635a8641SAndroid Build Coastguard Worker namespace {
14*635a8641SAndroid Build Coastguard Worker
15*635a8641SAndroid Build Coastguard Worker // As |GetArrayLength| makes no guarantees about the returned value (e.g., it
16*635a8641SAndroid Build Coastguard Worker // may be -1 if |array| is not a valid Java array), provide a safe wrapper
17*635a8641SAndroid Build Coastguard Worker // that always returns a valid, non-negative size.
18*635a8641SAndroid Build Coastguard Worker template <typename JavaArrayType>
SafeGetArrayLength(JNIEnv * env,JavaArrayType jarray)19*635a8641SAndroid Build Coastguard Worker size_t SafeGetArrayLength(JNIEnv* env, JavaArrayType jarray) {
20*635a8641SAndroid Build Coastguard Worker DCHECK(jarray);
21*635a8641SAndroid Build Coastguard Worker jsize length = env->GetArrayLength(jarray);
22*635a8641SAndroid Build Coastguard Worker DCHECK_GE(length, 0) << "Invalid array length: " << length;
23*635a8641SAndroid Build Coastguard Worker return static_cast<size_t>(std::max(0, length));
24*635a8641SAndroid Build Coastguard Worker }
25*635a8641SAndroid Build Coastguard Worker
26*635a8641SAndroid Build Coastguard Worker } // namespace
27*635a8641SAndroid Build Coastguard Worker
ToJavaByteArray(JNIEnv * env,const uint8_t * bytes,size_t len)28*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef<jbyteArray> ToJavaByteArray(JNIEnv* env,
29*635a8641SAndroid Build Coastguard Worker const uint8_t* bytes,
30*635a8641SAndroid Build Coastguard Worker size_t len) {
31*635a8641SAndroid Build Coastguard Worker jbyteArray byte_array = env->NewByteArray(len);
32*635a8641SAndroid Build Coastguard Worker CheckException(env);
33*635a8641SAndroid Build Coastguard Worker DCHECK(byte_array);
34*635a8641SAndroid Build Coastguard Worker
35*635a8641SAndroid Build Coastguard Worker env->SetByteArrayRegion(
36*635a8641SAndroid Build Coastguard Worker byte_array, 0, len, reinterpret_cast<const jbyte*>(bytes));
37*635a8641SAndroid Build Coastguard Worker CheckException(env);
38*635a8641SAndroid Build Coastguard Worker
39*635a8641SAndroid Build Coastguard Worker return ScopedJavaLocalRef<jbyteArray>(env, byte_array);
40*635a8641SAndroid Build Coastguard Worker }
41*635a8641SAndroid Build Coastguard Worker
ToJavaByteArray(JNIEnv * env,const std::vector<uint8_t> & bytes)42*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef<jbyteArray> ToJavaByteArray(
43*635a8641SAndroid Build Coastguard Worker JNIEnv* env,
44*635a8641SAndroid Build Coastguard Worker const std::vector<uint8_t>& bytes) {
45*635a8641SAndroid Build Coastguard Worker return ToJavaByteArray(env, bytes.data(), bytes.size());
46*635a8641SAndroid Build Coastguard Worker }
47*635a8641SAndroid Build Coastguard Worker
ToJavaBooleanArray(JNIEnv * env,const bool * bools,size_t len)48*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef<jbooleanArray> ToJavaBooleanArray(JNIEnv* env,
49*635a8641SAndroid Build Coastguard Worker const bool* bools,
50*635a8641SAndroid Build Coastguard Worker size_t len) {
51*635a8641SAndroid Build Coastguard Worker jbooleanArray boolean_array = env->NewBooleanArray(len);
52*635a8641SAndroid Build Coastguard Worker CheckException(env);
53*635a8641SAndroid Build Coastguard Worker DCHECK(boolean_array);
54*635a8641SAndroid Build Coastguard Worker
55*635a8641SAndroid Build Coastguard Worker env->SetBooleanArrayRegion(boolean_array, 0, len,
56*635a8641SAndroid Build Coastguard Worker reinterpret_cast<const jboolean*>(bools));
57*635a8641SAndroid Build Coastguard Worker CheckException(env);
58*635a8641SAndroid Build Coastguard Worker
59*635a8641SAndroid Build Coastguard Worker return ScopedJavaLocalRef<jbooleanArray>(env, boolean_array);
60*635a8641SAndroid Build Coastguard Worker }
61*635a8641SAndroid Build Coastguard Worker
ToJavaIntArray(JNIEnv * env,const int * ints,size_t len)62*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef<jintArray> ToJavaIntArray(
63*635a8641SAndroid Build Coastguard Worker JNIEnv* env, const int* ints, size_t len) {
64*635a8641SAndroid Build Coastguard Worker jintArray int_array = env->NewIntArray(len);
65*635a8641SAndroid Build Coastguard Worker CheckException(env);
66*635a8641SAndroid Build Coastguard Worker DCHECK(int_array);
67*635a8641SAndroid Build Coastguard Worker
68*635a8641SAndroid Build Coastguard Worker env->SetIntArrayRegion(
69*635a8641SAndroid Build Coastguard Worker int_array, 0, len, reinterpret_cast<const jint*>(ints));
70*635a8641SAndroid Build Coastguard Worker CheckException(env);
71*635a8641SAndroid Build Coastguard Worker
72*635a8641SAndroid Build Coastguard Worker return ScopedJavaLocalRef<jintArray>(env, int_array);
73*635a8641SAndroid Build Coastguard Worker }
74*635a8641SAndroid Build Coastguard Worker
ToJavaIntArray(JNIEnv * env,const std::vector<int> & ints)75*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef<jintArray> ToJavaIntArray(
76*635a8641SAndroid Build Coastguard Worker JNIEnv* env, const std::vector<int>& ints) {
77*635a8641SAndroid Build Coastguard Worker return ToJavaIntArray(env, ints.data(), ints.size());
78*635a8641SAndroid Build Coastguard Worker }
79*635a8641SAndroid Build Coastguard Worker
ToJavaLongArray(JNIEnv * env,const int64_t * longs,size_t len)80*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef<jlongArray> ToJavaLongArray(JNIEnv* env,
81*635a8641SAndroid Build Coastguard Worker const int64_t* longs,
82*635a8641SAndroid Build Coastguard Worker size_t len) {
83*635a8641SAndroid Build Coastguard Worker jlongArray long_array = env->NewLongArray(len);
84*635a8641SAndroid Build Coastguard Worker CheckException(env);
85*635a8641SAndroid Build Coastguard Worker DCHECK(long_array);
86*635a8641SAndroid Build Coastguard Worker
87*635a8641SAndroid Build Coastguard Worker env->SetLongArrayRegion(
88*635a8641SAndroid Build Coastguard Worker long_array, 0, len, reinterpret_cast<const jlong*>(longs));
89*635a8641SAndroid Build Coastguard Worker CheckException(env);
90*635a8641SAndroid Build Coastguard Worker
91*635a8641SAndroid Build Coastguard Worker return ScopedJavaLocalRef<jlongArray>(env, long_array);
92*635a8641SAndroid Build Coastguard Worker }
93*635a8641SAndroid Build Coastguard Worker
94*635a8641SAndroid Build Coastguard Worker // Returns a new Java long array converted from the given int64_t array.
ToJavaLongArray(JNIEnv * env,const std::vector<int64_t> & longs)95*635a8641SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jlongArray> ToJavaLongArray(
96*635a8641SAndroid Build Coastguard Worker JNIEnv* env,
97*635a8641SAndroid Build Coastguard Worker const std::vector<int64_t>& longs) {
98*635a8641SAndroid Build Coastguard Worker return ToJavaLongArray(env, longs.data(), longs.size());
99*635a8641SAndroid Build Coastguard Worker }
100*635a8641SAndroid Build Coastguard Worker
101*635a8641SAndroid Build Coastguard Worker // Returns a new Java float array converted from the given C++ float array.
ToJavaFloatArray(JNIEnv * env,const float * floats,size_t len)102*635a8641SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jfloatArray> ToJavaFloatArray(
103*635a8641SAndroid Build Coastguard Worker JNIEnv* env, const float* floats, size_t len) {
104*635a8641SAndroid Build Coastguard Worker jfloatArray float_array = env->NewFloatArray(len);
105*635a8641SAndroid Build Coastguard Worker CheckException(env);
106*635a8641SAndroid Build Coastguard Worker DCHECK(float_array);
107*635a8641SAndroid Build Coastguard Worker
108*635a8641SAndroid Build Coastguard Worker env->SetFloatArrayRegion(
109*635a8641SAndroid Build Coastguard Worker float_array, 0, len, reinterpret_cast<const jfloat*>(floats));
110*635a8641SAndroid Build Coastguard Worker CheckException(env);
111*635a8641SAndroid Build Coastguard Worker
112*635a8641SAndroid Build Coastguard Worker return ScopedJavaLocalRef<jfloatArray>(env, float_array);
113*635a8641SAndroid Build Coastguard Worker }
114*635a8641SAndroid Build Coastguard Worker
ToJavaFloatArray(JNIEnv * env,const std::vector<float> & floats)115*635a8641SAndroid Build Coastguard Worker BASE_EXPORT ScopedJavaLocalRef<jfloatArray> ToJavaFloatArray(
116*635a8641SAndroid Build Coastguard Worker JNIEnv* env,
117*635a8641SAndroid Build Coastguard Worker const std::vector<float>& floats) {
118*635a8641SAndroid Build Coastguard Worker return ToJavaFloatArray(env, floats.data(), floats.size());
119*635a8641SAndroid Build Coastguard Worker }
120*635a8641SAndroid Build Coastguard Worker
ToJavaArrayOfByteArray(JNIEnv * env,const std::vector<std::string> & v)121*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfByteArray(
122*635a8641SAndroid Build Coastguard Worker JNIEnv* env, const std::vector<std::string>& v) {
123*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef<jclass> byte_array_clazz = GetClass(env, "[B");
124*635a8641SAndroid Build Coastguard Worker jobjectArray joa = env->NewObjectArray(v.size(),
125*635a8641SAndroid Build Coastguard Worker byte_array_clazz.obj(), NULL);
126*635a8641SAndroid Build Coastguard Worker CheckException(env);
127*635a8641SAndroid Build Coastguard Worker
128*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < v.size(); ++i) {
129*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef<jbyteArray> byte_array = ToJavaByteArray(
130*635a8641SAndroid Build Coastguard Worker env, reinterpret_cast<const uint8_t*>(v[i].data()), v[i].length());
131*635a8641SAndroid Build Coastguard Worker env->SetObjectArrayElement(joa, i, byte_array.obj());
132*635a8641SAndroid Build Coastguard Worker }
133*635a8641SAndroid Build Coastguard Worker return ScopedJavaLocalRef<jobjectArray>(env, joa);
134*635a8641SAndroid Build Coastguard Worker }
135*635a8641SAndroid Build Coastguard Worker
ToJavaArrayOfStrings(JNIEnv * env,const std::vector<std::string> & v)136*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStrings(
137*635a8641SAndroid Build Coastguard Worker JNIEnv* env, const std::vector<std::string>& v) {
138*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef<jclass> string_clazz = GetClass(env, "java/lang/String");
139*635a8641SAndroid Build Coastguard Worker jobjectArray joa = env->NewObjectArray(v.size(), string_clazz.obj(), NULL);
140*635a8641SAndroid Build Coastguard Worker CheckException(env);
141*635a8641SAndroid Build Coastguard Worker
142*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < v.size(); ++i) {
143*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef<jstring> item = ConvertUTF8ToJavaString(env, v[i]);
144*635a8641SAndroid Build Coastguard Worker env->SetObjectArrayElement(joa, i, item.obj());
145*635a8641SAndroid Build Coastguard Worker }
146*635a8641SAndroid Build Coastguard Worker return ScopedJavaLocalRef<jobjectArray>(env, joa);
147*635a8641SAndroid Build Coastguard Worker }
148*635a8641SAndroid Build Coastguard Worker
ToJavaArrayOfStrings(JNIEnv * env,const std::vector<string16> & v)149*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStrings(
150*635a8641SAndroid Build Coastguard Worker JNIEnv* env, const std::vector<string16>& v) {
151*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef<jclass> string_clazz = GetClass(env, "java/lang/String");
152*635a8641SAndroid Build Coastguard Worker jobjectArray joa = env->NewObjectArray(v.size(), string_clazz.obj(), NULL);
153*635a8641SAndroid Build Coastguard Worker CheckException(env);
154*635a8641SAndroid Build Coastguard Worker
155*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < v.size(); ++i) {
156*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef<jstring> item = ConvertUTF16ToJavaString(env, v[i]);
157*635a8641SAndroid Build Coastguard Worker env->SetObjectArrayElement(joa, i, item.obj());
158*635a8641SAndroid Build Coastguard Worker }
159*635a8641SAndroid Build Coastguard Worker return ScopedJavaLocalRef<jobjectArray>(env, joa);
160*635a8641SAndroid Build Coastguard Worker }
161*635a8641SAndroid Build Coastguard Worker
AppendJavaStringArrayToStringVector(JNIEnv * env,jobjectArray array,std::vector<string16> * out)162*635a8641SAndroid Build Coastguard Worker void AppendJavaStringArrayToStringVector(JNIEnv* env,
163*635a8641SAndroid Build Coastguard Worker jobjectArray array,
164*635a8641SAndroid Build Coastguard Worker std::vector<string16>* out) {
165*635a8641SAndroid Build Coastguard Worker DCHECK(out);
166*635a8641SAndroid Build Coastguard Worker if (!array)
167*635a8641SAndroid Build Coastguard Worker return;
168*635a8641SAndroid Build Coastguard Worker size_t len = SafeGetArrayLength(env, array);
169*635a8641SAndroid Build Coastguard Worker size_t back = out->size();
170*635a8641SAndroid Build Coastguard Worker out->resize(back + len);
171*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < len; ++i) {
172*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef<jstring> str(env,
173*635a8641SAndroid Build Coastguard Worker static_cast<jstring>(env->GetObjectArrayElement(array, i)));
174*635a8641SAndroid Build Coastguard Worker ConvertJavaStringToUTF16(env, str.obj(), out->data() + back + i);
175*635a8641SAndroid Build Coastguard Worker }
176*635a8641SAndroid Build Coastguard Worker }
177*635a8641SAndroid Build Coastguard Worker
AppendJavaStringArrayToStringVector(JNIEnv * env,jobjectArray array,std::vector<std::string> * out)178*635a8641SAndroid Build Coastguard Worker void AppendJavaStringArrayToStringVector(JNIEnv* env,
179*635a8641SAndroid Build Coastguard Worker jobjectArray array,
180*635a8641SAndroid Build Coastguard Worker std::vector<std::string>* out) {
181*635a8641SAndroid Build Coastguard Worker DCHECK(out);
182*635a8641SAndroid Build Coastguard Worker if (!array)
183*635a8641SAndroid Build Coastguard Worker return;
184*635a8641SAndroid Build Coastguard Worker size_t len = SafeGetArrayLength(env, array);
185*635a8641SAndroid Build Coastguard Worker size_t back = out->size();
186*635a8641SAndroid Build Coastguard Worker out->resize(back + len);
187*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < len; ++i) {
188*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef<jstring> str(env,
189*635a8641SAndroid Build Coastguard Worker static_cast<jstring>(env->GetObjectArrayElement(array, i)));
190*635a8641SAndroid Build Coastguard Worker ConvertJavaStringToUTF8(env, str.obj(), out->data() + back + i);
191*635a8641SAndroid Build Coastguard Worker }
192*635a8641SAndroid Build Coastguard Worker }
193*635a8641SAndroid Build Coastguard Worker
AppendJavaByteArrayToByteVector(JNIEnv * env,jbyteArray byte_array,std::vector<uint8_t> * out)194*635a8641SAndroid Build Coastguard Worker void AppendJavaByteArrayToByteVector(JNIEnv* env,
195*635a8641SAndroid Build Coastguard Worker jbyteArray byte_array,
196*635a8641SAndroid Build Coastguard Worker std::vector<uint8_t>* out) {
197*635a8641SAndroid Build Coastguard Worker DCHECK(out);
198*635a8641SAndroid Build Coastguard Worker if (!byte_array)
199*635a8641SAndroid Build Coastguard Worker return;
200*635a8641SAndroid Build Coastguard Worker size_t len = SafeGetArrayLength(env, byte_array);
201*635a8641SAndroid Build Coastguard Worker if (!len)
202*635a8641SAndroid Build Coastguard Worker return;
203*635a8641SAndroid Build Coastguard Worker size_t back = out->size();
204*635a8641SAndroid Build Coastguard Worker out->resize(back + len);
205*635a8641SAndroid Build Coastguard Worker env->GetByteArrayRegion(byte_array, 0, len,
206*635a8641SAndroid Build Coastguard Worker reinterpret_cast<int8_t*>(out->data() + back));
207*635a8641SAndroid Build Coastguard Worker }
208*635a8641SAndroid Build Coastguard Worker
JavaByteArrayToByteVector(JNIEnv * env,jbyteArray byte_array,std::vector<uint8_t> * out)209*635a8641SAndroid Build Coastguard Worker void JavaByteArrayToByteVector(JNIEnv* env,
210*635a8641SAndroid Build Coastguard Worker jbyteArray byte_array,
211*635a8641SAndroid Build Coastguard Worker std::vector<uint8_t>* out) {
212*635a8641SAndroid Build Coastguard Worker DCHECK(out);
213*635a8641SAndroid Build Coastguard Worker DCHECK(byte_array);
214*635a8641SAndroid Build Coastguard Worker out->clear();
215*635a8641SAndroid Build Coastguard Worker AppendJavaByteArrayToByteVector(env, byte_array, out);
216*635a8641SAndroid Build Coastguard Worker }
217*635a8641SAndroid Build Coastguard Worker
JavaBooleanArrayToBoolVector(JNIEnv * env,jbooleanArray boolean_array,std::vector<bool> * out)218*635a8641SAndroid Build Coastguard Worker void JavaBooleanArrayToBoolVector(JNIEnv* env,
219*635a8641SAndroid Build Coastguard Worker jbooleanArray boolean_array,
220*635a8641SAndroid Build Coastguard Worker std::vector<bool>* out) {
221*635a8641SAndroid Build Coastguard Worker DCHECK(out);
222*635a8641SAndroid Build Coastguard Worker if (!boolean_array)
223*635a8641SAndroid Build Coastguard Worker return;
224*635a8641SAndroid Build Coastguard Worker size_t len = SafeGetArrayLength(env, boolean_array);
225*635a8641SAndroid Build Coastguard Worker if (!len)
226*635a8641SAndroid Build Coastguard Worker return;
227*635a8641SAndroid Build Coastguard Worker out->resize(len);
228*635a8641SAndroid Build Coastguard Worker // It is not possible to get bool* out of vector<bool>.
229*635a8641SAndroid Build Coastguard Worker jboolean* values = env->GetBooleanArrayElements(boolean_array, nullptr);
230*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < len; ++i) {
231*635a8641SAndroid Build Coastguard Worker out->at(i) = static_cast<bool>(values[i]);
232*635a8641SAndroid Build Coastguard Worker }
233*635a8641SAndroid Build Coastguard Worker }
234*635a8641SAndroid Build Coastguard Worker
JavaIntArrayToIntVector(JNIEnv * env,jintArray int_array,std::vector<int> * out)235*635a8641SAndroid Build Coastguard Worker void JavaIntArrayToIntVector(JNIEnv* env,
236*635a8641SAndroid Build Coastguard Worker jintArray int_array,
237*635a8641SAndroid Build Coastguard Worker std::vector<int>* out) {
238*635a8641SAndroid Build Coastguard Worker DCHECK(out);
239*635a8641SAndroid Build Coastguard Worker size_t len = SafeGetArrayLength(env, int_array);
240*635a8641SAndroid Build Coastguard Worker out->resize(len);
241*635a8641SAndroid Build Coastguard Worker if (!len)
242*635a8641SAndroid Build Coastguard Worker return;
243*635a8641SAndroid Build Coastguard Worker env->GetIntArrayRegion(int_array, 0, len, out->data());
244*635a8641SAndroid Build Coastguard Worker }
245*635a8641SAndroid Build Coastguard Worker
JavaLongArrayToInt64Vector(JNIEnv * env,jlongArray long_array,std::vector<int64_t> * out)246*635a8641SAndroid Build Coastguard Worker void JavaLongArrayToInt64Vector(JNIEnv* env,
247*635a8641SAndroid Build Coastguard Worker jlongArray long_array,
248*635a8641SAndroid Build Coastguard Worker std::vector<int64_t>* out) {
249*635a8641SAndroid Build Coastguard Worker DCHECK(out);
250*635a8641SAndroid Build Coastguard Worker std::vector<jlong> temp;
251*635a8641SAndroid Build Coastguard Worker JavaLongArrayToLongVector(env, long_array, &temp);
252*635a8641SAndroid Build Coastguard Worker out->resize(0);
253*635a8641SAndroid Build Coastguard Worker out->insert(out->begin(), temp.begin(), temp.end());
254*635a8641SAndroid Build Coastguard Worker }
255*635a8641SAndroid Build Coastguard Worker
JavaLongArrayToLongVector(JNIEnv * env,jlongArray long_array,std::vector<jlong> * out)256*635a8641SAndroid Build Coastguard Worker void JavaLongArrayToLongVector(JNIEnv* env,
257*635a8641SAndroid Build Coastguard Worker jlongArray long_array,
258*635a8641SAndroid Build Coastguard Worker std::vector<jlong>* out) {
259*635a8641SAndroid Build Coastguard Worker DCHECK(out);
260*635a8641SAndroid Build Coastguard Worker size_t len = SafeGetArrayLength(env, long_array);
261*635a8641SAndroid Build Coastguard Worker out->resize(len);
262*635a8641SAndroid Build Coastguard Worker if (!len)
263*635a8641SAndroid Build Coastguard Worker return;
264*635a8641SAndroid Build Coastguard Worker env->GetLongArrayRegion(long_array, 0, len, out->data());
265*635a8641SAndroid Build Coastguard Worker }
266*635a8641SAndroid Build Coastguard Worker
JavaFloatArrayToFloatVector(JNIEnv * env,jfloatArray float_array,std::vector<float> * out)267*635a8641SAndroid Build Coastguard Worker void JavaFloatArrayToFloatVector(JNIEnv* env,
268*635a8641SAndroid Build Coastguard Worker jfloatArray float_array,
269*635a8641SAndroid Build Coastguard Worker std::vector<float>* out) {
270*635a8641SAndroid Build Coastguard Worker DCHECK(out);
271*635a8641SAndroid Build Coastguard Worker size_t len = SafeGetArrayLength(env, float_array);
272*635a8641SAndroid Build Coastguard Worker out->resize(len);
273*635a8641SAndroid Build Coastguard Worker if (!len)
274*635a8641SAndroid Build Coastguard Worker return;
275*635a8641SAndroid Build Coastguard Worker env->GetFloatArrayRegion(float_array, 0, len, out->data());
276*635a8641SAndroid Build Coastguard Worker }
277*635a8641SAndroid Build Coastguard Worker
JavaArrayOfByteArrayToStringVector(JNIEnv * env,jobjectArray array,std::vector<std::string> * out)278*635a8641SAndroid Build Coastguard Worker void JavaArrayOfByteArrayToStringVector(
279*635a8641SAndroid Build Coastguard Worker JNIEnv* env,
280*635a8641SAndroid Build Coastguard Worker jobjectArray array,
281*635a8641SAndroid Build Coastguard Worker std::vector<std::string>* out) {
282*635a8641SAndroid Build Coastguard Worker DCHECK(out);
283*635a8641SAndroid Build Coastguard Worker size_t len = SafeGetArrayLength(env, array);
284*635a8641SAndroid Build Coastguard Worker out->resize(len);
285*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < len; ++i) {
286*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef<jbyteArray> bytes_array(
287*635a8641SAndroid Build Coastguard Worker env, static_cast<jbyteArray>(
288*635a8641SAndroid Build Coastguard Worker env->GetObjectArrayElement(array, i)));
289*635a8641SAndroid Build Coastguard Worker jsize bytes_len = env->GetArrayLength(bytes_array.obj());
290*635a8641SAndroid Build Coastguard Worker jbyte* bytes = env->GetByteArrayElements(bytes_array.obj(), nullptr);
291*635a8641SAndroid Build Coastguard Worker (*out)[i].assign(reinterpret_cast<const char*>(bytes), bytes_len);
292*635a8641SAndroid Build Coastguard Worker env->ReleaseByteArrayElements(bytes_array.obj(), bytes, JNI_ABORT);
293*635a8641SAndroid Build Coastguard Worker }
294*635a8641SAndroid Build Coastguard Worker }
295*635a8641SAndroid Build Coastguard Worker
JavaArrayOfIntArrayToIntVector(JNIEnv * env,jobjectArray array,std::vector<std::vector<int>> * out)296*635a8641SAndroid Build Coastguard Worker void JavaArrayOfIntArrayToIntVector(
297*635a8641SAndroid Build Coastguard Worker JNIEnv* env,
298*635a8641SAndroid Build Coastguard Worker jobjectArray array,
299*635a8641SAndroid Build Coastguard Worker std::vector<std::vector<int>>* out) {
300*635a8641SAndroid Build Coastguard Worker DCHECK(out);
301*635a8641SAndroid Build Coastguard Worker size_t len = SafeGetArrayLength(env, array);
302*635a8641SAndroid Build Coastguard Worker out->resize(len);
303*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < len; ++i) {
304*635a8641SAndroid Build Coastguard Worker ScopedJavaLocalRef<jintArray> int_array(
305*635a8641SAndroid Build Coastguard Worker env, static_cast<jintArray>(env->GetObjectArrayElement(array, i)));
306*635a8641SAndroid Build Coastguard Worker JavaIntArrayToIntVector(env, int_array.obj(), &out->at(i));
307*635a8641SAndroid Build Coastguard Worker }
308*635a8641SAndroid Build Coastguard Worker }
309*635a8641SAndroid Build Coastguard Worker
310*635a8641SAndroid Build Coastguard Worker } // namespace android
311*635a8641SAndroid Build Coastguard Worker } // namespace base
312