summaryrefslogtreecommitdiffstats
path: root/base
diff options
context:
space:
mode:
Diffstat (limited to 'base')
-rw-r--r--base/android/jni_array.cc20
-rw-r--r--base/android/jni_array.h7
-rw-r--r--base/android/jni_array_unittest.cc28
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();