blob: fe2aadb745c087386bf01512108a2c6235c1d3d8 [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]fe0f1ab2012-02-09 21:02:2728ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfByteArray(
29 JNIEnv* env, const std::vector<std::string>& v) {
30 ScopedJavaLocalRef<jclass> byte_array_clazz = GetClass(env, "[B");
[email protected]f98d7b92011-09-09 10:17:3531 jobjectArray joa = env->NewObjectArray(v.size(),
32 byte_array_clazz.obj(), NULL);
33 CheckException(env);
[email protected]61c86c62011-08-02 16:11:1634
[email protected]f98d7b92011-09-09 10:17:3535 for (size_t i = 0; i < v.size(); ++i) {
[email protected]fe0f1ab2012-02-09 21:02:2736 ScopedJavaLocalRef<jbyteArray> byte_array = ToJavaByteArray(env,
37 reinterpret_cast<const uint8*>(v[i].data()), v[i].length());
[email protected]61c86c62011-08-02 16:11:1638 env->SetObjectArrayElement(joa, i, byte_array.obj());
39 }
[email protected]fe0f1ab2012-02-09 21:02:2740 return ScopedJavaLocalRef<jobjectArray>(env, joa);
[email protected]61c86c62011-08-02 16:11:1641}
42
[email protected]fe0f1ab2012-02-09 21:02:2743ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStrings(
44 JNIEnv* env, const std::vector<std::string>& v) {
45 ScopedJavaLocalRef<jclass> string_clazz = GetClass(env, "java/lang/String");
[email protected]f98d7b92011-09-09 10:17:3546 jobjectArray joa = env->NewObjectArray(v.size(), string_clazz.obj(), NULL);
47 CheckException(env);
48
49 for (size_t i = 0; i < v.size(); ++i) {
[email protected]fe0f1ab2012-02-09 21:02:2750 ScopedJavaLocalRef<jstring> item = ConvertUTF8ToJavaString(env, v[i]);
[email protected]f98d7b92011-09-09 10:17:3551 env->SetObjectArrayElement(joa, i, item.obj());
52 }
[email protected]fe0f1ab2012-02-09 21:02:2753 return ScopedJavaLocalRef<jobjectArray>(env, joa);
54}
55
[email protected]80ec0c32012-04-24 23:55:2056ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStrings(
57 JNIEnv* env, const std::vector<string16>& v) {
58 ScopedJavaLocalRef<jclass> string_clazz = GetClass(env, "java/lang/String");
59 jobjectArray joa = env->NewObjectArray(v.size(), string_clazz.obj(), NULL);
60 CheckException(env);
61
62 for (size_t i = 0; i < v.size(); ++i) {
63 ScopedJavaLocalRef<jstring> item = ConvertUTF16ToJavaString(env, v[i]);
64 env->SetObjectArrayElement(joa, i, item.obj());
65 }
66 return ScopedJavaLocalRef<jobjectArray>(env, joa);
67}
68
69void AppendJavaStringArrayToStringVector(JNIEnv* env,
[email protected]b8452fa2012-06-15 01:41:4170 jobjectArray array,
[email protected]80ec0c32012-04-24 23:55:2071 std::vector<string16>* out) {
72 DCHECK(out);
[email protected]b8452fa2012-06-15 01:41:4173 if (!array)
[email protected]80ec0c32012-04-24 23:55:2074 return;
[email protected]b8452fa2012-06-15 01:41:4175 jsize len = env->GetArrayLength(array);
[email protected]df0d7142012-12-14 01:31:1776 size_t back = out->size();
77 out->resize(back + len);
[email protected]80ec0c32012-04-24 23:55:2078 for (jsize i = 0; i < len; ++i) {
79 ScopedJavaLocalRef<jstring> str(env,
[email protected]b8452fa2012-06-15 01:41:4180 static_cast<jstring>(env->GetObjectArrayElement(array, i)));
[email protected]df0d7142012-12-14 01:31:1781 ConvertJavaStringToUTF16(env, str.obj(), &((*out)[back + i]));
[email protected]80ec0c32012-04-24 23:55:2082 }
83}
84
[email protected]380a2ce2012-06-18 18:48:5585void AppendJavaStringArrayToStringVector(JNIEnv* env,
86 jobjectArray array,
87 std::vector<std::string>* out) {
88 DCHECK(out);
89 if (!array)
90 return;
91 jsize len = env->GetArrayLength(array);
[email protected]df0d7142012-12-14 01:31:1792 size_t back = out->size();
93 out->resize(back + len);
[email protected]380a2ce2012-06-18 18:48:5594 for (jsize i = 0; i < len; ++i) {
95 ScopedJavaLocalRef<jstring> str(env,
96 static_cast<jstring>(env->GetObjectArrayElement(array, i)));
[email protected]df0d7142012-12-14 01:31:1797 ConvertJavaStringToUTF8(env, str.obj(), &((*out)[back + i]));
[email protected]380a2ce2012-06-18 18:48:5598 }
99}
100
[email protected]fe0f1ab2012-02-09 21:02:27101void AppendJavaByteArrayToByteVector(JNIEnv* env,
102 jbyteArray byte_array,
103 std::vector<uint8>* out) {
104 DCHECK(out);
105 if (!byte_array)
106 return;
107 jsize len = env->GetArrayLength(byte_array);
108 jbyte* bytes = env->GetByteArrayElements(byte_array, NULL);
109 out->insert(out->end(), bytes, bytes + len);
110 env->ReleaseByteArrayElements(byte_array, bytes, JNI_ABORT);
111}
112
113void JavaByteArrayToByteVector(JNIEnv* env,
114 jbyteArray byte_array,
115 std::vector<uint8>* out) {
116 DCHECK(out);
117 out->clear();
118 AppendJavaByteArrayToByteVector(env, byte_array, out);
[email protected]f98d7b92011-09-09 10:17:35119}
120
[email protected]30935362012-06-28 21:26:23121void JavaIntArrayToIntVector(JNIEnv* env,
122 jintArray array,
123 std::vector<int>* out) {
124 DCHECK(out);
125 out->clear();
126 jsize len = env->GetArrayLength(array);
127 jint* ints = env->GetIntArrayElements(array, NULL);
128 for (jsize i = 0; i < len; ++i) {
129 out->push_back(static_cast<int>(ints[i]));
130 }
131 env->ReleaseIntArrayElements(array, ints, JNI_ABORT);
132}
133
[email protected]65d58352012-12-05 15:00:28134void JavaArrayOfByteArrayToStringVector(
135 JNIEnv* env,
136 jobjectArray array,
137 std::vector<std::string>* out) {
138 DCHECK(out);
139 out->clear();
140 jsize len = env->GetArrayLength(array);
[email protected]df0d7142012-12-14 01:31:17141 out->resize(len);
[email protected]65d58352012-12-05 15:00:28142 for (jsize i = 0; i < len; ++i) {
143 jbyteArray bytes_array = static_cast<jbyteArray>(
144 env->GetObjectArrayElement(array, i));
145 jsize bytes_len = env->GetArrayLength(bytes_array);
146 jbyte* bytes = env->GetByteArrayElements(bytes_array, NULL);
[email protected]df0d7142012-12-14 01:31:17147 (*out)[i].assign(reinterpret_cast<const char*>(bytes), bytes_len);
[email protected]65d58352012-12-05 15:00:28148 env->ReleaseByteArrayElements(bytes_array, bytes, JNI_ABORT);
149 }
150}
151
[email protected]61c86c62011-08-02 16:11:16152} // namespace android
153} // namespace base