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.
5 #include "base/android/jni_array.h"
7 #include "base/android/jni_android.h"
8 #include "base/android/jni_string.h"
9 #include "base/logging.h"
14 ScopedJavaLocalRef
<jbyteArray
> ToJavaByteArray(
15 JNIEnv
* env
, const uint8
* bytes
, size_t len
) {
16 jbyteArray byte_array
= env
->NewByteArray(len
);
20 jbyte
* elements
= env
->GetByteArrayElements(byte_array
, NULL
);
21 memcpy(elements
, bytes
, len
);
22 env
->ReleaseByteArrayElements(byte_array
, elements
, 0);
25 return ScopedJavaLocalRef
<jbyteArray
>(env
, byte_array
);
28 ScopedJavaLocalRef
<jobjectArray
> ToJavaArrayOfByteArray(
29 JNIEnv
* env
, const std::vector
<std::string
>& v
) {
30 ScopedJavaLocalRef
<jclass
> byte_array_clazz
= GetClass(env
, "[B");
31 jobjectArray joa
= env
->NewObjectArray(v
.size(),
32 byte_array_clazz
.obj(), NULL
);
35 for (size_t i
= 0; i
< v
.size(); ++i
) {
36 ScopedJavaLocalRef
<jbyteArray
> byte_array
= ToJavaByteArray(env
,
37 reinterpret_cast<const uint8
*>(v
[i
].data()), v
[i
].length());
38 env
->SetObjectArrayElement(joa
, i
, byte_array
.obj());
40 return ScopedJavaLocalRef
<jobjectArray
>(env
, joa
);
43 ScopedJavaLocalRef
<jobjectArray
> ToJavaArrayOfStrings(
44 JNIEnv
* env
, const std::vector
<std::string
>& v
) {
45 ScopedJavaLocalRef
<jclass
> string_clazz
= GetClass(env
, "java/lang/String");
46 jobjectArray joa
= env
->NewObjectArray(v
.size(), string_clazz
.obj(), NULL
);
49 for (size_t i
= 0; i
< v
.size(); ++i
) {
50 ScopedJavaLocalRef
<jstring
> item
= ConvertUTF8ToJavaString(env
, v
[i
]);
51 env
->SetObjectArrayElement(joa
, i
, item
.obj());
53 return ScopedJavaLocalRef
<jobjectArray
>(env
, joa
);
56 ScopedJavaLocalRef
<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
);
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());
66 return ScopedJavaLocalRef
<jobjectArray
>(env
, joa
);
69 void AppendJavaStringArrayToStringVector(JNIEnv
* env
,
70 const JavaRef
<jobjectArray
>& array
,
71 std::vector
<string16
>* out
) {
75 jsize len
= env
->GetArrayLength(array
.obj());
76 for (jsize i
= 0; i
< len
; ++i
) {
77 ScopedJavaLocalRef
<jstring
> str(env
,
78 static_cast<jstring
>(env
->GetObjectArrayElement(array
.obj(), i
)));
79 out
->push_back(ConvertJavaStringToUTF16(str
));
83 void AppendJavaByteArrayToByteVector(JNIEnv
* env
,
84 jbyteArray byte_array
,
85 std::vector
<uint8
>* out
) {
89 jsize len
= env
->GetArrayLength(byte_array
);
90 jbyte
* bytes
= env
->GetByteArrayElements(byte_array
, NULL
);
91 out
->insert(out
->end(), bytes
, bytes
+ len
);
92 env
->ReleaseByteArrayElements(byte_array
, bytes
, JNI_ABORT
);
95 void JavaByteArrayToByteVector(JNIEnv
* env
,
96 jbyteArray byte_array
,
97 std::vector
<uint8
>* out
) {
100 AppendJavaByteArrayToByteVector(env
, byte_array
, out
);
103 } // namespace android