Chromium Code Reviews| Index: base/android/jni_android.cc |
| diff --git a/base/android/jni_android.cc b/base/android/jni_android.cc |
| index d3b4e79058381652baf17f512ce57c2c8b2fb0fe..ec6d823c5be2804bbc6f9935df93a383dde1a55a 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,7 +251,7 @@ 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); |
|
joth
2012/10/02 17:51:40
so we can remove this ClearException now...
bulach
2012/10/02 18:02:26
Done.
|
| DCHECK(!error); |
| @@ -238,7 +278,7 @@ 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); |
|
joth
2012/10/02 17:51:40
ditto
bulach
2012/10/02 18:02:26
Done.
|
| DCHECK(!error); |