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

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: Fix use of LAZY_INSTANCE_INITIALIZER Created 9 years 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 8edf54ef4eb3c9dd416e86062016f27659796ccf..f1f03814befe4ea2ed0623868b53ce872af75f44 100644
--- a/content/browser/renderer_host/java/java_method.cc
+++ b/content/browser/renderer_host/java/java_method.cc
@@ -6,26 +6,51 @@
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
+#include "base/lazy_instance.h"
#include "base/memory/singleton.h"
#include "base/string_util.h" // For ReplaceSubstringsAfterOffset
using base::android::AttachCurrentThread;
using base::android::ConvertJavaStringToUTF8;
+using base::android::GetMethodID;
using base::android::GetMethodIDFromClassName;
+using base::android::GetStaticMethodID;
+using base::android::ScopedJavaGlobalRef;
using base::android::ScopedJavaLocalRef;
namespace {
const char kGetName[] = "getName";
const char kGetDeclaringClass[] = "getDeclaringClass";
+const char kGetModifiers[] = "getModifiers";
const char kGetParameterTypes[] = "getParameterTypes";
const char kGetReturnType[] = "getReturnType";
+const char kIntegerReturningBoolean[] = "(I)Z";
+const char kIsStatic[] = "isStatic";
const char kJavaLangClass[] = "java/lang/Class";
const char kJavaLangReflectMethod[] = "java/lang/reflect/Method";
+const char kJavaLangReflectModifier[] = "java/lang/reflect/Modifier";
+const char kReturningInteger[] = "()I";
const char kReturningJavaLangClass[] = "()Ljava/lang/Class;";
const char kReturningJavaLangClassArray[] = "()[Ljava/lang/Class;";
const char kReturningJavaLangString[] = "()Ljava/lang/String;";
+struct ModifierClassTraits :
+ public base::DefaultLazyInstanceTraits<ScopedJavaGlobalRef<jclass> > {
+ static ScopedJavaGlobalRef<jclass>* New(void* instance) {
+ JNIEnv* env = AttachCurrentThread();
+ // Use placement new to initialize our instance in our preallocated space.
+ // The parenthesis is very important here to force POD type initialization.
joth 2011/12/05 15:53:23 this sentence not needed here. (we already know Sc
+ return new (instance) ScopedJavaGlobalRef<jclass>(
+ ScopedJavaLocalRef<jclass>(
+ env,
+ static_cast<jclass>(env->FindClass(kJavaLangReflectModifier))));
+ }
+};
+
+base::LazyInstance<ScopedJavaGlobalRef<jclass>, ModifierClassTraits>
+ g_java_lang_reflect_modifier_class = LAZY_INSTANCE_INITIALIZER;
+
std::string BinaryNameToJNIName(const std::string& binary_name,
JavaType* type) {
DCHECK(type);
@@ -177,6 +202,20 @@ 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(), GetMethodIDFromClassName(env,
+ kJavaLangReflectMethod,
+ kGetModifiers,
+ kReturningInteger));
+ bool is_static = env->CallStaticBooleanMethod(
+ g_java_lang_reflect_modifier_class.Pointer()->obj(),
joth 2011/12/05 15:53:23 nit: g_java_lang_reflect_modifier_class.Get().obj(
+ GetMethodIDFromClassName(env,
+ kJavaLangReflectModifier,
+ kIsStatic,
+ kIntegerReturningBoolean),
+ modifiers);
+
// Get the ID for this method.
ScopedJavaLocalRef<jclass> declaring_class(env, static_cast<jclass>(
env->CallObjectMethod(java_method_.obj(), GetMethodIDFromClassName(
@@ -184,8 +223,11 @@ void JavaMethod::EnsureTypesAndIDAreSetUp() const {
kJavaLangReflectMethod,
kGetDeclaringClass,
kReturningJavaLangClass))));
- 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