OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "content/browser/android/java/java_method.h" | 5 #include "content/browser/android/java/java_method.h" |
6 | 6 |
7 #include "base/android/jni_android.h" | 7 #include "base/android/jni_android.h" |
8 #include "base/android/jni_string.h" | 8 #include "base/android/jni_string.h" |
9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
10 #include "base/memory/singleton.h" | 10 #include "base/memory/singleton.h" |
11 #include "base/strings/string_util.h" // For ReplaceSubstringsAfterOffset | |
12 #include "content/browser/android/java/jni_helper.h" | 11 #include "content/browser/android/java/jni_helper.h" |
13 | 12 |
14 using base::android::AttachCurrentThread; | 13 using base::android::AttachCurrentThread; |
15 using base::android::ConvertJavaStringToUTF8; | 14 using base::android::ConvertJavaStringToUTF8; |
16 using base::android::GetClass; | 15 using base::android::GetClass; |
17 using base::android::MethodID; | 16 using base::android::MethodID; |
18 using base::android::ScopedJavaGlobalRef; | 17 using base::android::ScopedJavaGlobalRef; |
19 using base::android::ScopedJavaLocalRef; | 18 using base::android::ScopedJavaLocalRef; |
20 | 19 |
21 namespace content { | 20 namespace content { |
(...skipping 21 matching lines...) Expand all Loading... |
43 JNIEnv* env = AttachCurrentThread(); | 42 JNIEnv* env = AttachCurrentThread(); |
44 // Use placement new to initialize our instance in our preallocated space. | 43 // Use placement new to initialize our instance in our preallocated space. |
45 return new (instance) ScopedJavaGlobalRef<jclass>( | 44 return new (instance) ScopedJavaGlobalRef<jclass>( |
46 GetClass(env, kJavaLangReflectModifier)); | 45 GetClass(env, kJavaLangReflectModifier)); |
47 } | 46 } |
48 }; | 47 }; |
49 | 48 |
50 base::LazyInstance<ScopedJavaGlobalRef<jclass>, ModifierClassTraits> | 49 base::LazyInstance<ScopedJavaGlobalRef<jclass>, ModifierClassTraits> |
51 g_java_lang_reflect_modifier_class = LAZY_INSTANCE_INITIALIZER; | 50 g_java_lang_reflect_modifier_class = LAZY_INSTANCE_INITIALIZER; |
52 | 51 |
53 std::string BinaryNameToJNIName(const std::string& binary_name, | 52 std::string BinaryNameToJNISignature(const std::string& binary_name, |
54 JavaType* type) { | 53 JavaType* type) { |
55 DCHECK(type); | 54 DCHECK(type); |
56 *type = JavaType::CreateFromBinaryName(binary_name); | 55 *type = JavaType::CreateFromBinaryName(binary_name); |
57 switch (type->type) { | 56 return type->JNISignature(); |
58 case JavaType::TypeBoolean: | |
59 return "Z"; | |
60 case JavaType::TypeByte: | |
61 return "B"; | |
62 case JavaType::TypeChar: | |
63 return "C"; | |
64 case JavaType::TypeShort: | |
65 return "S"; | |
66 case JavaType::TypeInt: | |
67 return "I"; | |
68 case JavaType::TypeLong: | |
69 return "J"; | |
70 case JavaType::TypeFloat: | |
71 return "F"; | |
72 case JavaType::TypeDouble: | |
73 return "D"; | |
74 case JavaType::TypeVoid: | |
75 return "V"; | |
76 case JavaType::TypeArray: { | |
77 // For array types, the binary name uses the JNI name encodings. | |
78 std::string jni_name = binary_name; | |
79 ReplaceSubstringsAfterOffset(&jni_name, 0, ".", "/"); | |
80 return jni_name; | |
81 } | |
82 case JavaType::TypeString: | |
83 case JavaType::TypeObject: | |
84 std::string jni_name = "L" + binary_name + ";"; | |
85 ReplaceSubstringsAfterOffset(&jni_name, 0, ".", "/"); | |
86 return jni_name; | |
87 } | |
88 NOTREACHED(); | |
89 return std::string(); | |
90 } | 57 } |
91 | 58 |
92 } // namespace | 59 } // namespace |
93 | 60 |
94 JavaMethod::JavaMethod(const base::android::JavaRef<jobject>& method) | 61 JavaMethod::JavaMethod(const base::android::JavaRef<jobject>& method) |
95 : java_method_(method), | 62 : java_method_(method), |
96 have_calculated_num_parameters_(false), | 63 have_calculated_num_parameters_(false), |
97 id_(NULL) { | 64 id_(NULL) { |
98 JNIEnv* env = AttachCurrentThread(); | 65 JNIEnv* env = AttachCurrentThread(); |
99 // On construction, we do nothing except get the name. Everything else is | 66 // On construction, we do nothing except get the name. Everything else is |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 for (size_t i = 0; i < num_parameters_; ++i) { | 151 for (size_t i = 0; i < num_parameters_; ++i) { |
185 ScopedJavaLocalRef<jobject> parameter(env, env->GetObjectArrayElement( | 152 ScopedJavaLocalRef<jobject> parameter(env, env->GetObjectArrayElement( |
186 parameters.obj(), i)); | 153 parameters.obj(), i)); |
187 ScopedJavaLocalRef<jstring> name(env, static_cast<jstring>( | 154 ScopedJavaLocalRef<jstring> name(env, static_cast<jstring>( |
188 env->CallObjectMethod(parameter.obj(), GetMethodIDFromClassName( | 155 env->CallObjectMethod(parameter.obj(), GetMethodIDFromClassName( |
189 env, | 156 env, |
190 kJavaLangClass, | 157 kJavaLangClass, |
191 kGetName, | 158 kGetName, |
192 kReturningJavaLangString)))); | 159 kReturningJavaLangString)))); |
193 std::string name_utf8 = ConvertJavaStringToUTF8(name); | 160 std::string name_utf8 = ConvertJavaStringToUTF8(name); |
194 signature += BinaryNameToJNIName(name_utf8, ¶meter_types_[i]); | 161 signature += BinaryNameToJNISignature(name_utf8, ¶meter_types_[i]); |
195 } | 162 } |
196 signature += ")"; | 163 signature += ")"; |
197 | 164 |
198 // Get the return type | 165 // Get the return type |
199 ScopedJavaLocalRef<jclass> clazz(env, static_cast<jclass>( | 166 ScopedJavaLocalRef<jclass> clazz(env, static_cast<jclass>( |
200 env->CallObjectMethod(java_method_.obj(), GetMethodIDFromClassName( | 167 env->CallObjectMethod(java_method_.obj(), GetMethodIDFromClassName( |
201 env, | 168 env, |
202 kJavaLangReflectMethod, | 169 kJavaLangReflectMethod, |
203 kGetReturnType, | 170 kGetReturnType, |
204 kReturningJavaLangClass)))); | 171 kReturningJavaLangClass)))); |
205 ScopedJavaLocalRef<jstring> name(env, static_cast<jstring>( | 172 ScopedJavaLocalRef<jstring> name(env, static_cast<jstring>( |
206 env->CallObjectMethod(clazz.obj(), GetMethodIDFromClassName( | 173 env->CallObjectMethod(clazz.obj(), GetMethodIDFromClassName( |
207 env, | 174 env, |
208 kJavaLangClass, | 175 kJavaLangClass, |
209 kGetName, | 176 kGetName, |
210 kReturningJavaLangString)))); | 177 kReturningJavaLangString)))); |
211 signature += BinaryNameToJNIName(ConvertJavaStringToUTF8(name), | 178 signature += BinaryNameToJNISignature(ConvertJavaStringToUTF8(name), |
212 &return_type_); | 179 &return_type_); |
213 | 180 |
214 // Determine whether the method is static. | 181 // Determine whether the method is static. |
215 jint modifiers = env->CallIntMethod( | 182 jint modifiers = env->CallIntMethod( |
216 java_method_.obj(), GetMethodIDFromClassName(env, | 183 java_method_.obj(), GetMethodIDFromClassName(env, |
217 kJavaLangReflectMethod, | 184 kJavaLangReflectMethod, |
218 kGetModifiers, | 185 kGetModifiers, |
219 kReturningInteger)); | 186 kReturningInteger)); |
220 is_static_ = env->CallStaticBooleanMethod( | 187 is_static_ = env->CallStaticBooleanMethod( |
221 g_java_lang_reflect_modifier_class.Get().obj(), | 188 g_java_lang_reflect_modifier_class.Get().obj(), |
222 MethodID::Get<MethodID::TYPE_STATIC>( | 189 MethodID::Get<MethodID::TYPE_STATIC>( |
(...skipping 10 matching lines...) Expand all Loading... |
233 kReturningJavaLangClass)))); | 200 kReturningJavaLangClass)))); |
234 id_ = is_static_ ? | 201 id_ = is_static_ ? |
235 MethodID::Get<MethodID::TYPE_STATIC>( | 202 MethodID::Get<MethodID::TYPE_STATIC>( |
236 env, declaring_class.obj(), name_.c_str(), signature.c_str()) : | 203 env, declaring_class.obj(), name_.c_str(), signature.c_str()) : |
237 MethodID::Get<MethodID::TYPE_INSTANCE>( | 204 MethodID::Get<MethodID::TYPE_INSTANCE>( |
238 env, declaring_class.obj(), name_.c_str(), signature.c_str()); | 205 env, declaring_class.obj(), name_.c_str(), signature.c_str()); |
239 java_method_.Reset(); | 206 java_method_.Reset(); |
240 } | 207 } |
241 | 208 |
242 } // namespace content | 209 } // namespace content |
OLD | NEW |