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<jintArray> ToJavaIntArray( 29 JNIEnv* env, const int* ints, size_t len) { 30 jintArray int_array = env->NewIntArray(len); 31 CheckException(env); 32 DCHECK(int_array); 33 34 jint* elements = env->GetIntArrayElements(int_array, NULL); 35 memcpy(elements, ints, len * sizeof(*ints)); 36 env->ReleaseIntArrayElements(int_array, elements, 0); 37 CheckException(env); 38 39 return ScopedJavaLocalRef<jintArray>(env, int_array); 40 } 41 42 ScopedJavaLocalRef<jintArray> ToJavaIntArray( 43 JNIEnv* env, const std::vector<int>& ints) { 44 return ToJavaIntArray(env, ints.begin(), ints.size()); 45 } 46 47 ScopedJavaLocalRef<jlongArray> ToJavaLongArray( 48 JNIEnv* env, const int64* longs, size_t len) { 49 jlongArray long_array = env->NewLongArray(len); 50 CheckException(env); 51 DCHECK(long_array); 52 53 jlong* elements = env->GetLongArrayElements(long_array, NULL); 54 memcpy(elements, longs, len * sizeof(*longs)); 55 env->ReleaseLongArrayElements(long_array, elements, 0); 56 CheckException(env); 57 58 return ScopedJavaLocalRef<jlongArray>(env, long_array); 59 } 60 61 // Returns a new Java long array converted from the given int64 array. 62 BASE_EXPORT ScopedJavaLocalRef<jlongArray> ToJavaLongArray( 63 JNIEnv* env, const std::vector<int64>& longs) { 64 return ToJavaLongArray(env, longs.begin(), longs.size()); 65 } 66 67 ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfByteArray( 68 JNIEnv* env, const std::vector<std::string>& v) { 69 ScopedJavaLocalRef<jclass> byte_array_clazz = GetClass(env, "[B"); 70 jobjectArray joa = env->NewObjectArray(v.size(), 71 byte_array_clazz.obj(), NULL); 72 CheckException(env); 73 74 for (size_t i = 0; i < v.size(); ++i) { 75 ScopedJavaLocalRef<jbyteArray> byte_array = ToJavaByteArray(env, 76 reinterpret_cast<const uint8*>(v[i].data()), v[i].length()); 77 env->SetObjectArrayElement(joa, i, byte_array.obj()); 78 } 79 return ScopedJavaLocalRef<jobjectArray>(env, joa); 80 } 81 82 ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStrings( 83 JNIEnv* env, const std::vector<std::string>& v) { 84 ScopedJavaLocalRef<jclass> string_clazz = GetClass(env, "java/lang/String"); 85 jobjectArray joa = env->NewObjectArray(v.size(), string_clazz.obj(), NULL); 86 CheckException(env); 87 88 for (size_t i = 0; i < v.size(); ++i) { 89 ScopedJavaLocalRef<jstring> item = ConvertUTF8ToJavaString(env, v[i]); 90 env->SetObjectArrayElement(joa, i, item.obj()); 91 } 92 return ScopedJavaLocalRef<jobjectArray>(env, joa); 93 } 94 95 ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStrings( 96 JNIEnv* env, const std::vector<string16>& v) { 97 ScopedJavaLocalRef<jclass> string_clazz = GetClass(env, "java/lang/String"); 98 jobjectArray joa = env->NewObjectArray(v.size(), string_clazz.obj(), NULL); 99 CheckException(env); 100 101 for (size_t i = 0; i < v.size(); ++i) { 102 ScopedJavaLocalRef<jstring> item = ConvertUTF16ToJavaString(env, v[i]); 103 env->SetObjectArrayElement(joa, i, item.obj()); 104 } 105 return ScopedJavaLocalRef<jobjectArray>(env, joa); 106 } 107 108 void AppendJavaStringArrayToStringVector(JNIEnv* env, 109 jobjectArray array, 110 std::vector<string16>* out) { 111 DCHECK(out); 112 if (!array) 113 return; 114 jsize len = env->GetArrayLength(array); 115 size_t back = out->size(); 116 out->resize(back + len); 117 for (jsize i = 0; i < len; ++i) { 118 ScopedJavaLocalRef<jstring> str(env, 119 static_cast<jstring>(env->GetObjectArrayElement(array, i))); 120 ConvertJavaStringToUTF16(env, str.obj(), &((*out)[back + i])); 121 } 122 } 123 124 void AppendJavaStringArrayToStringVector(JNIEnv* env, 125 jobjectArray array, 126 std::vector<std::string>* out) { 127 DCHECK(out); 128 if (!array) 129 return; 130 jsize len = env->GetArrayLength(array); 131 size_t back = out->size(); 132 out->resize(back + len); 133 for (jsize i = 0; i < len; ++i) { 134 ScopedJavaLocalRef<jstring> str(env, 135 static_cast<jstring>(env->GetObjectArrayElement(array, i))); 136 ConvertJavaStringToUTF8(env, str.obj(), &((*out)[back + i])); 137 } 138 } 139 140 void AppendJavaByteArrayToByteVector(JNIEnv* env, 141 jbyteArray byte_array, 142 std::vector<uint8>* out) { 143 DCHECK(out); 144 if (!byte_array) 145 return; 146 jsize len = env->GetArrayLength(byte_array); 147 jbyte* bytes = env->GetByteArrayElements(byte_array, NULL); 148 out->insert(out->end(), bytes, bytes + len); 149 env->ReleaseByteArrayElements(byte_array, bytes, JNI_ABORT); 150 } 151 152 void JavaByteArrayToByteVector(JNIEnv* env, 153 jbyteArray byte_array, 154 std::vector<uint8>* out) { 155 DCHECK(out); 156 out->clear(); 157 AppendJavaByteArrayToByteVector(env, byte_array, out); 158 } 159 160 void JavaIntArrayToIntVector(JNIEnv* env, 161 jintArray int_array, 162 std::vector<int>* out) { 163 DCHECK(out); 164 out->clear(); 165 jsize len = env->GetArrayLength(int_array); 166 jint* ints = env->GetIntArrayElements(int_array, NULL); 167 for (jsize i = 0; i < len; ++i) { 168 out->push_back(static_cast<int>(ints[i])); 169 } 170 env->ReleaseIntArrayElements(int_array, ints, JNI_ABORT); 171 } 172 173 void JavaFloatArrayToFloatVector(JNIEnv* env, 174 jfloatArray float_array, 175 std::vector<float>* out) { 176 DCHECK(out); 177 out->clear(); 178 jsize len = env->GetArrayLength(float_array); 179 jfloat* floats = env->GetFloatArrayElements(float_array, NULL); 180 for (jsize i = 0; i < len; ++i) { 181 out->push_back(static_cast<float>(floats[i])); 182 } 183 env->ReleaseFloatArrayElements(float_array, floats, JNI_ABORT); 184 } 185 186 void JavaArrayOfByteArrayToStringVector( 187 JNIEnv* env, 188 jobjectArray array, 189 std::vector<std::string>* out) { 190 DCHECK(out); 191 out->clear(); 192 jsize len = env->GetArrayLength(array); 193 out->resize(len); 194 for (jsize i = 0; i < len; ++i) { 195 jbyteArray bytes_array = static_cast<jbyteArray>( 196 env->GetObjectArrayElement(array, i)); 197 jsize bytes_len = env->GetArrayLength(bytes_array); 198 jbyte* bytes = env->GetByteArrayElements(bytes_array, NULL); 199 (*out)[i].assign(reinterpret_cast<const char*>(bytes), bytes_len); 200 env->ReleaseByteArrayElements(bytes_array, bytes, JNI_ABORT); 201 } 202 } 203 204 } // namespace android 205 } // namespace base 206