Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1417)

Side by Side Diff: base/android/jni_array.cc

Issue 9358028: Upstream Android JNI code, allowing us to use more ScopedJava references. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/android/jni_array.h" 5 #include "base/android/jni_array.h"
6 6
7 #include "base/android/jni_android.h" 7 #include "base/android/jni_android.h"
8 #include "base/android/jni_string.h" 8 #include "base/android/jni_string.h"
9 #include "base/android/scoped_java_ref.h"
10 #include "base/logging.h" 9 #include "base/logging.h"
11 10
12 namespace base { 11 namespace base {
13 namespace android { 12 namespace android {
14 13
15 jbyteArray ToJavaByteArray(JNIEnv* env, 14 ScopedJavaLocalRef<jbyteArray> ToJavaByteArray(
16 const unsigned char* bytes, 15 JNIEnv* env, const uint8* bytes, size_t len) {
17 size_t len) {
18 jbyteArray byte_array = env->NewByteArray(len); 16 jbyteArray byte_array = env->NewByteArray(len);
19 CheckException(env); 17 CheckException(env);
20 DCHECK(byte_array); 18 DCHECK(byte_array);
21 19
22 jbyte* elements = env->GetByteArrayElements(byte_array, NULL); 20 jbyte* elements = env->GetByteArrayElements(byte_array, NULL);
23 memcpy(elements, bytes, len); 21 memcpy(elements, bytes, len);
24 env->ReleaseByteArrayElements(byte_array, elements, 0); 22 env->ReleaseByteArrayElements(byte_array, elements, 0);
25 CheckException(env); 23 CheckException(env);
26 24
27 return byte_array; 25 return ScopedJavaLocalRef<jbyteArray>(env, byte_array);
28 } 26 }
29 27
30 jobjectArray ToJavaArrayOfByteArray(JNIEnv* env, 28 ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfByteArray(
31 const std::vector<std::string>& v) { 29 JNIEnv* env, const std::vector<std::string>& v) {
32 ScopedJavaLocalRef<jclass> byte_array_clazz(env, env->FindClass("[B")); 30 ScopedJavaLocalRef<jclass> byte_array_clazz = GetClass(env, "[B");
33 jobjectArray joa = env->NewObjectArray(v.size(), 31 jobjectArray joa = env->NewObjectArray(v.size(),
34 byte_array_clazz.obj(), NULL); 32 byte_array_clazz.obj(), NULL);
35 CheckException(env); 33 CheckException(env);
36 34
37 for (size_t i = 0; i < v.size(); ++i) { 35 for (size_t i = 0; i < v.size(); ++i) {
38 ScopedJavaLocalRef<jobject> byte_array(env, ToJavaByteArray(env, 36 ScopedJavaLocalRef<jbyteArray> byte_array = ToJavaByteArray(env,
39 reinterpret_cast<const uint8*>(v[i].data()), v[i].length())); 37 reinterpret_cast<const uint8*>(v[i].data()), v[i].length());
40 env->SetObjectArrayElement(joa, i, byte_array.obj()); 38 env->SetObjectArrayElement(joa, i, byte_array.obj());
41 } 39 }
42 return joa; 40 return ScopedJavaLocalRef<jobjectArray>(env, joa);
43 } 41 }
44 42
45 jobjectArray ToJavaArrayOfStrings(JNIEnv* env, 43 ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStrings(
46 const std::vector<std::string>& v) { 44 JNIEnv* env, const std::vector<std::string>& v) {
47 ScopedJavaLocalRef<jclass> string_clazz(env, 45 ScopedJavaLocalRef<jclass> string_clazz = GetClass(env, "java/lang/String");
48 env->FindClass("java/lang/String"));
49 jobjectArray joa = env->NewObjectArray(v.size(), string_clazz.obj(), NULL); 46 jobjectArray joa = env->NewObjectArray(v.size(), string_clazz.obj(), NULL);
50 CheckException(env); 47 CheckException(env);
51 48
52 for (size_t i = 0; i < v.size(); ++i) { 49 for (size_t i = 0; i < v.size(); ++i) {
53 ScopedJavaLocalRef<jstring> item(env, 50 ScopedJavaLocalRef<jstring> item = ConvertUTF8ToJavaString(env, v[i]);
54 ConvertUTF8ToJavaString(env, v[i]));
55 env->SetObjectArrayElement(joa, i, item.obj()); 51 env->SetObjectArrayElement(joa, i, item.obj());
56 } 52 }
57 return joa; 53 return ScopedJavaLocalRef<jobjectArray>(env, joa);
54 }
55
56 void AppendJavaByteArrayToByteVector(JNIEnv* env,
57 jbyteArray byte_array,
58 std::vector<uint8>* out) {
59 DCHECK(out);
60 if (!byte_array)
61 return;
62 jsize len = env->GetArrayLength(byte_array);
63 jbyte* bytes = env->GetByteArrayElements(byte_array, NULL);
64 out->insert(out->end(), bytes, bytes + len);
65 env->ReleaseByteArrayElements(byte_array, bytes, JNI_ABORT);
66 }
67
68 void JavaByteArrayToByteVector(JNIEnv* env,
69 jbyteArray byte_array,
70 std::vector<uint8>* out) {
71 DCHECK(out);
72 out->clear();
73 AppendJavaByteArrayToByteVector(env, byte_array, out);
58 } 74 }
59 75
60 } // namespace android 76 } // namespace android
61 } // namespace base 77 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698