OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/scoped_java_ref.h" | 8 #include "base/android/scoped_java_ref.h" |
9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
10 | 10 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 const int64 kLongs[] = { 0, 1, -1, kint64min, kint64max}; | 79 const int64 kLongs[] = { 0, 1, -1, kint64min, kint64max}; |
80 const size_t kLen = arraysize(kLongs); | 80 const size_t kLen = arraysize(kLongs); |
81 | 81 |
82 JNIEnv* env = AttachCurrentThread(); | 82 JNIEnv* env = AttachCurrentThread(); |
83 CheckLongConversion(env, kLongs, kLen, ToJavaLongArray(env, kLongs, kLen)); | 83 CheckLongConversion(env, kLongs, kLen, ToJavaLongArray(env, kLongs, kLen)); |
84 | 84 |
85 const std::vector<int64> vec(kLongs, kLongs + kLen); | 85 const std::vector<int64> vec(kLongs, kLongs + kLen); |
86 CheckLongConversion(env, kLongs, kLen, ToJavaLongArray(env, vec)); | 86 CheckLongConversion(env, kLongs, kLen, ToJavaLongArray(env, vec)); |
87 } | 87 } |
88 | 88 |
| 89 void CheckIntArrayConversion(JNIEnv* env, |
| 90 ScopedJavaLocalRef<jintArray> jints, |
| 91 std::vector<int> int_vector, |
| 92 const size_t len) { |
| 93 jint value; |
| 94 for (size_t i = 0; i < len; ++i) { |
| 95 env->GetIntArrayRegion(jints.obj(), i, 1, &value); |
| 96 ASSERT_EQ(int_vector[i], value); |
| 97 } |
| 98 } |
| 99 |
89 TEST(JniArray, JavaIntArrayToIntVector) { | 100 TEST(JniArray, JavaIntArrayToIntVector) { |
90 const int kInts[] = {0, 1, -1}; | 101 const int kInts[] = {0, 1, -1}; |
91 const size_t kLen = arraysize(kInts); | 102 const size_t kLen = arraysize(kInts); |
92 | 103 |
93 JNIEnv* env = AttachCurrentThread(); | 104 JNIEnv* env = AttachCurrentThread(); |
94 ScopedJavaLocalRef<jintArray> jints(env, env->NewIntArray(kLen)); | 105 ScopedJavaLocalRef<jintArray> jints(env, env->NewIntArray(kLen)); |
95 ASSERT_TRUE(jints.obj()); | 106 ASSERT_TRUE(jints.obj()); |
96 | 107 |
97 for (size_t i = 0; i < kLen; ++i) { | 108 for (size_t i = 0; i < kLen; ++i) { |
98 jint j = static_cast<jint>(kInts[i]); | 109 jint j = static_cast<jint>(kInts[i]); |
99 env->SetIntArrayRegion(jints.obj(), i, 1, &j); | 110 env->SetIntArrayRegion(jints.obj(), i, 1, &j); |
100 ASSERT_FALSE(HasException(env)); | 111 ASSERT_FALSE(HasException(env)); |
101 } | 112 } |
102 | 113 |
103 std::vector<int> ints; | 114 std::vector<int> ints; |
104 JavaIntArrayToIntVector(env, jints.obj(), &ints); | 115 JavaIntArrayToIntVector(env, jints.obj(), &ints); |
105 | 116 |
106 ASSERT_EQ(static_cast<jsize>(ints.size()), env->GetArrayLength(jints.obj())); | 117 ASSERT_EQ(static_cast<jsize>(ints.size()), env->GetArrayLength(jints.obj())); |
107 | 118 |
108 jint value; | 119 CheckIntArrayConversion(env, jints, ints, kLen); |
109 for (size_t i = 0; i < kLen; ++i) { | |
110 env->GetIntArrayRegion(jints.obj(), i, 1, &value); | |
111 ASSERT_EQ(ints[i], value); | |
112 } | |
113 } | 120 } |
114 | 121 |
115 TEST(JniArray, JavaLongArrayToInt64Vector) { | 122 TEST(JniArray, JavaLongArrayToInt64Vector) { |
116 const int64 kInt64s[] = {0LL, 1LL, -1LL}; | 123 const int64 kInt64s[] = {0LL, 1LL, -1LL}; |
117 const size_t kLen = arraysize(kInt64s); | 124 const size_t kLen = arraysize(kInt64s); |
118 | 125 |
119 JNIEnv* env = AttachCurrentThread(); | 126 JNIEnv* env = AttachCurrentThread(); |
120 ScopedJavaLocalRef<jlongArray> jlongs(env, env->NewLongArray(kLen)); | 127 ScopedJavaLocalRef<jlongArray> jlongs(env, env->NewLongArray(kLen)); |
121 ASSERT_TRUE(jlongs.obj()); | 128 ASSERT_TRUE(jlongs.obj()); |
122 | 129 |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 std::vector<std::string> vec; | 230 std::vector<std::string> vec; |
224 JavaArrayOfByteArrayToStringVector(env, array.obj(), &vec); | 231 JavaArrayOfByteArrayToStringVector(env, array.obj(), &vec); |
225 | 232 |
226 EXPECT_EQ(static_cast<size_t>(kMaxItems), vec.size()); | 233 EXPECT_EQ(static_cast<size_t>(kMaxItems), vec.size()); |
227 for (int i = 0; i < kMaxItems; ++i) { | 234 for (int i = 0; i < kMaxItems; ++i) { |
228 snprintf(text, sizeof text, "%d", i); | 235 snprintf(text, sizeof text, "%d", i); |
229 EXPECT_STREQ(text, vec[i].c_str()); | 236 EXPECT_STREQ(text, vec[i].c_str()); |
230 } | 237 } |
231 } | 238 } |
232 | 239 |
| 240 TEST(JniArray, JavaArrayOfIntArrayToIntVector) { |
| 241 const size_t kNumItems = 4; |
| 242 JNIEnv* env = AttachCurrentThread(); |
| 243 |
| 244 // Create an int[][] object. |
| 245 ScopedJavaLocalRef<jclass> int_array_clazz(env, env->FindClass("[I")); |
| 246 ASSERT_TRUE(int_array_clazz.obj()); |
| 247 |
| 248 ScopedJavaLocalRef<jobjectArray> array( |
| 249 env, env->NewObjectArray(kNumItems, int_array_clazz.obj(), nullptr)); |
| 250 ASSERT_TRUE(array.obj()); |
| 251 |
| 252 // Populate int[][] object. |
| 253 const int kInts0[] = {0, 1, -1, kint32min, kint32max}; |
| 254 const size_t kLen0 = arraysize(kInts0); |
| 255 ScopedJavaLocalRef<jintArray> int_array0 = ToJavaIntArray(env, kInts0, kLen0); |
| 256 env->SetObjectArrayElement(array.obj(), 0, int_array0.obj()); |
| 257 |
| 258 const int kInts1[] = {3, 4, 5}; |
| 259 const size_t kLen1 = arraysize(kInts1); |
| 260 ScopedJavaLocalRef<jintArray> int_array1 = ToJavaIntArray(env, kInts1, kLen1); |
| 261 env->SetObjectArrayElement(array.obj(), 1, int_array1.obj()); |
| 262 |
| 263 const int kInts2[] = {}; |
| 264 const size_t kLen2 = 0; |
| 265 ScopedJavaLocalRef<jintArray> int_array2 = ToJavaIntArray(env, kInts2, kLen2); |
| 266 env->SetObjectArrayElement(array.obj(), 2, int_array2.obj()); |
| 267 |
| 268 const int kInts3[] = {16}; |
| 269 const size_t kLen3 = arraysize(kInts3); |
| 270 ScopedJavaLocalRef<jintArray> int_array3 = ToJavaIntArray(env, kInts3, kLen3); |
| 271 env->SetObjectArrayElement(array.obj(), 3, int_array3.obj()); |
| 272 |
| 273 // Convert to std::vector<std::vector<int>>, check the content. |
| 274 std::vector<std::vector<int>> out; |
| 275 JavaArrayOfIntArrayToIntVector(env, array.obj(), &out); |
| 276 |
| 277 EXPECT_EQ(kNumItems, out.size()); |
| 278 CheckIntArrayConversion(env, int_array0, out[0], kLen0); |
| 279 CheckIntArrayConversion(env, int_array1, out[1], kLen1); |
| 280 CheckIntArrayConversion(env, int_array2, out[2], kLen2); |
| 281 CheckIntArrayConversion(env, int_array3, out[3], kLen3); |
| 282 } |
| 283 |
233 } // namespace android | 284 } // namespace android |
234 } // namespace base | 285 } // namespace base |
OLD | NEW |