Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(223)

Unified Diff: content/browser/renderer_host/java/java_method.cc

Issue 8659007: Add support for calling static methods in the Java Bridge (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698