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(); |
} |