base/android: Change JNI array conversion helpers to take spans

Change helper methods ToJavaFooArray() and to ToJavaArrayOfFoo() to take
their input as base::span<> instead of const std::vector<>&. base::span
is implicitly converted from most array-like container types; so
existing callers work unmodified, and new callers can choose to convert
from other types like std::array<>.

Also add an overload of ToJavaArrayOfByteArray() that takes an input
bytes as std::vector<uint8_t> instead of std::string.

Change-Id: Ic9b9327220c4836c01b716299b3ce4ec973b32a5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2109036
Reviewed-by: Richard Coles <[email protected]>
Commit-Queue: Martin Kreichgauer <[email protected]>
Cr-Commit-Position: refs/heads/master@{#751764}
diff --git a/base/android/jni_array.cc b/base/android/jni_array.cc
index c339c39..9626abe 100644
--- a/base/android/jni_array.cc
+++ b/base/android/jni_array.cc
@@ -32,8 +32,8 @@
   CheckException(env);
   DCHECK(byte_array);
 
-  env->SetByteArrayRegion(
-      byte_array, 0, len, reinterpret_cast<const jbyte*>(bytes));
+  env->SetByteArrayRegion(byte_array, 0, len,
+                          reinterpret_cast<const jbyte*>(bytes));
   CheckException(env);
 
   return ScopedJavaLocalRef<jbyteArray>(env, byte_array);
@@ -41,7 +41,7 @@
 
 ScopedJavaLocalRef<jbyteArray> ToJavaByteArray(
     JNIEnv* env,
-    const std::vector<uint8_t>& bytes) {
+    base::span<const uint8_t> bytes) {
   return ToJavaByteArray(env, bytes.data(), bytes.size());
 }
 
@@ -65,21 +65,22 @@
   return ScopedJavaLocalRef<jbooleanArray>(env, boolean_array);
 }
 
-ScopedJavaLocalRef<jintArray> ToJavaIntArray(
-    JNIEnv* env, const int* ints, size_t len) {
+ScopedJavaLocalRef<jintArray> ToJavaIntArray(JNIEnv* env,
+                                             const int* ints,
+                                             size_t len) {
   jintArray int_array = env->NewIntArray(len);
   CheckException(env);
   DCHECK(int_array);
 
-  env->SetIntArrayRegion(
-      int_array, 0, len, reinterpret_cast<const jint*>(ints));
+  env->SetIntArrayRegion(int_array, 0, len,
+                         reinterpret_cast<const jint*>(ints));
   CheckException(env);
 
   return ScopedJavaLocalRef<jintArray>(env, int_array);
 }
 
-ScopedJavaLocalRef<jintArray> ToJavaIntArray(
-    JNIEnv* env, const std::vector<int>& ints) {
+ScopedJavaLocalRef<jintArray> ToJavaIntArray(JNIEnv* env,
+                                             base::span<const int> ints) {
   return ToJavaIntArray(env, ints.data(), ints.size());
 }
 
@@ -90,8 +91,8 @@
   CheckException(env);
   DCHECK(long_array);
 
-  env->SetLongArrayRegion(
-      long_array, 0, len, reinterpret_cast<const jlong*>(longs));
+  env->SetLongArrayRegion(long_array, 0, len,
+                          reinterpret_cast<const jlong*>(longs));
   CheckException(env);
 
   return ScopedJavaLocalRef<jlongArray>(env, long_array);
@@ -100,19 +101,19 @@
 // Returns a new Java long array converted from the given int64_t array.
 BASE_EXPORT ScopedJavaLocalRef<jlongArray> ToJavaLongArray(
     JNIEnv* env,
-    const std::vector<int64_t>& longs) {
+    base::span<const int64_t> longs) {
   return ToJavaLongArray(env, longs.data(), longs.size());
 }
 
 // Returns a new Java float array converted from the given C++ float array.
-BASE_EXPORT ScopedJavaLocalRef<jfloatArray> ToJavaFloatArray(
-    JNIEnv* env, const float* floats, size_t len) {
+BASE_EXPORT ScopedJavaLocalRef<jfloatArray>
+ToJavaFloatArray(JNIEnv* env, const float* floats, size_t len) {
   jfloatArray float_array = env->NewFloatArray(len);
   CheckException(env);
   DCHECK(float_array);
 
-  env->SetFloatArrayRegion(
-      float_array, 0, len, reinterpret_cast<const jfloat*>(floats));
+  env->SetFloatArrayRegion(float_array, 0, len,
+                           reinterpret_cast<const jfloat*>(floats));
   CheckException(env);
 
   return ScopedJavaLocalRef<jfloatArray>(env, float_array);
@@ -120,7 +121,7 @@
 
 BASE_EXPORT ScopedJavaLocalRef<jfloatArray> ToJavaFloatArray(
     JNIEnv* env,
-    const std::vector<float>& floats) {
+    base::span<const float> floats) {
   return ToJavaFloatArray(env, floats.data(), floats.size());
 }
 
@@ -139,15 +140,16 @@
 
 BASE_EXPORT ScopedJavaLocalRef<jdoubleArray> ToJavaDoubleArray(
     JNIEnv* env,
-    const std::vector<double>& doubles) {
+    base::span<const double> doubles) {
   return ToJavaDoubleArray(env, doubles.data(), doubles.size());
 }
 
 ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfByteArray(
-    JNIEnv* env, const std::vector<std::string>& v) {
+    JNIEnv* env,
+    base::span<const std::string> v) {
   ScopedJavaLocalRef<jclass> byte_array_clazz = GetClass(env, "[B");
-  jobjectArray joa = env->NewObjectArray(v.size(),
-                                         byte_array_clazz.obj(), NULL);
+  jobjectArray joa =
+      env->NewObjectArray(v.size(), byte_array_clazz.obj(), nullptr);
   CheckException(env);
 
   for (size_t i = 0; i < v.size(); ++i) {
@@ -158,10 +160,27 @@
   return ScopedJavaLocalRef<jobjectArray>(env, joa);
 }
 
+ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfByteArray(
+    JNIEnv* env,
+    base::span<std::vector<uint8_t>> v) {
+  ScopedJavaLocalRef<jclass> byte_array_clazz = GetClass(env, "[B");
+  jobjectArray joa =
+      env->NewObjectArray(v.size(), byte_array_clazz.obj(), nullptr);
+  CheckException(env);
+
+  for (size_t i = 0; i < v.size(); ++i) {
+    ScopedJavaLocalRef<jbyteArray> byte_array =
+        ToJavaByteArray(env, v[i].data(), v[i].size());
+    env->SetObjectArrayElement(joa, i, byte_array.obj());
+  }
+  return ScopedJavaLocalRef<jobjectArray>(env, joa);
+}
+
 ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStrings(
-    JNIEnv* env, const std::vector<std::string>& v) {
+    JNIEnv* env,
+    base::span<const std::string> v) {
   ScopedJavaLocalRef<jclass> string_clazz = GetClass(env, "java/lang/String");
-  jobjectArray joa = env->NewObjectArray(v.size(), string_clazz.obj(), NULL);
+  jobjectArray joa = env->NewObjectArray(v.size(), string_clazz.obj(), nullptr);
   CheckException(env);
 
   for (size_t i = 0; i < v.size(); ++i) {
@@ -173,12 +192,12 @@
 
 ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStringArray(
     JNIEnv* env,
-    const std::vector<std::vector<string16>>& vec_outer) {
+    base::span<const std::vector<string16>> vec_outer) {
   ScopedJavaLocalRef<jclass> string_array_clazz =
       GetClass(env, "[Ljava/lang/String;");
 
   jobjectArray joa =
-      env->NewObjectArray(vec_outer.size(), string_array_clazz.obj(), NULL);
+      env->NewObjectArray(vec_outer.size(), string_array_clazz.obj(), nullptr);
   CheckException(env);
 
   for (size_t i = 0; i < vec_outer.size(); ++i) {
@@ -191,9 +210,10 @@
 }
 
 ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStrings(
-    JNIEnv* env, const std::vector<string16>& v) {
+    JNIEnv* env,
+    base::span<const string16> v) {
   ScopedJavaLocalRef<jclass> string_clazz = GetClass(env, "java/lang/String");
-  jobjectArray joa = env->NewObjectArray(v.size(), string_clazz.obj(), NULL);
+  jobjectArray joa = env->NewObjectArray(v.size(), string_clazz.obj(), nullptr);
   CheckException(env);
 
   for (size_t i = 0; i < v.size(); ++i) {