diff options
Diffstat (limited to 'base')
-rw-r--r-- | base/android/jni_array.cc | 20 | ||||
-rw-r--r-- | base/android/jni_array.h | 7 | ||||
-rw-r--r-- | base/android/jni_array_unittest.cc | 28 |
3 files changed, 55 insertions, 0 deletions
diff --git a/base/android/jni_array.cc b/base/android/jni_array.cc index fe2aadb..596914b 100644 --- a/base/android/jni_array.cc +++ b/base/android/jni_array.cc @@ -25,6 +25,26 @@ ScopedJavaLocalRef<jbyteArray> ToJavaByteArray( return ScopedJavaLocalRef<jbyteArray>(env, byte_array); } +ScopedJavaLocalRef<jlongArray> ToJavaLongArray( + JNIEnv* env, const int64* longs, size_t len) { + jlongArray long_array = env->NewLongArray(len); + CheckException(env); + DCHECK(long_array); + + jlong* elements = env->GetLongArrayElements(long_array, NULL); + memcpy(elements, longs, len * sizeof(*longs)); + env->ReleaseLongArrayElements(long_array, elements, 0); + CheckException(env); + + return ScopedJavaLocalRef<jlongArray>(env, long_array); +} + +// Returns a new Java long array converted from the given int64 array. +BASE_EXPORT ScopedJavaLocalRef<jlongArray> ToJavaLongArray( + JNIEnv* env, const std::vector<int64>& longs) { + return ToJavaLongArray(env, longs.begin(), longs.size()); +} + ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfByteArray( JNIEnv* env, const std::vector<std::string>& v) { ScopedJavaLocalRef<jclass> byte_array_clazz = GetClass(env, "[B"); diff --git a/base/android/jni_array.h b/base/android/jni_array.h index b5050c3..bb73ea0 100644 --- a/base/android/jni_array.h +++ b/base/android/jni_array.h @@ -20,6 +20,13 @@ namespace android { BASE_EXPORT ScopedJavaLocalRef<jbyteArray> ToJavaByteArray( JNIEnv* env, const uint8* bytes, size_t len); +// Returns a new Java long array converted from the given int64 array. +BASE_EXPORT ScopedJavaLocalRef<jlongArray> ToJavaLongArray( + JNIEnv* env, const int64* longs, size_t len); + +BASE_EXPORT ScopedJavaLocalRef<jlongArray> ToJavaLongArray( + JNIEnv* env, const std::vector<int64>& longs); + // Returns a array of Java byte array converted from |v|. BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfByteArray( JNIEnv* env, const std::vector<std::string>& v); diff --git a/base/android/jni_array_unittest.cc b/base/android/jni_array_unittest.cc index a4e3025..bc497a8 100644 --- a/base/android/jni_array_unittest.cc +++ b/base/android/jni_array_unittest.cc @@ -27,6 +27,34 @@ TEST(JniArray, BasicConversions) { EXPECT_EQ(8U, vec.size()); } +void CheckLongConversion( + JNIEnv* env, + const int64* long_array, + const size_t len, + const ScopedJavaLocalRef<jlongArray>& longs) { + ASSERT_TRUE(longs.obj()); + + jsize java_array_len = env->GetArrayLength(longs.obj()); + ASSERT_EQ(static_cast<int>(len), java_array_len); + + jlong value; + for (size_t i = 0; i < len; ++i) { + env->GetLongArrayRegion(longs.obj(), i, 1, &value); + ASSERT_EQ(long_array[i], value); + } +} + +TEST(JniArray, LongConversions) { + const int64 kLongs[] = { 0, 1, -1, kint64min, kint64max}; + const size_t kLen = arraysize(kLongs); + + JNIEnv* env = AttachCurrentThread(); + CheckLongConversion(env, kLongs, kLen, ToJavaLongArray(env, kLongs, kLen)); + + const std::vector<int64> vec(kLongs, kLongs + kLen); + CheckLongConversion(env, kLongs, kLen, ToJavaLongArray(env, vec)); +} + TEST(JniArray, JavaArrayOfByteArrayToStringVector) { const int kMaxItems = 50; JNIEnv* env = AttachCurrentThread(); |