diff options
author | digit@chromium.org <digit@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-05 15:00:28 +0000 |
---|---|---|
committer | digit@chromium.org <digit@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-05 15:00:28 +0000 |
commit | 65d5835d4734a3106ef715336a05e4c0b3f9e068 (patch) | |
tree | bf3e3cd554ee2577ab352ff88599c1c383232512 /base/android | |
parent | 33f0eccc6c8fa1616e19fbceeac51c7aed67c9e5 (diff) | |
download | chromium_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.cc | 18 | ||||
-rw-r--r-- | base/android/jni_array.h | 8 | ||||
-rw-r--r-- | base/android/jni_array_unittest.cc | 36 |
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 |