| 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 |