Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(750)

Unified Diff: base/android/jni_android.cc

Issue 9358028: Upstream Android JNI code, allowing us to use more ScopedJava references. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: base/android/jni_android.cc
diff --git a/base/android/jni_android.cc b/base/android/jni_android.cc
index f99f1aba16677252e67b0c6e4268f14d0b397d71..69399ad480f3b3090dc105161fa155f64a34e66d 100644
--- a/base/android/jni_android.cc
+++ b/base/android/jni_android.cc
@@ -12,8 +12,11 @@
#include "base/threading/platform_thread.h"
namespace {
-JavaVM* g_jvm = 0;
-jobject g_application_context = NULL;
+
+JavaVM* g_jvm = NULL;
+
+base::LazyInstance<base::android::ScopedJavaGlobalRef<jobject> >
+ g_application_context = LAZY_INSTANCE_INITIALIZER;
struct MethodIdentifier {
const char* class_name;
@@ -73,13 +76,106 @@ void InitVM(JavaVM* vm) {
}
void InitApplicationContext(const JavaRef<jobject>& context) {
- DCHECK(!g_application_context);
- g_application_context = context.env()->NewGlobalRef(context.obj());
+ DCHECK(g_application_context.Get().is_null());
+ g_application_context.Get().Reset(context);
+}
+
+const jobject GetApplicationContext() {
+ DCHECK(!g_application_context.Get().is_null());
+ return g_application_context.Get().obj();
+}
+
+ScopedJavaLocalRef<jclass> GetClass(JNIEnv* env, const char* class_name) {
+ jclass clazz = env->FindClass(class_name);
+ CHECK(clazz && !ClearException(env)) << "Failed to find class " << class_name;
+ return ScopedJavaLocalRef<jclass>(env, clazz);
+}
+
+bool HasClass(JNIEnv* env, const char* class_name) {
+ ScopedJavaLocalRef<jclass> clazz(env, env->FindClass(class_name));
+ if (!clazz.obj()) {
+ ClearException(env);
+ return false;
+ }
+ bool error = ClearException(env);
+ DCHECK(!error);
+ return true;
+}
+
+jmethodID GetMethodID(JNIEnv* env,
+ const JavaRef<jclass>& clazz,
+ const char* method_name,
+ const char* jni_signature) {
+ jmethodID method_id =
+ env->GetMethodID(clazz.obj(), method_name, jni_signature);
+ CHECK(method_id && !ClearException(env)) << "Failed to find method " <<
+ method_name << " " << jni_signature;
+ return method_id;
+}
+
+jmethodID GetStaticMethodID(JNIEnv* env,
+ const JavaRef<jclass>& clazz,
+ const char* method_name,
+ const char* jni_signature) {
+ jmethodID method_id =
+ env->GetStaticMethodID(clazz.obj(), method_name, jni_signature);
+ CHECK(method_id && !ClearException(env)) << "Failed to find static method " <<
+ method_name << " " << jni_signature;
+ return method_id;
+}
+
+bool HasMethod(JNIEnv* env,
+ const JavaRef<jclass>& clazz,
+ const char* method_name,
+ const char* jni_signature) {
+ jmethodID method_id =
+ env->GetMethodID(clazz.obj(), method_name, jni_signature);
+ if (!method_id) {
+ ClearException(env);
+ return false;
+ }
+ bool error = ClearException(env);
+ DCHECK(!error);
+ return true;
}
-jobject GetApplicationContext() {
- DCHECK(g_application_context);
- return g_application_context;
+jfieldID GetFieldID(JNIEnv* env,
+ const JavaRef<jclass>& clazz,
+ 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 " <<
+ field_name << " " << jni_signature;
+ bool error = ClearException(env);
+ DCHECK(!error);
+ return field_id;
+}
+
+bool HasField(JNIEnv* env,
+ const JavaRef<jclass>& clazz,
+ const char* field_name,
+ const char* jni_signature) {
+ jfieldID field_id = env->GetFieldID(clazz.obj(), field_name, jni_signature);
+ if (!field_id) {
+ ClearException(env);
+ return false;
+ }
+ bool error = ClearException(env);
+ DCHECK(!error);
+ return true;
+}
+
+jfieldID GetStaticFieldID(JNIEnv* env,
+ const JavaRef<jclass>& clazz,
+ const char* field_name,
+ 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 " <<
+ field_name << " " << jni_signature;
+ bool error = ClearException(env);
+ DCHECK(!error);
+ return field_id;
}
jmethodID GetMethodIDFromClassName(JNIEnv* env,
@@ -111,7 +207,7 @@ jmethodID GetMethodIDFromClassName(JNIEnv* env,
}
ScopedJavaLocalRef<jclass> clazz(env, env->FindClass(class_name));
- jmethodID id = GetMethodID(env, clazz.obj(), method, jni_signature);
+ jmethodID id = GetMethodID(env, clazz, method, jni_signature);
while (base::subtle::Acquire_CompareAndSwap(&g_method_id_map_lock,
kUnlocked,
@@ -127,43 +223,23 @@ jmethodID GetMethodIDFromClassName(JNIEnv* env,
return id;
}
-jmethodID GetMethodID(JNIEnv* env,
- jclass clazz,
- const char* const method,
- const char* const jni_signature) {
- jmethodID id = env->GetMethodID(clazz, method, jni_signature);
- DCHECK(id) << method;
- CheckException(env);
- return id;
+bool HasException(JNIEnv* env) {
+ return env->ExceptionCheck() != JNI_FALSE;
}
-jmethodID GetStaticMethodID(JNIEnv* env,
- jclass clazz,
- const char* const method,
- const char* const jni_signature) {
- jmethodID id = env->GetStaticMethodID(clazz, method, jni_signature);
- DCHECK(id) << method;
- CheckException(env);
- return id;
-}
-
-jfieldID GetFieldID(JNIEnv* env,
- jclass clazz,
- const char* field,
- const char* jni_signature) {
- jfieldID id = env->GetFieldID(clazz, field, jni_signature);
- DCHECK(id) << field;
- CheckException(env);
- return id;
-}
-
-bool CheckException(JNIEnv* env) {
- if (env->ExceptionCheck() == JNI_FALSE)
+bool ClearException(JNIEnv* env) {
+ if (!HasException(env))
return false;
- env->ExceptionDescribe();
env->ExceptionClear();
return true;
}
+void CheckException(JNIEnv* env) {
+ if (HasException(env)) {
+ env->ExceptionDescribe();
+ CHECK(false);
+ }
+}
+
} // namespace android
} // namespace base

Powered by Google App Engine
This is Rietveld 408576698