OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "base/android/jni_map.h" | |
6 | |
7 #include <map> | |
8 | |
9 #include "base/android/jni_android.h" | |
10 #include "base/android/jni_string.h" | |
11 #include "base/android/scoped_java_ref.h" | |
12 #include "base/logging.h" | |
13 | |
14 namespace base { | |
15 namespace android { | |
16 | |
17 // Converts a std::map<std::string, string16> to a java HashMap<String,String>. | |
nyquist
2013/02/20 07:33:09
Nit: insert space between Java generics types.
Yaron
2013/02/21 21:39:15
Done.
| |
18 ScopedJavaLocalRef<jobject> ConvertMapToJavaMap( | |
19 JNIEnv* env, | |
20 const std::map<std::string, string16>& cmap) { | |
21 ScopedJavaLocalRef<jclass> map_clazz = GetClass(env, "java/util/HashMap"); | |
bulach
2013/02/20 14:41:25
a kitten has died.... :D
any chance of generating
Yaron
2013/02/21 21:39:15
That seems suboptimal to me. I feel like what you'
| |
22 jmethodID map_constructor = MethodID::Get<MethodID::TYPE_INSTANCE>( | |
23 env, map_clazz.obj(), "<init>", "()V"); | |
24 jmethodID map_put = MethodID::Get<MethodID::TYPE_INSTANCE>( | |
25 env, map_clazz.obj(), "put", | |
26 "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); | |
27 | |
28 jobject jmap = env->NewObject(map_clazz.obj(), map_constructor); | |
29 DCHECK(jmap); | |
30 CheckException(env); | |
31 | |
32 for (std::map<std::string, string16>::const_iterator i = cmap.begin(); | |
33 i != cmap.end(); i++) { | |
34 ScopedJavaLocalRef<jstring> key = ConvertUTF8ToJavaString(env, i->first); | |
35 ScopedJavaLocalRef<jstring> value = ConvertUTF16ToJavaString(env, | |
36 i->second); | |
37 // Assign the result to a ScopedJavaLocalRef so we don't leak the local ref. | |
38 ScopedJavaLocalRef<jobject> result(env, | |
39 env->CallObjectMethod(jmap, map_put, key.obj(), value.obj())); | |
40 CheckException(env); | |
41 } | |
42 return ScopedJavaLocalRef<jobject>(env, jmap); | |
43 } | |
44 | |
45 std::map<std::string, string16> ConvertJavaMapToMap(JNIEnv* env, | |
46 jobject jmap) { | |
47 std::map<std::string, string16> cmap; | |
48 | |
49 // Get a Set of all items. | |
50 ScopedJavaLocalRef<jclass> map_clazz = GetClass(env, "java/util/HashMap"); | |
51 jmethodID map_entryset = MethodID::Get<MethodID::TYPE_INSTANCE>( | |
52 env, map_clazz.obj(), "entrySet", "()Ljava/util/Set;"); | |
53 ScopedJavaLocalRef<jobject> jset(env, | |
54 env->CallObjectMethod(jmap, map_entryset)); | |
55 DCHECK(!jset.is_null()); | |
56 CheckException(env); | |
57 | |
58 // Get an iterator for this set. | |
59 ScopedJavaLocalRef<jclass> set_clazz = GetClass(env, "java/util/Set"); | |
60 jmethodID set_iterator = MethodID::Get<MethodID::TYPE_INSTANCE>( | |
61 env, set_clazz.obj(), "iterator", "()Ljava/util/Iterator;"); | |
62 ScopedJavaLocalRef<jobject> iter(env, | |
63 env->CallObjectMethod(jset.obj(), set_iterator)); | |
64 DCHECK(!iter.is_null()); | |
65 CheckException(env); | |
66 | |
67 // Loop over them. | |
nyquist
2013/02/20 07:33:09
Nit: Technically you don't start looping yet, you'
Yaron
2013/02/21 21:39:15
Dropped most comments as with bindings, the readab
| |
68 ScopedJavaLocalRef<jclass> iter_clazz = GetClass(env, "java/util/Iterator"); | |
69 jmethodID iter_hasnext = MethodID::Get<MethodID::TYPE_INSTANCE>( | |
70 env, iter_clazz.obj(), "hasNext", "()Z"); | |
71 jmethodID iter_next = MethodID::Get<MethodID::TYPE_INSTANCE>( | |
72 env, iter_clazz.obj(), "next", "()Ljava/lang/Object;"); | |
73 | |
74 ScopedJavaLocalRef<jclass> map_entry_clazz = | |
75 GetClass(env, "java/util/Map$Entry"); | |
76 jmethodID map_entry_getkey = MethodID::Get<MethodID::TYPE_INSTANCE>( | |
77 env, map_entry_clazz.obj(), "getKey", "()Ljava/lang/Object;"); | |
78 jmethodID map_entry_getvalue = MethodID::Get<MethodID::TYPE_INSTANCE>( | |
79 env, map_entry_clazz.obj(), "getValue", "()Ljava/lang/Object;"); | |
80 | |
81 // Dump items into a std::map. | |
82 while (env->CallBooleanMethod(iter.obj(), iter_hasnext)) { | |
83 CheckException(env); | |
84 ScopedJavaLocalRef<jobject> map_entry(env, | |
85 env->CallObjectMethod(iter.obj(), iter_next)); | |
86 DCHECK(env->IsInstanceOf(map_entry.obj(), map_entry_clazz.obj())); | |
87 ScopedJavaLocalRef<jstring> jkey(env, | |
88 static_cast<jstring>(env->CallObjectMethod(map_entry.obj(), | |
89 map_entry_getkey))); | |
90 ScopedJavaLocalRef<jstring> jvalue(env, | |
91 static_cast<jstring>(env->CallObjectMethod(map_entry.obj(), | |
92 map_entry_getvalue))); | |
93 // For profiles, jvalue can be null if not found in the contacts database. | |
nyquist
2013/02/20 07:33:09
Which contacts database? What does this have to do
Yaron
2013/02/21 21:39:15
dropped. Copied costant from the original implemen
| |
94 if (!jkey.is_null() && !jvalue.is_null() && | |
95 env->GetStringLength(jvalue.obj())) { | |
96 cmap[ConvertJavaStringToUTF8(jkey)] = ConvertJavaStringToUTF16(jvalue); | |
97 } | |
98 } | |
99 return cmap; | |
100 } | |
101 | |
102 | |
103 } // namespace android | |
104 } // namespace base | |
OLD | NEW |