summaryrefslogtreecommitdiffstats
path: root/base/android/jni_android.cc
diff options
context:
space:
mode:
authorpeter@chromium.org <peter@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-09 21:02:27 +0000
committerpeter@chromium.org <peter@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-09 21:02:27 +0000
commitfe0f1aba6584072a969924656771becb71589fec (patch)
treef74019055cf4b2193f4b05e247b0e42c3d676c0b /base/android/jni_android.cc
parent1153596a4543e779244f410b2ecf804d9c8c54e9 (diff)
downloadchromium_src-fe0f1aba6584072a969924656771becb71589fec.zip
chromium_src-fe0f1aba6584072a969924656771becb71589fec.tar.gz
chromium_src-fe0f1aba6584072a969924656771becb71589fec.tar.bz2
Upstream Android JNI code, allowing us to use more ScopedJava references.
BUG= TEST= Review URL: http://codereview.chromium.org/9358028 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@121284 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/android/jni_android.cc')
-rw-r--r--base/android/jni_android.cc154
1 files changed, 115 insertions, 39 deletions
diff --git a/base/android/jni_android.cc b/base/android/jni_android.cc
index f99f1ab..69399ad 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