diff options
author | bulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-02 21:13:55 +0000 |
---|---|---|
committer | bulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-02 21:13:55 +0000 |
commit | 3764dddb64111f17e929e76de2835a63088593b8 (patch) | |
tree | 5068f08fb7109953e993be724e3113d5f25e4af7 /base/android/jni_android.cc | |
parent | dc544e6407ca42364b7ac9b5e79eb1ff6f3fa219 (diff) | |
download | chromium_src-3764dddb64111f17e929e76de2835a63088593b8.zip chromium_src-3764dddb64111f17e929e76de2835a63088593b8.tar.gz chromium_src-3764dddb64111f17e929e76de2835a63088593b8.tar.bz2 |
Android: adds Get(Static)MethodIDOrNULL.
When generating JNI bindings for system classes, we try to get the ids
for methods based in the .class file in the SDK.
However, this may trigger run-time errors when trying to run on an older
SDK.
For these system classes, the JNI generator will bind using the "OrNULL"
variation.
BUG=152987
TEST=
Review URL: https://chromiumcodereview.appspot.com/10996063
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@159769 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/android/jni_android.cc')
-rw-r--r-- | base/android/jni_android.cc | 70 |
1 files changed, 53 insertions, 17 deletions
diff --git a/base/android/jni_android.cc b/base/android/jni_android.cc index d3b4e79..a34bc18 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; } |