Chromium Code Reviews| Index: content/browser/renderer_host/java/java_method.cc |
| diff --git a/content/browser/renderer_host/java/java_method.cc b/content/browser/renderer_host/java/java_method.cc |
| index d65bd0c7276233a8c8841b5a4f2b867cb2736cad..b003316f23f9427c9a29de56b602b96577cfddd6 100644 |
| --- a/content/browser/renderer_host/java/java_method.cc |
| +++ b/content/browser/renderer_host/java/java_method.cc |
| @@ -11,6 +11,8 @@ |
| using base::android::AttachCurrentThread; |
| using base::android::ConvertJavaStringToUTF8; |
| +using base::android::GetMethodID; |
| +using base::android::GetStaticMethodID; |
| using base::android::MethodID; |
| using base::android::ScopedJavaLocalRef; |
| @@ -135,6 +137,20 @@ class MethodGetDeclaringClassID : public MethodID { |
| DISALLOW_COPY_AND_ASSIGN(MethodGetDeclaringClassID); |
| }; |
| +class MethodGetModifiersID : public MethodID { |
|
joth
2011/11/29 11:24:36
nit: I'd find all these easier to read if named li
Steve Block
2011/11/29 16:54:00
All of these are named <class><method>ID. I don't
|
| + public: |
| + static MethodGetModifiersID* GetInstance() { |
| + return Singleton<MethodGetModifiersID>::get(); |
| + } |
| + private: |
|
joth
2011/11/29 11:24:36
nit: we normally have a blank line before private:
Steve Block
2011/11/29 16:54:00
Done.
|
| + friend struct DefaultSingletonTraits<MethodGetModifiersID>; |
| + MethodGetModifiersID() |
| + : MethodID(AttachCurrentThread(), "java/lang/reflect/Method", |
| + "getModifiers", "()I") { |
| + } |
| + DISALLOW_COPY_AND_ASSIGN(MethodGetModifiersID); |
| +}; |
| + |
| class ClassGetNameID : public MethodID { |
|
joth
2011/11/29 11:24:36
add 'Method' in the name for consistency with the
Steve Block
2011/11/29 16:54:00
See above
|
| public: |
| static ClassGetNameID* GetInstance() { |
| @@ -149,6 +165,25 @@ class ClassGetNameID : public MethodID { |
| DISALLOW_COPY_AND_ASSIGN(ClassGetNameID); |
| }; |
| +class ModifierIsStaticID { |
| + public: |
| + static ModifierIsStaticID* GetInstance() { |
| + return Singleton<ModifierIsStaticID>::get(); |
| + } |
| + jclass clazz() { return clazz_.obj(); } |
| + jmethodID id() { return id_; } |
| + private: |
| + friend struct DefaultSingletonTraits<ModifierIsStaticID>; |
| + ModifierIsStaticID() { |
| + JNIEnv* env = AttachCurrentThread(); |
| + clazz_.Reset(env, env->FindClass("java/lang/reflect/Modifier")); |
| + id_ = GetStaticMethodID(env, clazz_.obj(), "isStatic", "(I)Z"); |
| + } |
| + base::android::ScopedJavaGlobalRef<jclass> clazz_; |
| + jmethodID id_; |
| + DISALLOW_COPY_AND_ASSIGN(ModifierIsStaticID); |
| +}; |
| + |
| } // namespace |
| JavaMethod::JavaMethod(const base::android::JavaRef<jobject>& method) |
| @@ -247,12 +282,24 @@ void JavaMethod::EnsureTypesAndIDAreSetUp() const { |
| signature += BinaryNameToJNIName(ConvertJavaStringToUTF8(env, name.obj()), |
| &return_type_); |
| + // Determine whether the method is static. |
| + jint modifiers = env->CallIntMethod( |
| + java_method_.obj(), |
| + MethodGetModifiersID::GetInstance()->id()); |
| + bool is_static = env->CallStaticBooleanMethod( |
| + ModifierIsStaticID::GetInstance()->clazz(), |
| + ModifierIsStaticID::GetInstance()->id(), |
| + modifiers); |
| + |
| // Get the ID for this method. |
| ScopedJavaLocalRef<jclass> declaring_class(env, static_cast<jclass>( |
| env->CallObjectMethod(java_method_.obj(), |
| MethodGetDeclaringClassID::GetInstance()->id()))); |
| - id_ = base::android::GetMethodID(env, declaring_class.obj(), name_.c_str(), |
| - signature.c_str()); |
| + id_ = is_static ? |
| + GetStaticMethodID(env, declaring_class.obj(), name_.c_str(), |
| + signature.c_str()) : |
| + GetMethodID(env, declaring_class.obj(), name_.c_str(), |
| + signature.c_str()); |
| java_method_.Reset(); |
| } |