Index: base/android/jni_android.cc |
diff --git a/base/android/jni_android.cc b/base/android/jni_android.cc |
index d3b4e79058381652baf17f512ce57c2c8b2fb0fe..a34bc186ef216adf621bf549f7ebca9baabadde2 100644 |
--- a/base/android/jni_android.cc |
+++ b/base/android/jni_android.cc |
@@ -96,6 +96,36 @@ std::string GetJavaExceptionInfo(JNIEnv* env, jthrowable java_throwable) { |
return ConvertJavaStringToUTF8(exception_string); |
} |
+ |
+enum MethodType { |
+ METHODTYPE_STATIC, |
+ METHODTYPE_NORMAL, |
+}; |
+ |
+enum ExceptionCheck { |
+ EXCEPTIONCHECK_YES, |
+ EXCEPTIONCHECK_NO, |
+}; |
+ |
+template<MethodType method_type, ExceptionCheck exception_check> |
+jmethodID GetMethodIDInternal(JNIEnv* env, |
+ jclass clazz, |
+ const char* method_name, |
+ const char* jni_signature) { |
+ jmethodID method_id = method_type == METHODTYPE_STATIC ? |
+ env->GetStaticMethodID(clazz, method_name, jni_signature) : |
+ env->GetMethodID(clazz, method_name, jni_signature); |
+ if (exception_check == EXCEPTIONCHECK_YES) { |
+ CHECK(!base::android::ClearException(env) && method_id) << |
+ "Failed to find " << |
+ (method_type == METHODTYPE_STATIC ? "static " : "") << |
+ "method " << method_name << " " << jni_signature; |
+ } else if (base::android::HasException(env)) { |
+ env->ExceptionClear(); |
+ } |
+ return method_id; |
+} |
+ |
} // namespace |
namespace base { |
@@ -138,7 +168,7 @@ ScopedJavaLocalRef<jclass> GetClass(JNIEnv* env, const char* class_name) { |
jclass GetUnscopedClass(JNIEnv* env, const char* class_name) { |
jclass clazz = env->FindClass(class_name); |
- CHECK(clazz && !ClearException(env)) << "Failed to find class " << class_name; |
+ CHECK(!ClearException(env) && clazz) << "Failed to find class " << class_name; |
return clazz; |
} |
@@ -165,11 +195,16 @@ jmethodID GetMethodID(JNIEnv* env, |
jclass clazz, |
const char* method_name, |
const char* jni_signature) { |
- jmethodID method_id = |
- env->GetMethodID(clazz, method_name, jni_signature); |
- CHECK(method_id && !ClearException(env)) << "Failed to find method " << |
- method_name << " " << jni_signature; |
- return method_id; |
+ return GetMethodIDInternal<METHODTYPE_NORMAL, EXCEPTIONCHECK_YES>( |
+ env, clazz, method_name, jni_signature); |
+} |
+ |
+jmethodID GetMethodIDOrNull(JNIEnv* env, |
+ jclass clazz, |
+ const char* method_name, |
+ const char* jni_signature) { |
+ return GetMethodIDInternal<METHODTYPE_NORMAL, EXCEPTIONCHECK_NO>( |
+ env, clazz, method_name, jni_signature); |
} |
jmethodID GetStaticMethodID(JNIEnv* env, |
@@ -184,11 +219,16 @@ jmethodID GetStaticMethodID(JNIEnv* env, |
jclass clazz, |
const char* method_name, |
const char* jni_signature) { |
- jmethodID method_id = |
- env->GetStaticMethodID(clazz, method_name, jni_signature); |
- CHECK(method_id && !ClearException(env)) << "Failed to find static method " << |
- method_name << " " << jni_signature; |
- return method_id; |
+ return GetMethodIDInternal<METHODTYPE_STATIC, EXCEPTIONCHECK_YES>( |
+ env, clazz, method_name, jni_signature); |
+} |
+ |
+jmethodID GetStaticMethodIDOrNull(JNIEnv* env, |
+ jclass clazz, |
+ const char* method_name, |
+ const char* jni_signature) { |
+ return GetMethodIDInternal<METHODTYPE_STATIC, EXCEPTIONCHECK_NO>( |
+ env, clazz, method_name, jni_signature); |
} |
bool HasMethod(JNIEnv* env, |
@@ -211,10 +251,8 @@ jfieldID GetFieldID(JNIEnv* env, |
const char* field_name, |
const char* jni_signature) { |
jfieldID field_id = env->GetFieldID(clazz.obj(), field_name, jni_signature); |
- CHECK(field_id && !ClearException(env)) << "Failed to find field " << |
+ CHECK(!ClearException(env) && field_id) << "Failed to find field " << |
field_name << " " << jni_signature; |
- bool error = ClearException(env); |
- DCHECK(!error); |
return field_id; |
} |
@@ -238,10 +276,8 @@ jfieldID GetStaticFieldID(JNIEnv* env, |
const char* jni_signature) { |
jfieldID field_id = |
env->GetStaticFieldID(clazz.obj(), field_name, jni_signature); |
- CHECK(field_id && !ClearException(env)) << "Failed to find static field " << |
+ CHECK(!ClearException(env) && field_id) << "Failed to find static field " << |
field_name << " " << jni_signature; |
- bool error = ClearException(env); |
- DCHECK(!error); |
return field_id; |
} |