| 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 c236940aa9615a65d40f163093d12f4466a9e7fe..f896bc0bba4db0d709717ce2faac1b57d2fc3a14 100644
|
| --- a/content/browser/renderer_host/java/java_method.cc
|
| +++ b/content/browser/renderer_host/java/java_method.cc
|
| @@ -11,11 +11,19 @@
|
|
|
| using base::android::AttachCurrentThread;
|
| using base::android::ConvertJavaStringToUTF8;
|
| -using base::android::MethodID;
|
| +using base::android::GetMethodIDFromClassName;
|
| using base::android::ScopedJavaLocalRef;
|
|
|
| namespace {
|
|
|
| +const char kJavaLangReflectMethod[] = "java/lang/reflect/Method";
|
| +const char kGetParameterTypes[] = "getParameterTypes";
|
| +const char kReturningJavaLangClassArray[] = "()[Ljava/lang/Class;";
|
| +
|
| +const char kJavaLangClass[] = "java/lang/Class";
|
| +const char kGetName[] = "getName";
|
| +const char kReturningJavaLangClass[] = "()Ljava/lang/String;";
|
| +
|
| std::string BinaryNameToJNIName(const std::string& binary_name,
|
| JavaType* type) {
|
| DCHECK(type);
|
| @@ -50,76 +58,6 @@ std::string BinaryNameToJNIName(const std::string& binary_name,
|
| }
|
| }
|
|
|
| -class MethodGetParameterTypesID : public MethodID {
|
| - public:
|
| - static MethodGetParameterTypesID* GetInstance() {
|
| - return Singleton<MethodGetParameterTypesID>::get();
|
| - }
|
| - private:
|
| - friend struct DefaultSingletonTraits<MethodGetParameterTypesID>;
|
| - MethodGetParameterTypesID()
|
| - : MethodID(AttachCurrentThread(), "java/lang/reflect/Method",
|
| - "getParameterTypes", "()[Ljava/lang/Class;") {
|
| - }
|
| - DISALLOW_COPY_AND_ASSIGN(MethodGetParameterTypesID);
|
| -};
|
| -
|
| -class MethodGetNameID : public MethodID {
|
| - public:
|
| - static MethodGetNameID* GetInstance() {
|
| - return Singleton<MethodGetNameID>::get();
|
| - }
|
| - private:
|
| - friend struct DefaultSingletonTraits<MethodGetNameID>;
|
| - MethodGetNameID()
|
| - : MethodID(AttachCurrentThread(), "java/lang/reflect/Method",
|
| - "getName", "()Ljava/lang/String;") {
|
| - }
|
| - DISALLOW_COPY_AND_ASSIGN(MethodGetNameID);
|
| -};
|
| -
|
| -class MethodGetReturnTypeID : public MethodID {
|
| - public:
|
| - static MethodGetReturnTypeID* GetInstance() {
|
| - return Singleton<MethodGetReturnTypeID>::get();
|
| - }
|
| - private:
|
| - friend struct DefaultSingletonTraits<MethodGetReturnTypeID>;
|
| - MethodGetReturnTypeID()
|
| - : MethodID(AttachCurrentThread(), "java/lang/reflect/Method",
|
| - "getReturnType", "()Ljava/lang/Class;") {
|
| - }
|
| - DISALLOW_COPY_AND_ASSIGN(MethodGetReturnTypeID);
|
| -};
|
| -
|
| -class MethodGetDeclaringClassID : public MethodID {
|
| - public:
|
| - static MethodGetDeclaringClassID* GetInstance() {
|
| - return Singleton<MethodGetDeclaringClassID>::get();
|
| - }
|
| - private:
|
| - friend struct DefaultSingletonTraits<MethodGetDeclaringClassID>;
|
| - MethodGetDeclaringClassID()
|
| - : MethodID(AttachCurrentThread(), "java/lang/reflect/Method",
|
| - "getDeclaringClass", "()Ljava/lang/Class;") {
|
| - }
|
| - DISALLOW_COPY_AND_ASSIGN(MethodGetDeclaringClassID);
|
| -};
|
| -
|
| -class ClassGetNameID : public MethodID {
|
| - public:
|
| - static ClassGetNameID* GetInstance() {
|
| - return Singleton<ClassGetNameID>::get();
|
| - }
|
| - private:
|
| - friend struct DefaultSingletonTraits<ClassGetNameID>;
|
| - ClassGetNameID()
|
| - : MethodID(AttachCurrentThread(), "java/lang/Class", "getName",
|
| - "()Ljava/lang/String;") {
|
| - }
|
| - DISALLOW_COPY_AND_ASSIGN(ClassGetNameID);
|
| -};
|
| -
|
| } // namespace
|
|
|
| JavaMethod::JavaMethod(const base::android::JavaRef<jobject>& method)
|
| @@ -130,8 +68,11 @@ JavaMethod::JavaMethod(const base::android::JavaRef<jobject>& method)
|
| // On construction, we do nothing except get the name. Everything else is
|
| // done lazily.
|
| ScopedJavaLocalRef<jstring> name(env, static_cast<jstring>(
|
| - env->CallObjectMethod(java_method_.obj(),
|
| - MethodGetNameID::GetInstance()->id())));
|
| + env->CallObjectMethod(java_method_.obj(), GetMethodIDFromClassName(
|
| + env,
|
| + "java/lang/reflect/Method",
|
| + "getName",
|
| + "()Ljava/lang/String;"))));
|
| name_ = ConvertJavaStringToUTF8(env, name.obj());
|
| }
|
|
|
| @@ -169,8 +110,11 @@ void JavaMethod::EnsureNumParametersIsSetUp() const {
|
| // required.
|
| JNIEnv* env = java_method_.env();
|
| ScopedJavaLocalRef<jarray> parameters(env, static_cast<jarray>(
|
| - env->CallObjectMethod(java_method_.obj(),
|
| - MethodGetParameterTypesID::GetInstance()->id())));
|
| + env->CallObjectMethod(java_method_.obj(), GetMethodIDFromClassName(
|
| + env,
|
| + kJavaLangReflectMethod,
|
| + kGetParameterTypes,
|
| + kReturningJavaLangClassArray))));
|
| num_parameters_ = env->GetArrayLength(parameters.obj());
|
| }
|
|
|
| @@ -182,8 +126,11 @@ void JavaMethod::EnsureTypesAndIDAreSetUp() const {
|
| // Get the parameters
|
| JNIEnv* env = java_method_.env();
|
| ScopedJavaLocalRef<jobjectArray> parameters(env, static_cast<jobjectArray>(
|
| - env->CallObjectMethod(java_method_.obj(),
|
| - MethodGetParameterTypesID::GetInstance()->id())));
|
| + env->CallObjectMethod(java_method_.obj(), GetMethodIDFromClassName(
|
| + env,
|
| + kJavaLangReflectMethod,
|
| + kGetParameterTypes,
|
| + kReturningJavaLangClassArray))));
|
| // Usually, this will already have been called.
|
| EnsureNumParametersIsSetUp();
|
| DCHECK_EQ(num_parameters_,
|
| @@ -202,8 +149,11 @@ void JavaMethod::EnsureTypesAndIDAreSetUp() const {
|
| ScopedJavaLocalRef<jobject> parameter(env, env->GetObjectArrayElement(
|
| parameters.obj(), i));
|
| ScopedJavaLocalRef<jstring> name(env, static_cast<jstring>(
|
| - env->CallObjectMethod(parameter.obj(),
|
| - ClassGetNameID::GetInstance()->id())));
|
| + env->CallObjectMethod(parameter.obj(), GetMethodIDFromClassName(
|
| + env,
|
| + kJavaLangClass,
|
| + kGetName,
|
| + kReturningJavaLangClass))));
|
| std::string name_utf8 = ConvertJavaStringToUTF8(env, name.obj());
|
| signature += BinaryNameToJNIName(name_utf8, ¶meter_types_[i]);
|
| }
|
| @@ -211,17 +161,27 @@ void JavaMethod::EnsureTypesAndIDAreSetUp() const {
|
|
|
| // Get the return type
|
| ScopedJavaLocalRef<jclass> clazz(env, static_cast<jclass>(
|
| - env->CallObjectMethod(java_method_.obj(),
|
| - MethodGetReturnTypeID::GetInstance()->id())));
|
| + env->CallObjectMethod(java_method_.obj(), GetMethodIDFromClassName(
|
| + env,
|
| + "java/lang/reflect/Method",
|
| + "getReturnType",
|
| + "()Ljava/lang/Class;"))));
|
| ScopedJavaLocalRef<jstring> name(env, static_cast<jstring>(
|
| - env->CallObjectMethod(clazz.obj(), ClassGetNameID::GetInstance()->id())));
|
| + env->CallObjectMethod(clazz.obj(), GetMethodIDFromClassName(
|
| + env,
|
| + kJavaLangClass,
|
| + kGetName,
|
| + kReturningJavaLangClass))));
|
| signature += BinaryNameToJNIName(ConvertJavaStringToUTF8(env, name.obj()),
|
| &return_type_);
|
|
|
| // Get the ID for this method.
|
| ScopedJavaLocalRef<jclass> declaring_class(env, static_cast<jclass>(
|
| - env->CallObjectMethod(java_method_.obj(),
|
| - MethodGetDeclaringClassID::GetInstance()->id())));
|
| + env->CallObjectMethod(java_method_.obj(), GetMethodIDFromClassName(
|
| + env,
|
| + "java/lang/reflect/Method",
|
| + "getDeclaringClass",
|
| + "()Ljava/lang/Class;"))));
|
| id_ = base::android::GetMethodID(env, declaring_class.obj(), name_.c_str(),
|
| signature.c_str());
|
|
|
|
|