summaryrefslogtreecommitdiffstats
path: root/base/android
diff options
context:
space:
mode:
authordigit@chromium.org <digit@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-05 15:00:28 +0000
committerdigit@chromium.org <digit@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-05 15:00:28 +0000
commit65d5835d4734a3106ef715336a05e4c0b3f9e068 (patch)
treebf3e3cd554ee2577ab352ff88599c1c383232512 /base/android
parent33f0eccc6c8fa1616e19fbceeac51c7aed67c9e5 (diff)
downloadchromium_src-65d5835d4734a3106ef715336a05e4c0b3f9e068.zip
chromium_src-65d5835d4734a3106ef715336a05e4c0b3f9e068.tar.gz
chromium_src-65d5835d4734a3106ef715336a05e4c0b3f9e068.tar.bz2
base/android/jni_array.h: Add JavaArrayOfByteArraysToStringVector()
This will be used by the SSL client certificate support code to return the certificate chain as a vector of DER-encoded X.509 certificates. BUG=none Review URL: https://chromiumcodereview.appspot.com/11418287 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@171224 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/android')
-rw-r--r--base/android/jni_array.cc18
-rw-r--r--base/android/jni_array.h8
-rw-r--r--base/android/jni_array_unittest.cc36
3 files changed, 62 insertions, 0 deletions
diff --git a/base/android/jni_array.cc b/base/android/jni_array.cc
index 53027c7..9b12531 100644
--- a/base/android/jni_array.cc
+++ b/base/android/jni_array.cc
@@ -127,5 +127,23 @@ void JavaIntArrayToIntVector(JNIEnv* env,
env->ReleaseIntArrayElements(array, ints, JNI_ABORT);
}
+void JavaArrayOfByteArrayToStringVector(
+ JNIEnv* env,
+ jobjectArray array,
+ std::vector<std::string>* out) {
+ DCHECK(out);
+ out->clear();
+ jsize len = env->GetArrayLength(array);
+ for (jsize i = 0; i < len; ++i) {
+ jbyteArray bytes_array = static_cast<jbyteArray>(
+ env->GetObjectArrayElement(array, i));
+ jsize bytes_len = env->GetArrayLength(bytes_array);
+ jbyte* bytes = env->GetByteArrayElements(bytes_array, NULL);
+ out->push_back(
+ std::string(reinterpret_cast<const char*>(bytes), bytes_len));
+ env->ReleaseByteArrayElements(bytes_array, bytes, JNI_ABORT);
+ }
+}
+
} // namespace android
} // namespace base
diff --git a/base/android/jni_array.h b/base/android/jni_array.h
index 86433a3..fbc131e 100644
--- a/base/android/jni_array.h
+++ b/base/android/jni_array.h
@@ -59,6 +59,14 @@ BASE_EXPORT void JavaIntArrayToIntVector(
jintArray int_array,
std::vector<int>* out);
+// Assuming |array| is an byte[][] (array of byte arrays), replaces the
+// content of |out| with the corresponding vector of strings. No UTF-8
+// conversion is performed.
+void JavaArrayOfByteArrayToStringVector(
+ JNIEnv* env,
+ jobjectArray array,
+ std::vector<std::string>* out);
+
} // namespace android
} // namespace base
diff --git a/base/android/jni_array_unittest.cc b/base/android/jni_array_unittest.cc
index 7529335..a4e3025 100644
--- a/base/android/jni_array_unittest.cc
+++ b/base/android/jni_array_unittest.cc
@@ -27,5 +27,41 @@ TEST(JniArray, BasicConversions) {
EXPECT_EQ(8U, vec.size());
}
+TEST(JniArray, JavaArrayOfByteArrayToStringVector) {
+ const int kMaxItems = 50;
+ JNIEnv* env = AttachCurrentThread();
+
+ // Create a byte[][] object.
+ ScopedJavaLocalRef<jclass> byte_array_clazz(env, env->FindClass("[B"));
+ ASSERT_TRUE(byte_array_clazz.obj());
+
+ ScopedJavaLocalRef<jobjectArray> array(
+ env, env->NewObjectArray(kMaxItems, byte_array_clazz.obj(), NULL));
+ ASSERT_TRUE(array.obj());
+
+ // Create kMaxItems byte buffers.
+ char text[16];
+ for (int i = 0; i < kMaxItems; ++i) {
+ snprintf(text, sizeof text, "%d", i);
+ ScopedJavaLocalRef<jbyteArray> byte_array = ToJavaByteArray(
+ env, reinterpret_cast<uint8*>(text),
+ static_cast<size_t>(strlen(text)));
+ ASSERT_TRUE(byte_array.obj());
+
+ env->SetObjectArrayElement(array.obj(), i, byte_array.obj());
+ ASSERT_FALSE(HasException(env));
+ }
+
+ // Convert to std::vector<std::string>, check the content.
+ std::vector<std::string> vec;
+ JavaArrayOfByteArrayToStringVector(env, array.obj(), &vec);
+
+ EXPECT_EQ(static_cast<size_t>(kMaxItems), vec.size());
+ for (int i = 0; i < kMaxItems; ++i) {
+ snprintf(text, sizeof text, "%d", i);
+ EXPECT_STREQ(text, vec[i].c_str());
+ }
+}
+
} // namespace android
} // namespace base