summaryrefslogtreecommitdiffstats
path: root/content/browser/renderer_host/java/java_bound_object.cc
diff options
context:
space:
mode:
authorsteveblock@chromium.org <steveblock@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-12-05 14:42:08 +0000
committersteveblock@chromium.org <steveblock@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-12-05 14:42:08 +0000
commit96e7adeaf0086d53217e7a6c175af9defca386b7 (patch)
tree874b4aef50b9d3ed6f6ca43f5ecc181ee3411734 /content/browser/renderer_host/java/java_bound_object.cc
parent393206600991bdae7c6a6d2ee5f35a1039d80f31 (diff)
downloadchromium_src-96e7adeaf0086d53217e7a6c175af9defca386b7.zip
chromium_src-96e7adeaf0086d53217e7a6c175af9defca386b7.tar.gz
chromium_src-96e7adeaf0086d53217e7a6c175af9defca386b7.tar.bz2
Don't use Singleton to cache JNI method IDs in Java Bridge
The Java Bridge makes repeated use of numerous JNI method IDs. We wish to avoid repeatedly looking up these IDS, so we cache them. Currently we use Singleton objects to achieve this. However, this seems inappropriate for several reasons ... - Requires excessive boilerplate - Thread safety not required - Exit cleanup not required We can avoid using Singleton, without introducing static initializers, by simply using a static local. See http://codereview.chromium.org/8659007 for background. TBR=avi BUG=105547 Review URL: http://codereview.chromium.org/8769005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@112975 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/renderer_host/java/java_bound_object.cc')
-rw-r--r--content/browser/renderer_host/java/java_bound_object.cc52
1 files changed, 19 insertions, 33 deletions
diff --git a/content/browser/renderer_host/java/java_bound_object.cc b/content/browser/renderer_host/java/java_bound_object.cc
index e139d46..5020752 100644
--- a/content/browser/renderer_host/java/java_bound_object.cc
+++ b/content/browser/renderer_host/java/java_bound_object.cc
@@ -15,8 +15,8 @@
using base::StringPrintf;
using base::android::AttachCurrentThread;
using base::android::ConvertUTF8ToJavaString;
+using base::android::GetMethodIDFromClassName;
using base::android::JavaRef;
-using base::android::MethodID;
using base::android::ScopedJavaGlobalRef;
using base::android::ScopedJavaLocalRef;
using WebKit::WebBindings;
@@ -31,6 +31,14 @@ using WebKit::WebBindings;
namespace {
+const char kJavaLangClass[] = "java/lang/Class";
+const char kJavaLangObject[] = "java/lang/Object";
+const char kGetClass[] = "getClass";
+const char kGetMethods[] = "getMethods";
+const char kReturningJavaLangClass[] = "()Ljava/lang/Class;";
+const char kReturningJavaLangReflectMethodArray[] =
+ "()[Ljava/lang/reflect/Method;";
+
// Our special NPObject type. We extend an NPObject with a pointer to a
// JavaBoundObject. We also add static methods for each of the NPObject
// callbacks, which are registered by our NPClass. These methods simply
@@ -481,34 +489,6 @@ jvalue CoerceJavaScriptValueToJavaValue(const NPVariant& variant,
return jvalue();
}
-class ObjectGetClassID : public MethodID {
- public:
- static ObjectGetClassID* GetInstance() {
- return Singleton<ObjectGetClassID>::get();
- }
- private:
- friend struct DefaultSingletonTraits<ObjectGetClassID>;
- ObjectGetClassID()
- : MethodID(AttachCurrentThread(), "java/lang/Object", "getClass",
- "()Ljava/lang/Class;") {
- }
- DISALLOW_COPY_AND_ASSIGN(ObjectGetClassID);
-};
-
-class ClassGetMethodsID : public MethodID {
- public:
- static ClassGetMethodsID* GetInstance() {
- return Singleton<ClassGetMethodsID>::get();
- }
- private:
- friend struct DefaultSingletonTraits<ClassGetMethodsID>;
- ClassGetMethodsID()
- : MethodID(AttachCurrentThread(), "java/lang/Class", "getMethods",
- "()[Ljava/lang/reflect/Method;") {
- }
- DISALLOW_COPY_AND_ASSIGN(ClassGetMethodsID);
-};
-
} // namespace
@@ -591,11 +571,17 @@ void JavaBoundObject::EnsureMethodsAreSetUp() const {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jclass> clazz(env, static_cast<jclass>(
- env->CallObjectMethod(java_object_,
- ObjectGetClassID::GetInstance()->id())));
+ env->CallObjectMethod(java_object_, GetMethodIDFromClassName(
+ env,
+ kJavaLangObject,
+ kGetClass,
+ kReturningJavaLangClass))));
ScopedJavaLocalRef<jobjectArray> methods(env, static_cast<jobjectArray>(
- env->CallObjectMethod(clazz.obj(),
- ClassGetMethodsID::GetInstance()->id())));
+ env->CallObjectMethod(clazz.obj(), GetMethodIDFromClassName(
+ env,
+ kJavaLangClass,
+ kGetMethods,
+ kReturningJavaLangReflectMethodArray))));
size_t num_methods = env->GetArrayLength(methods.obj());
DCHECK(num_methods) << "Java objects always have public methods";
for (size_t i = 0; i < num_methods; ++i) {