Home | History | Annotate | Download | only in android
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/android/jni_array.h"
      6 
      7 #include "base/android/jni_android.h"
      8 #include "base/android/jni_string.h"
      9 #include "base/logging.h"
     10 
     11 namespace base {
     12 namespace android {
     13 
     14 ScopedJavaLocalRef<jbyteArray> ToJavaByteArray(
     15     JNIEnv* env, const uint8* bytes, size_t len) {
     16   jbyteArray byte_array = env->NewByteArray(len);
     17   CheckException(env);
     18   DCHECK(byte_array);
     19 
     20   jbyte* elements = env->GetByteArrayElements(byte_array, NULL);
     21   memcpy(elements, bytes, len);
     22   env->ReleaseByteArrayElements(byte_array, elements, 0);
     23   CheckException(env);
     24 
     25   return ScopedJavaLocalRef<jbyteArray>(env, byte_array);
     26 }
     27 
     28 ScopedJavaLocalRef<jlongArray> ToJavaLongArray(
     29     JNIEnv* env, const int64* longs, size_t len) {
     30   jlongArray long_array = env->NewLongArray(len);
     31   CheckException(env);
     32   DCHECK(long_array);
     33 
     34   jlong* elements = env->GetLongArrayElements(long_array, NULL);
     35   memcpy(elements, longs, len * sizeof(*longs));
     36   env->ReleaseLongArrayElements(long_array, elements, 0);
     37   CheckException(env);
     38 
     39   return ScopedJavaLocalRef<jlongArray>(env, long_array);
     40 }
     41 
     42 // Returns a new Java long array converted from the given int64 array.
     43 BASE_EXPORT ScopedJavaLocalRef<jlongArray> ToJavaLongArray(
     44     JNIEnv* env, const std::vector<int64>& longs) {
     45   return ToJavaLongArray(env, longs.begin(), longs.size());
     46 }
     47 
     48 ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfByteArray(
     49     JNIEnv* env, const std::vector<std::string>& v) {
     50   ScopedJavaLocalRef<jclass> byte_array_clazz = GetClass(env, "[B");
     51   jobjectArray joa = env->NewObjectArray(v.size(),
     52                                          byte_array_clazz.obj(), NULL);
     53   CheckException(env);
     54 
     55   for (size_t i = 0; i < v.size(); ++i) {
     56     ScopedJavaLocalRef<jbyteArray> byte_array = ToJavaByteArray(env,
     57         reinterpret_cast<const uint8*>(v[i].data()), v[i].length());
     58     env->SetObjectArrayElement(joa, i, byte_array.obj());
     59   }
     60   return ScopedJavaLocalRef<jobjectArray>(env, joa);
     61 }
     62 
     63 ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStrings(
     64     JNIEnv* env, const std::vector<std::string>& v) {
     65   ScopedJavaLocalRef<jclass> string_clazz = GetClass(env, "java/lang/String");
     66   jobjectArray joa = env->NewObjectArray(v.size(), string_clazz.obj(), NULL);
     67   CheckException(env);
     68 
     69   for (size_t i = 0; i < v.size(); ++i) {
     70     ScopedJavaLocalRef<jstring> item = ConvertUTF8ToJavaString(env, v[i]);
     71     env->SetObjectArrayElement(joa, i, item.obj());
     72   }
     73   return ScopedJavaLocalRef<jobjectArray>(env, joa);
     74 }
     75 
     76 ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStrings(
     77     JNIEnv* env, const std::vector<string16>& v) {
     78   ScopedJavaLocalRef<jclass> string_clazz = GetClass(env, "java/lang/String");
     79   jobjectArray joa = env->NewObjectArray(v.size(), string_clazz.obj(), NULL);
     80   CheckException(env);
     81 
     82   for (size_t i = 0; i < v.size(); ++i) {
     83     ScopedJavaLocalRef<jstring> item = ConvertUTF16ToJavaString(env, v[i]);
     84     env->SetObjectArrayElement(joa, i, item.obj());
     85   }
     86   return ScopedJavaLocalRef<jobjectArray>(env, joa);
     87 }
     88 
     89 void AppendJavaStringArrayToStringVector(JNIEnv* env,
     90                                          jobjectArray array,
     91                                          std::vector<string16>* out) {
     92   DCHECK(out);
     93   if (!array)
     94     return;
     95   jsize len = env->GetArrayLength(array);
     96   size_t back = out->size();
     97   out->resize(back + len);
     98   for (jsize i = 0; i < len; ++i) {
     99     ScopedJavaLocalRef<jstring> str(env,
    100         static_cast<jstring>(env->GetObjectArrayElement(array, i)));
    101     ConvertJavaStringToUTF16(env, str.obj(), &((*out)[back + i]));
    102   }
    103 }
    104 
    105 void AppendJavaStringArrayToStringVector(JNIEnv* env,
    106                                          jobjectArray array,
    107                                          std::vector<std::string>* out) {
    108   DCHECK(out);
    109   if (!array)
    110     return;
    111   jsize len = env->GetArrayLength(array);
    112   size_t back = out->size();
    113   out->resize(back + len);
    114   for (jsize i = 0; i < len; ++i) {
    115     ScopedJavaLocalRef<jstring> str(env,
    116         static_cast<jstring>(env->GetObjectArrayElement(array, i)));
    117     ConvertJavaStringToUTF8(env, str.obj(), &((*out)[back + i]));
    118   }
    119 }
    120 
    121 void AppendJavaByteArrayToByteVector(JNIEnv* env,
    122                                      jbyteArray byte_array,
    123                                      std::vector<uint8>* out) {
    124   DCHECK(out);
    125   if (!byte_array)
    126     return;
    127   jsize len = env->GetArrayLength(byte_array);
    128   jbyte* bytes = env->GetByteArrayElements(byte_array, NULL);
    129   out->insert(out->end(), bytes, bytes + len);
    130   env->ReleaseByteArrayElements(byte_array, bytes, JNI_ABORT);
    131 }
    132 
    133 void JavaByteArrayToByteVector(JNIEnv* env,
    134                                jbyteArray byte_array,
    135                                std::vector<uint8>* out) {
    136   DCHECK(out);
    137   out->clear();
    138   AppendJavaByteArrayToByteVector(env, byte_array, out);
    139 }
    140 
    141 void JavaIntArrayToIntVector(JNIEnv* env,
    142                              jintArray int_array,
    143                              std::vector<int>* out) {
    144   DCHECK(out);
    145   out->clear();
    146   jsize len = env->GetArrayLength(int_array);
    147   jint* ints = env->GetIntArrayElements(int_array, NULL);
    148   for (jsize i = 0; i < len; ++i) {
    149     out->push_back(static_cast<int>(ints[i]));
    150   }
    151   env->ReleaseIntArrayElements(int_array, ints, JNI_ABORT);
    152 }
    153 
    154 void JavaFloatArrayToFloatVector(JNIEnv* env,
    155                                  jfloatArray float_array,
    156                                  std::vector<float>* out) {
    157   DCHECK(out);
    158   out->clear();
    159   jsize len = env->GetArrayLength(float_array);
    160   jfloat* floats = env->GetFloatArrayElements(float_array, NULL);
    161   for (jsize i = 0; i < len; ++i) {
    162     out->push_back(static_cast<float>(floats[i]));
    163   }
    164   env->ReleaseFloatArrayElements(float_array, floats, JNI_ABORT);
    165 }
    166 
    167 void JavaArrayOfByteArrayToStringVector(
    168     JNIEnv* env,
    169     jobjectArray array,
    170     std::vector<std::string>* out) {
    171   DCHECK(out);
    172   out->clear();
    173   jsize len = env->GetArrayLength(array);
    174   out->resize(len);
    175   for (jsize i = 0; i < len; ++i) {
    176     jbyteArray bytes_array = static_cast<jbyteArray>(
    177         env->GetObjectArrayElement(array, i));
    178     jsize bytes_len = env->GetArrayLength(bytes_array);
    179     jbyte* bytes = env->GetByteArrayElements(bytes_array, NULL);
    180     (*out)[i].assign(reinterpret_cast<const char*>(bytes), bytes_len);
    181     env->ReleaseByteArrayElements(bytes_array, bytes, JNI_ABORT);
    182   }
    183 }
    184 
    185 }  // namespace android
    186 }  // namespace base
    187