| 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;
|
| }
|
|
|
|
|