blob: 596914b26c91270f71a4168f64e60c1d90b1347c [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
[email protected]61c86c62011-08-02 16:11:167#include "base/android/jni_android.h"
[email protected]f98d7b92011-09-09 10:17:358#include "base/android/jni_string.h"
[email protected]61c86c62011-08-02 16:11:169#include "base/logging.h"
10
11namespace base {
12namespace android {
13
[email protected]fe0f1ab2012-02-09 21:02:2714ScopedJavaLocalRef<jbyteArray> ToJavaByteArray(
15 JNIEnv* env, const uint8* bytes, size_t len) {
[email protected]61c86c62011-08-02 16:11:1616 jbyteArray byte_array = env->NewByteArray(len);
[email protected]f98d7b92011-09-09 10:17:3517 CheckException(env);
[email protected]a42d4632011-10-26 21:48:0018 DCHECK(byte_array);
[email protected]61c86c62011-08-02 16:11:1619
20 jbyte* elements = env->GetByteArrayElements(byte_array, NULL);
[email protected]61c86c62011-08-02 16:11:1621 memcpy(elements, bytes, len);
22 env->ReleaseByteArrayElements(byte_array, elements, 0);
23 CheckException(env);
24
[email protected]fe0f1ab2012-02-09 21:02:2725 return ScopedJavaLocalRef<jbyteArray>(env, byte_array);
[email protected]61c86c62011-08-02 16:11:1626}
27
[email protected]2a3a0592013-02-22 18:53:0428ScopedJavaLocalRef<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.
43BASE_EXPORT ScopedJavaLocalRef<jlongArray> ToJavaLongArray(
44 JNIEnv* env, const std::vector<int64>& longs) {
45 return ToJavaLongArray(env, longs.begin(), longs.size());
46}
47
[email protected]fe0f1ab2012-02-09 21:02:2748ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfByteArray(
49 JNIEnv* env, const std::vector<std::string>& v) {
50 ScopedJavaLocalRef<jclass> byte_array_clazz = GetClass(env, "[B");
[email protected]f98d7b92011-09-09 10:17:3551 jobjectArray joa = env->NewObjectArray(v.size(),
52 byte_array_clazz.obj(), NULL);
53 CheckException(env);
[email protected]61c86c62011-08-02 16:11:1654
[email protected]f98d7b92011-09-09 10:17:3555 for (size_t i = 0; i < v.size(); ++i) {
[email protected]fe0f1ab2012-02-09 21:02:2756 ScopedJavaLocalRef<jbyteArray> byte_array = ToJavaByteArray(env,
57 reinterpret_cast<const uint8*>(v[i].data()), v[i].length());
[email protected]61c86c62011-08-02 16:11:1658 env->SetObjectArrayElement(joa, i, byte_array.obj());
59 }
[email protected]fe0f1ab2012-02-09 21:02:2760 return ScopedJavaLocalRef<jobjectArray>(env, joa);
[email protected]61c86c62011-08-02 16:11:1661}
62
[email protected]fe0f1ab2012-02-09 21:02:2763ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStrings(
64 JNIEnv* env, const std::vector<std::string>& v) {
65 ScopedJavaLocalRef<jclass> string_clazz = GetClass(env, "java/lang/String");
[email protected]f98d7b92011-09-09 10:17:3566 jobjectArray joa = env->NewObjectArray(v.size(), string_clazz.obj(), NULL);
67 CheckException(env);
68
69 for (size_t i = 0; i < v.size(); ++i) {
[email protected]fe0f1ab2012-02-09 21:02:2770 ScopedJavaLocalRef<jstring> item = ConvertUTF8ToJavaString(env, v[i]);
[email protected]f98d7b92011-09-09 10:17:3571 env->SetObjectArrayElement(joa, i, item.obj());
72 }
[email protected]fe0f1ab2012-02-09 21:02:2773 return ScopedJavaLocalRef<jobjectArray>(env, joa);
74}
75
[email protected]80ec0c32012-04-24 23:55:2076ScopedJavaLocalRef<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
89void AppendJavaStringArrayToStringVector(JNIEnv* env,
[email protected]b8452fa2012-06-15 01:41:4190 jobjectArray array,
[email protected]80ec0c32012-04-24 23:55:2091 std::vector<string16>* out) {
92 DCHECK(out);
[email protected]b8452fa2012-06-15 01:41:4193 if (!array)
[email protected]80ec0c32012-04-24 23:55:2094 return;
[email protected]b8452fa2012-06-15 01:41:4195 jsize len = env->GetArrayLength(array);
[email protected]df0d7142012-12-14 01:31:1796 size_t back = out->size();
97 out->resize(back + len);
[email protected]80ec0c32012-04-24 23:55:2098 for (jsize i = 0; i < len; ++i) {
99 ScopedJavaLocalRef<jstring> str(env,
[email protected]b8452fa2012-06-15 01:41:41100 static_cast<jstring>(env->GetObjectArrayElement(array, i)));
[email protected]df0d7142012-12-14 01:31:17101 ConvertJavaStringToUTF16(env, str.obj(), &((*out)[back + i]));
[email protected]80ec0c32012-04-24 23:55:20102 }
103}
104
[email protected]380a2ce2012-06-18 18:48:55105void 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);
[email protected]df0d7142012-12-14 01:31:17112 size_t back = out->size();
113 out->resize(back + len);
[email protected]380a2ce2012-06-18 18:48:55114 for (jsize i = 0; i < len; ++i) {
115 ScopedJavaLocalRef<jstring> str(env,
116 static_cast<jstring>(env->GetObjectArrayElement(array, i)));
[email protected]df0d7142012-12-14 01:31:17117 ConvertJavaStringToUTF8(env, str.obj(), &((*out)[back + i]));
[email protected]380a2ce2012-06-18 18:48:55118 }
119}
120
[email protected]fe0f1ab2012-02-09 21:02:27121void 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
133void JavaByteArrayToByteVector(JNIEnv* env,
134 jbyteArray byte_array,
135 std::vector<uint8>* out) {
136 DCHECK(out);
137 out->clear();
138 AppendJavaByteArrayToByteVector(env, byte_array, out);
[email protected]f98d7b92011-09-09 10:17:35139}
140
[email protected]30935362012-06-28 21:26:23141void JavaIntArrayToIntVector(JNIEnv* env,
142 jintArray array,
143 std::vector<int>* out) {
144 DCHECK(out);
145 out->clear();
146 jsize len = env->GetArrayLength(array);
147 jint* ints = env->GetIntArrayElements(array, NULL);
148 for (jsize i = 0; i < len; ++i) {
149 out->push_back(static_cast<int>(ints[i]));
150 }
151 env->ReleaseIntArrayElements(array, ints, JNI_ABORT);
152}
153
[email protected]65d58352012-12-05 15:00:28154void JavaArrayOfByteArrayToStringVector(
155 JNIEnv* env,
156 jobjectArray array,
157 std::vector<std::string>* out) {
158 DCHECK(out);
159 out->clear();
160 jsize len = env->GetArrayLength(array);
[email protected]df0d7142012-12-14 01:31:17161 out->resize(len);
[email protected]65d58352012-12-05 15:00:28162 for (jsize i = 0; i < len; ++i) {
163 jbyteArray bytes_array = static_cast<jbyteArray>(
164 env->GetObjectArrayElement(array, i));
165 jsize bytes_len = env->GetArrayLength(bytes_array);
166 jbyte* bytes = env->GetByteArrayElements(bytes_array, NULL);
[email protected]df0d7142012-12-14 01:31:17167 (*out)[i].assign(reinterpret_cast<const char*>(bytes), bytes_len);
[email protected]65d58352012-12-05 15:00:28168 env->ReleaseByteArrayElements(bytes_array, bytes, JNI_ABORT);
169 }
170}
171
[email protected]61c86c62011-08-02 16:11:16172} // namespace android
173} // namespace base