diff options
author | steveblock@chromium.org <steveblock@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-05 14:42:08 +0000 |
---|---|---|
committer | steveblock@chromium.org <steveblock@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-05 14:42:08 +0000 |
commit | 96e7adeaf0086d53217e7a6c175af9defca386b7 (patch) | |
tree | 874b4aef50b9d3ed6f6ca43f5ecc181ee3411734 /content/browser/renderer_host/java/java_bound_object.cc | |
parent | 393206600991bdae7c6a6d2ee5f35a1039d80f31 (diff) | |
download | chromium_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.cc | 52 |
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) { |