diff options
author | bulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-01 15:51:51 +0000 |
---|---|---|
committer | bulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-01 15:51:51 +0000 |
commit | ec34c46c7888ff496b4599a11a154ff84f399553 (patch) | |
tree | 11e8b1cfe57c037a990340c3e5115aab78901259 /base/android | |
parent | 1125eece219e7ff2e2f3cfcd37a35b5d8d114bed (diff) | |
download | chromium_src-ec34c46c7888ff496b4599a11a154ff84f399553.zip chromium_src-ec34c46c7888ff496b4599a11a154ff84f399553.tar.gz chromium_src-ec34c46c7888ff496b4599a11a154ff84f399553.tar.bz2 |
Fixes JNI Bindings & startup perf.
This patch follows digit's suggestions:
- Removes ScopedJavaObject for jclasses.
- Uses const char kFoo[] rather than pointers.
BUG=
TEST=base/android/jni_generator/jni_generator_tests.py
Review URL: http://codereview.chromium.org/9466024
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@124413 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/android')
-rw-r--r-- | base/android/jni_generator/golden_sample_for_tests_jni.h | 86 | ||||
-rw-r--r-- | base/android/jni_generator/jni_generator.py | 27 | ||||
-rw-r--r-- | base/android/jni_generator/jni_generator_tests.py | 256 |
3 files changed, 188 insertions, 181 deletions
diff --git a/base/android/jni_generator/golden_sample_for_tests_jni.h b/base/android/jni_generator/golden_sample_for_tests_jni.h index 10bc633..336bdce 100644 --- a/base/android/jni_generator/golden_sample_for_tests_jni.h +++ b/base/android/jni_generator/golden_sample_for_tests_jni.h @@ -22,18 +22,14 @@ using base::android::ScopedJavaLocalRef; // Step 1: forward declarations. namespace { -const char* const kInnerClassClassPath = +const char kInnerClassClassPath[] = "org/chromium/example/jni_generator/SampleForTests$InnerClass"; -const char* const kSampleForTestsClassPath = +const char kSampleForTestsClassPath[] = "org/chromium/example/jni_generator/SampleForTests"; -// Leaking this JavaRef as we cannot use LazyInstance from some threads. -base::android::ScopedJavaGlobalRef<jclass>& - g_InnerClass_clazz = - *(new base::android::ScopedJavaGlobalRef<jclass>()); -// Leaking this JavaRef as we cannot use LazyInstance from some threads. -base::android::ScopedJavaGlobalRef<jclass>& - g_SampleForTests_clazz = - *(new base::android::ScopedJavaGlobalRef<jclass>()); +// Leaking this jclass as we cannot use LazyInstance from some threads. +jclass g_InnerClass_clazz = NULL; +// Leaking this jclass as we cannot use LazyInstance from some threads. +jclass g_SampleForTests_clazz = NULL; } // namespace static jint Init(JNIEnv* env, jobject obj); @@ -90,7 +86,7 @@ static jmethodID g_SampleForTests_javaMethod = 0; static jint Java_SampleForTests_javaMethod(JNIEnv* env, jobject obj, jint foo, jint bar) { /* Must call RegisterNativesImpl() */ - DCHECK(!g_SampleForTests_clazz.is_null()); + DCHECK(g_SampleForTests_clazz); DCHECK(g_SampleForTests_javaMethod); jint ret = env->CallIntMethod(obj, @@ -102,10 +98,10 @@ static jint Java_SampleForTests_javaMethod(JNIEnv* env, jobject obj, jint foo, static jmethodID g_SampleForTests_staticJavaMethod = 0; static jboolean Java_SampleForTests_staticJavaMethod(JNIEnv* env) { /* Must call RegisterNativesImpl() */ - DCHECK(!g_SampleForTests_clazz.is_null()); + DCHECK(g_SampleForTests_clazz); DCHECK(g_SampleForTests_staticJavaMethod); jboolean ret = - env->CallStaticBooleanMethod(g_SampleForTests_clazz.obj(), + env->CallStaticBooleanMethod(g_SampleForTests_clazz, g_SampleForTests_staticJavaMethod); base::android::CheckException(env); return ret; @@ -115,7 +111,7 @@ static jmethodID g_SampleForTests_packagePrivateJavaMethod = 0; static void Java_SampleForTests_packagePrivateJavaMethod(JNIEnv* env, jobject obj) { /* Must call RegisterNativesImpl() */ - DCHECK(!g_SampleForTests_clazz.is_null()); + DCHECK(g_SampleForTests_clazz); DCHECK(g_SampleForTests_packagePrivateJavaMethod); env->CallVoidMethod(obj, @@ -128,7 +124,7 @@ static jmethodID g_SampleForTests_methodThatThrowsException = 0; static void Java_SampleForTests_methodThatThrowsException(JNIEnv* env, jobject obj) { /* Must call RegisterNativesImpl() */ - DCHECK(!g_SampleForTests_clazz.is_null()); + DCHECK(g_SampleForTests_clazz); DCHECK(g_SampleForTests_methodThatThrowsException); env->CallVoidMethod(obj, @@ -140,7 +136,7 @@ static void Java_SampleForTests_methodThatThrowsException(JNIEnv* env, jobject static jmethodID g_InnerClass_JavaInnerMethod = 0; static jfloat Java_InnerClass_JavaInnerMethod(JNIEnv* env, jobject obj) { /* Must call RegisterNativesImpl() */ - DCHECK(!g_InnerClass_clazz.is_null()); + DCHECK(g_InnerClass_clazz); DCHECK(g_InnerClass_JavaInnerMethod); jfloat ret = env->CallFloatMethod(obj, @@ -152,10 +148,10 @@ static jfloat Java_InnerClass_JavaInnerMethod(JNIEnv* env, jobject obj) { static jmethodID g_InnerClass_javaInnerFunction = 0; static void Java_InnerClass_javaInnerFunction(JNIEnv* env) { /* Must call RegisterNativesImpl() */ - DCHECK(!g_InnerClass_clazz.is_null()); + DCHECK(g_InnerClass_clazz); DCHECK(g_InnerClass_javaInnerFunction); - env->CallStaticVoidMethod(g_InnerClass_clazz.obj(), + env->CallStaticVoidMethod(g_InnerClass_clazz, g_InnerClass_javaInnerFunction); base::android::CheckException(env); @@ -165,13 +161,14 @@ static void Java_InnerClass_javaInnerFunction(JNIEnv* env) { static void GetMethodIDsImpl(JNIEnv* env) { - g_InnerClass_clazz.Reset( - base::android::GetClass(env, kInnerClassClassPath)); - g_SampleForTests_clazz.Reset( - base::android::GetClass(env, kSampleForTestsClassPath)); - g_SampleForTests_javaMethod = base::android::GetMethodID( - env, g_SampleForTests_clazz, - "javaMethod", + g_InnerClass_clazz = reinterpret_cast<jclass>(env->NewGlobalRef( + base::android::GetUnscopedClass(env, kInnerClassClassPath))); + g_SampleForTests_clazz = reinterpret_cast<jclass>(env->NewGlobalRef( + base::android::GetUnscopedClass(env, kSampleForTestsClassPath))); + g_SampleForTests_javaMethod = + base::android::GetMethodID( + env, g_SampleForTests_clazz, + "javaMethod", "(" "I" @@ -179,41 +176,46 @@ static void GetMethodIDsImpl(JNIEnv* env) { ")" "I"); - g_SampleForTests_staticJavaMethod = base::android::GetStaticMethodID( - env, g_SampleForTests_clazz, - "staticJavaMethod", + g_SampleForTests_staticJavaMethod = + base::android::GetStaticMethodID( + env, g_SampleForTests_clazz, + "staticJavaMethod", "(" ")" "Z"); - g_SampleForTests_packagePrivateJavaMethod = base::android::GetMethodID( - env, g_SampleForTests_clazz, - "packagePrivateJavaMethod", + g_SampleForTests_packagePrivateJavaMethod = + base::android::GetMethodID( + env, g_SampleForTests_clazz, + "packagePrivateJavaMethod", "(" ")" "V"); - g_SampleForTests_methodThatThrowsException = base::android::GetMethodID( - env, g_SampleForTests_clazz, - "methodThatThrowsException", + g_SampleForTests_methodThatThrowsException = + base::android::GetMethodID( + env, g_SampleForTests_clazz, + "methodThatThrowsException", "(" ")" "V"); - g_InnerClass_JavaInnerMethod = base::android::GetMethodID( - env, g_InnerClass_clazz, - "JavaInnerMethod", + g_InnerClass_JavaInnerMethod = + base::android::GetMethodID( + env, g_InnerClass_clazz, + "JavaInnerMethod", "(" ")" "F"); - g_InnerClass_javaInnerFunction = base::android::GetStaticMethodID( - env, g_InnerClass_clazz, - "javaInnerFunction", + g_InnerClass_javaInnerFunction = + base::android::GetStaticMethodID( + env, g_InnerClass_clazz, + "javaInnerFunction", "(" ")" @@ -237,7 +239,7 @@ static bool RegisterNativesImpl(JNIEnv* env) { }; const int kMethodsInnerClassSize = arraysize(kMethodsInnerClass); - if (env->RegisterNatives(g_InnerClass_clazz.obj(), + if (env->RegisterNatives(g_InnerClass_clazz, kMethodsInnerClass, kMethodsInnerClassSize) < 0) { LOG(ERROR) << "RegisterNatives failed in " << __FILE__; @@ -284,7 +286,7 @@ static bool RegisterNativesImpl(JNIEnv* env) { }; const int kMethodsSampleForTestsSize = arraysize(kMethodsSampleForTests); - if (env->RegisterNatives(g_SampleForTests_clazz.obj(), + if (env->RegisterNatives(g_SampleForTests_clazz, kMethodsSampleForTests, kMethodsSampleForTestsSize) < 0) { LOG(ERROR) << "RegisterNatives failed in " << __FILE__; diff --git a/base/android/jni_generator/jni_generator.py b/base/android/jni_generator/jni_generator.py index 0a42f4c..8cccb3e 100644 --- a/base/android/jni_generator/jni_generator.py +++ b/base/android/jni_generator/jni_generator.py @@ -605,7 +605,7 @@ ${KMETHODS} }; const int kMethods${JAVA_CLASS}Size = arraysize(kMethods${JAVA_CLASS}); - if (env->RegisterNatives(g_${JAVA_CLASS}_clazz.obj(), + if (env->RegisterNatives(g_${JAVA_CLASS}_clazz, kMethods${JAVA_CLASS}, kMethods${JAVA_CLASS}Size) < 0) { LOG(ERROR) << "RegisterNatives failed in " << __FILE__; @@ -724,7 +724,7 @@ ${FUNCTION_SIGNATURE} {""") static jmethodID g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME} = 0; ${FUNCTION_HEADER} /* Must call RegisterNativesImpl() */ - DCHECK(!g_${JAVA_CLASS}_clazz.is_null()); + DCHECK(g_${JAVA_CLASS}_clazz); DCHECK(g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME}); ${RETURN_DECLARATION} ${PRE_CALL}env->Call${STATIC}${ENV_CALL}Method(${FIRST_PARAM_IN_CALL}, @@ -734,7 +734,7 @@ ${FUNCTION_HEADER} }""") if called_by_native.static: first_param_in_declaration = '' - first_param_in_call = ('g_%s_clazz.obj()' % + first_param_in_call = ('g_%s_clazz' % (called_by_native.java_class_name or self.class_name)) else: @@ -816,7 +816,7 @@ ${FUNCTION_HEADER} """Returns the ClassPath constants.""" ret = [] template = Template("""\ -const char* const k${JAVA_CLASS}ClassPath = "${JNI_CLASS_PATH}";""") +const char k${JAVA_CLASS}ClassPath[] = "${JNI_CLASS_PATH}";""") native_classes = self.GetUniqueClasses(self.natives) called_by_native_classes = self.GetUniqueClasses(self.called_by_natives) all_classes = native_classes @@ -830,10 +830,8 @@ const char* const k${JAVA_CLASS}ClassPath = "${JNI_CLASS_PATH}";""") ret += '' for clazz in called_by_native_classes: template = Template("""\ -// Leaking this JavaRef as we cannot use LazyInstance from some threads. -base::android::ScopedJavaGlobalRef<jclass>& - g_${JAVA_CLASS}_clazz = - *(new base::android::ScopedJavaGlobalRef<jclass>());""") +// Leaking this jclass as we cannot use LazyInstance from some threads. +jclass g_${JAVA_CLASS}_clazz = NULL;""") values = { 'JAVA_CLASS': clazz, } @@ -843,8 +841,8 @@ base::android::ScopedJavaGlobalRef<jclass>& def GetFindClasses(self): """Returns the imlementation of FindClass for all known classes.""" template = Template("""\ - g_${JAVA_CLASS}_clazz.Reset( - base::android::GetClass(env, k${JAVA_CLASS}ClassPath));""") + g_${JAVA_CLASS}_clazz = reinterpret_cast<jclass>(env->NewGlobalRef( + base::android::GetUnscopedClass(env, k${JAVA_CLASS}ClassPath)));""") ret = [] for clazz in self.GetUniqueClasses(self.called_by_natives): values = {'JAVA_CLASS': clazz} @@ -854,10 +852,11 @@ base::android::ScopedJavaGlobalRef<jclass>& def GetMethodIDImpl(self, called_by_native): """Returns the implementation of GetMethodID.""" template = Template("""\ - g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME} = base::android::Get${STATIC}MethodID( - env, g_${JAVA_CLASS}_clazz, - "${NAME}", - ${JNI_SIGNATURE}); + g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME} = + base::android::Get${STATIC}MethodID( + env, g_${JAVA_CLASS}_clazz, + "${NAME}", + ${JNI_SIGNATURE}); """) values = { 'JAVA_CLASS': called_by_native.java_class_name or self.class_name, diff --git a/base/android/jni_generator/jni_generator_tests.py b/base/android/jni_generator/jni_generator_tests.py index 0c5c0ce..17767d5 100644 --- a/base/android/jni_generator/jni_generator_tests.py +++ b/base/android/jni_generator/jni_generator_tests.py @@ -47,6 +47,10 @@ class TestGenerator(unittest.TestCase): print self.id() for line in difflib.context_diff(stripped_golden, stripped_generated): print line + print '\n\nGenerated' + print '=' * 80 + print generated_text + print '=' * 80 self.fail('Golden text mismatch') def testNatives(self): @@ -227,11 +231,9 @@ using base::android::ScopedJavaLocalRef; // Step 1: forward declarations. namespace { -const char* const kTestJniClassPath = "org/chromium/TestJni"; -// Leaking this JavaRef as we cannot use LazyInstance from some threads. -base::android::ScopedJavaGlobalRef<jclass>& - g_TestJni_clazz = - *(new base::android::ScopedJavaGlobalRef<jclass>()); +const char kTestJniClassPath[] = "org/chromium/TestJni"; +// Leaking this jclass as we cannot use LazyInstance from some threads. +jclass g_TestJni_clazz = NULL; } // namespace static jint Init(JNIEnv* env, jobject obj); @@ -331,8 +333,8 @@ static void GotOrientation(JNIEnv* env, jobject obj, static void GetMethodIDsImpl(JNIEnv* env) { - g_TestJni_clazz.Reset( - base::android::GetClass(env, kTestJniClassPath)); + g_TestJni_clazz = reinterpret_cast<jclass>(env->NewGlobalRef( + base::android::GetUnscopedClass(env, kTestJniClassPath))); } static bool RegisterNativesImpl(JNIEnv* env) { @@ -426,7 +428,7 @@ static bool RegisterNativesImpl(JNIEnv* env) { }; const int kMethodsTestJniSize = arraysize(kMethodsTestJni); - if (env->RegisterNatives(g_TestJni_clazz.obj(), + if (env->RegisterNatives(g_TestJni_clazz, kMethodsTestJni, kMethodsTestJniSize) < 0) { LOG(ERROR) << "RegisterNatives failed in " << __FILE__; @@ -482,12 +484,10 @@ using base::android::ScopedJavaLocalRef; // Step 1: forward declarations. namespace { -const char* const kTestJniClassPath = "org/chromium/TestJni"; -const char* const kMyInnerClassClassPath = "org/chromium/TestJni$MyInnerClass"; -// Leaking this JavaRef as we cannot use LazyInstance from some threads. -base::android::ScopedJavaGlobalRef<jclass>& - g_TestJni_clazz = - *(new base::android::ScopedJavaGlobalRef<jclass>()); +const char kTestJniClassPath[] = "org/chromium/TestJni"; +const char kMyInnerClassClassPath[] = "org/chromium/TestJni$MyInnerClass"; +// Leaking this jclass as we cannot use LazyInstance from some threads. +jclass g_TestJni_clazz = NULL; } // namespace static jint Init(JNIEnv* env, jobject obj); @@ -500,8 +500,8 @@ static jint Init(JNIEnv* env, jobject obj); static void GetMethodIDsImpl(JNIEnv* env) { - g_TestJni_clazz.Reset( - base::android::GetClass(env, kTestJniClassPath)); + g_TestJni_clazz = reinterpret_cast<jclass>(env->NewGlobalRef( + base::android::GetUnscopedClass(env, kTestJniClassPath))); } static bool RegisterNativesImpl(JNIEnv* env) { @@ -515,7 +515,7 @@ static bool RegisterNativesImpl(JNIEnv* env) { }; const int kMethodsMyInnerClassSize = arraysize(kMethodsMyInnerClass); - if (env->RegisterNatives(g_MyInnerClass_clazz.obj(), + if (env->RegisterNatives(g_MyInnerClass_clazz, kMethodsMyInnerClass, kMethodsMyInnerClassSize) < 0) { LOG(ERROR) << "RegisterNatives failed in " << __FILE__; @@ -579,14 +579,12 @@ using base::android::ScopedJavaLocalRef; // Step 1: forward declarations. namespace { -const char* const kMyOtherInnerClassClassPath = +const char kMyOtherInnerClassClassPath[] = "org/chromium/TestJni$MyOtherInnerClass"; -const char* const kTestJniClassPath = "org/chromium/TestJni"; -const char* const kMyInnerClassClassPath = "org/chromium/TestJni$MyInnerClass"; -// Leaking this JavaRef as we cannot use LazyInstance from some threads. -base::android::ScopedJavaGlobalRef<jclass>& - g_TestJni_clazz = - *(new base::android::ScopedJavaGlobalRef<jclass>()); +const char kTestJniClassPath[] = "org/chromium/TestJni"; +const char kMyInnerClassClassPath[] = "org/chromium/TestJni$MyInnerClass"; +// Leaking this jclass as we cannot use LazyInstance from some threads. +jclass g_TestJni_clazz = NULL; } // namespace static jint Init(JNIEnv* env, jobject obj); @@ -602,8 +600,8 @@ static jint Init(JNIEnv* env, jobject obj); static void GetMethodIDsImpl(JNIEnv* env) { - g_TestJni_clazz.Reset( - base::android::GetClass(env, kTestJniClassPath)); + g_TestJni_clazz = reinterpret_cast<jclass>(env->NewGlobalRef( + base::android::GetUnscopedClass(env, kTestJniClassPath))); } static bool RegisterNativesImpl(JNIEnv* env) { @@ -618,7 +616,7 @@ static bool RegisterNativesImpl(JNIEnv* env) { const int kMethodsMyOtherInnerClassSize = arraysize(kMethodsMyOtherInnerClass); - if (env->RegisterNatives(g_MyOtherInnerClass_clazz.obj(), + if (env->RegisterNatives(g_MyOtherInnerClass_clazz, kMethodsMyOtherInnerClass, kMethodsMyOtherInnerClassSize) < 0) { LOG(ERROR) << "RegisterNatives failed in " << __FILE__; @@ -633,7 +631,7 @@ static bool RegisterNativesImpl(JNIEnv* env) { }; const int kMethodsMyInnerClassSize = arraysize(kMethodsMyInnerClass); - if (env->RegisterNatives(g_MyInnerClass_clazz.obj(), + if (env->RegisterNatives(g_MyInnerClass_clazz, kMethodsMyInnerClass, kMethodsMyInnerClassSize) < 0) { LOG(ERROR) << "RegisterNatives failed in " << __FILE__; @@ -696,13 +694,11 @@ using base::android::ScopedJavaLocalRef; // Step 1: forward declarations. namespace { -const char* const kMyOtherInnerClassClassPath = +const char kMyOtherInnerClassClassPath[] = "org/chromium/TestJni$MyOtherInnerClass"; -const char* const kTestJniClassPath = "org/chromium/TestJni"; -// Leaking this JavaRef as we cannot use LazyInstance from some threads. -base::android::ScopedJavaGlobalRef<jclass>& - g_TestJni_clazz = - *(new base::android::ScopedJavaGlobalRef<jclass>()); +const char kTestJniClassPath[] = "org/chromium/TestJni"; +// Leaking this jclass as we cannot use LazyInstance from some threads. +jclass g_TestJni_clazz = NULL; } // namespace static jint Init(JNIEnv* env, jobject obj); @@ -718,8 +714,8 @@ static jint Init(JNIEnv* env, jobject obj); static void GetMethodIDsImpl(JNIEnv* env) { - g_TestJni_clazz.Reset( - base::android::GetClass(env, kTestJniClassPath)); + g_TestJni_clazz = reinterpret_cast<jclass>(env->NewGlobalRef( + base::android::GetUnscopedClass(env, kTestJniClassPath))); } static bool RegisterNativesImpl(JNIEnv* env) { @@ -734,7 +730,7 @@ static bool RegisterNativesImpl(JNIEnv* env) { const int kMethodsMyOtherInnerClassSize = arraysize(kMethodsMyOtherInnerClass); - if (env->RegisterNatives(g_MyOtherInnerClass_clazz.obj(), + if (env->RegisterNatives(g_MyOtherInnerClass_clazz, kMethodsMyOtherInnerClass, kMethodsMyOtherInnerClassSize) < 0) { LOG(ERROR) << "RegisterNatives failed in " << __FILE__; @@ -749,7 +745,7 @@ static bool RegisterNativesImpl(JNIEnv* env) { }; const int kMethodsTestJniSize = arraysize(kMethodsTestJni); - if (env->RegisterNatives(g_TestJni_clazz.obj(), + if (env->RegisterNatives(g_TestJni_clazz, kMethodsTestJni, kMethodsTestJniSize) < 0) { LOG(ERROR) << "RegisterNatives failed in " << __FILE__; @@ -934,16 +930,12 @@ using base::android::ScopedJavaLocalRef; // Step 1: forward declarations. namespace { -const char* const kTestJniClassPath = "org/chromium/TestJni"; -const char* const kInfoBarClassPath = "org/chromium/TestJni$InfoBar"; -// Leaking this JavaRef as we cannot use LazyInstance from some threads. -base::android::ScopedJavaGlobalRef<jclass>& - g_TestJni_clazz = - *(new base::android::ScopedJavaGlobalRef<jclass>()); -// Leaking this JavaRef as we cannot use LazyInstance from some threads. -base::android::ScopedJavaGlobalRef<jclass>& - g_InfoBar_clazz = - *(new base::android::ScopedJavaGlobalRef<jclass>()); +const char kTestJniClassPath[] = "org/chromium/TestJni"; +const char kInfoBarClassPath[] = "org/chromium/TestJni$InfoBar"; +// Leaking this jclass as we cannot use LazyInstance from some threads. +jclass g_TestJni_clazz = NULL; +// Leaking this jclass as we cannot use LazyInstance from some threads. +jclass g_InfoBar_clazz = NULL; } // namespace @@ -957,7 +949,7 @@ static ScopedJavaLocalRef<jobject> Java_TestJni_showConfirmInfoBar(JNIEnv* env, jstring title, jobject icon) { /* Must call RegisterNativesImpl() */ - DCHECK(!g_TestJni_clazz.is_null()); + DCHECK(g_TestJni_clazz); DCHECK(g_TestJni_showConfirmInfoBar); jobject ret = env->CallObjectMethod(obj, @@ -974,7 +966,7 @@ static ScopedJavaLocalRef<jobject> Java_TestJni_showAutoLoginInfoBar(JNIEnv* jstring account, jstring args) { /* Must call RegisterNativesImpl() */ - DCHECK(!g_TestJni_clazz.is_null()); + DCHECK(g_TestJni_clazz); DCHECK(g_TestJni_showAutoLoginInfoBar); jobject ret = env->CallObjectMethod(obj, @@ -986,7 +978,7 @@ static ScopedJavaLocalRef<jobject> Java_TestJni_showAutoLoginInfoBar(JNIEnv* static jmethodID g_InfoBar_dismiss = 0; static void Java_InfoBar_dismiss(JNIEnv* env, jobject obj) { /* Must call RegisterNativesImpl() */ - DCHECK(!g_InfoBar_clazz.is_null()); + DCHECK(g_InfoBar_clazz); DCHECK(g_InfoBar_dismiss); env->CallVoidMethod(obj, @@ -1002,10 +994,10 @@ static jboolean Java_TestJni_shouldShowAutoLogin(JNIEnv* env, jobject jstring account, jstring args) { /* Must call RegisterNativesImpl() */ - DCHECK(!g_TestJni_clazz.is_null()); + DCHECK(g_TestJni_clazz); DCHECK(g_TestJni_shouldShowAutoLogin); jboolean ret = - env->CallStaticBooleanMethod(g_TestJni_clazz.obj(), + env->CallStaticBooleanMethod(g_TestJni_clazz, g_TestJni_shouldShowAutoLogin, chromeView, realm, account, args); base::android::CheckException(env); return ret; @@ -1015,10 +1007,10 @@ static jmethodID g_TestJni_openUrl = 0; static ScopedJavaLocalRef<jobject> Java_TestJni_openUrl(JNIEnv* env, jstring url) { /* Must call RegisterNativesImpl() */ - DCHECK(!g_TestJni_clazz.is_null()); + DCHECK(g_TestJni_clazz); DCHECK(g_TestJni_openUrl); jobject ret = - env->CallStaticObjectMethod(g_TestJni_clazz.obj(), + env->CallStaticObjectMethod(g_TestJni_clazz, g_TestJni_openUrl, url); base::android::CheckException(env); return ScopedJavaLocalRef<jobject>(env, ret); @@ -1032,7 +1024,7 @@ static void Java_TestJni_activateHardwareAcceleration(JNIEnv* env, jobject obj, jint iPrimaryID, jint iSecondaryID) { /* Must call RegisterNativesImpl() */ - DCHECK(!g_TestJni_clazz.is_null()); + DCHECK(g_TestJni_clazz); DCHECK(g_TestJni_activateHardwareAcceleration); env->CallVoidMethod(obj, @@ -1045,7 +1037,7 @@ static void Java_TestJni_activateHardwareAcceleration(JNIEnv* env, jobject obj, static jmethodID g_TestJni_uncheckedCall = 0; static void Java_TestJni_uncheckedCall(JNIEnv* env, jobject obj, jint iParam) { /* Must call RegisterNativesImpl() */ - DCHECK(!g_TestJni_clazz.is_null()); + DCHECK(g_TestJni_clazz); DCHECK(g_TestJni_uncheckedCall); env->CallVoidMethod(obj, @@ -1058,13 +1050,14 @@ static void Java_TestJni_uncheckedCall(JNIEnv* env, jobject obj, jint iParam) { static void GetMethodIDsImpl(JNIEnv* env) { - g_TestJni_clazz.Reset( - base::android::GetClass(env, kTestJniClassPath)); - g_InfoBar_clazz.Reset( - base::android::GetClass(env, kInfoBarClassPath)); - g_TestJni_showConfirmInfoBar = base::android::GetMethodID( - env, g_TestJni_clazz, - "showConfirmInfoBar", + g_TestJni_clazz = reinterpret_cast<jclass>(env->NewGlobalRef( + base::android::GetUnscopedClass(env, kTestJniClassPath))); + g_InfoBar_clazz = reinterpret_cast<jclass>(env->NewGlobalRef( + base::android::GetUnscopedClass(env, kInfoBarClassPath))); + g_TestJni_showConfirmInfoBar = + base::android::GetMethodID( + env, g_TestJni_clazz, + "showConfirmInfoBar", "(" "I" @@ -1075,9 +1068,10 @@ static void GetMethodIDsImpl(JNIEnv* env) { ")" "Lcom/android/chrome/infobar/InfoBarContainer$NativeInfoBar;"); - g_TestJni_showAutoLoginInfoBar = base::android::GetMethodID( - env, g_TestJni_clazz, - "showAutoLoginInfoBar", + g_TestJni_showAutoLoginInfoBar = + base::android::GetMethodID( + env, g_TestJni_clazz, + "showAutoLoginInfoBar", "(" "I" @@ -1087,17 +1081,19 @@ static void GetMethodIDsImpl(JNIEnv* env) { ")" "Lcom/android/chrome/infobar/InfoBarContainer$NativeInfoBar;"); - g_InfoBar_dismiss = base::android::GetMethodID( - env, g_InfoBar_clazz, - "dismiss", + g_InfoBar_dismiss = + base::android::GetMethodID( + env, g_InfoBar_clazz, + "dismiss", "(" ")" "V"); - g_TestJni_shouldShowAutoLogin = base::android::GetStaticMethodID( - env, g_TestJni_clazz, - "shouldShowAutoLogin", + g_TestJni_shouldShowAutoLogin = + base::android::GetStaticMethodID( + env, g_TestJni_clazz, + "shouldShowAutoLogin", "(" "Lorg/chromium/chromeview/ChromeView;" @@ -1107,18 +1103,20 @@ static void GetMethodIDsImpl(JNIEnv* env) { ")" "Z"); - g_TestJni_openUrl = base::android::GetStaticMethodID( - env, g_TestJni_clazz, - "openUrl", + g_TestJni_openUrl = + base::android::GetStaticMethodID( + env, g_TestJni_clazz, + "openUrl", "(" "Ljava/lang/String;" ")" "Ljava/io/InputStream;"); - g_TestJni_activateHardwareAcceleration = base::android::GetMethodID( - env, g_TestJni_clazz, - "activateHardwareAcceleration", + g_TestJni_activateHardwareAcceleration = + base::android::GetMethodID( + env, g_TestJni_clazz, + "activateHardwareAcceleration", "(" "Z" @@ -1129,9 +1127,10 @@ static void GetMethodIDsImpl(JNIEnv* env) { ")" "V"); - g_TestJni_uncheckedCall = base::android::GetMethodID( - env, g_TestJni_clazz, - "uncheckedCall", + g_TestJni_uncheckedCall = + base::android::GetMethodID( + env, g_TestJni_clazz, + "uncheckedCall", "(" "I" @@ -1236,11 +1235,9 @@ using base::android::ScopedJavaLocalRef; // Step 1: forward declarations. namespace { -const char* const kInputStreamClassPath = "java/io/InputStream"; -// Leaking this JavaRef as we cannot use LazyInstance from some threads. -base::android::ScopedJavaGlobalRef<jclass>& - g_InputStream_clazz = - *(new base::android::ScopedJavaGlobalRef<jclass>()); +const char kInputStreamClassPath[] = "java/io/InputStream"; +// Leaking this jclass as we cannot use LazyInstance from some threads. +jclass g_InputStream_clazz = NULL; } // namespace @@ -1251,7 +1248,7 @@ static jint Java_InputStream_available(JNIEnv* env, jobject obj) __attribute__ ((unused)); static jint Java_InputStream_available(JNIEnv* env, jobject obj) { /* Must call RegisterNativesImpl() */ - DCHECK(!g_InputStream_clazz.is_null()); + DCHECK(g_InputStream_clazz); DCHECK(g_InputStream_available); jint ret = env->CallIntMethod(obj, @@ -1265,7 +1262,7 @@ static void Java_InputStream_close(JNIEnv* env, jobject obj) __attribute__ ((unused)); static void Java_InputStream_close(JNIEnv* env, jobject obj) { /* Must call RegisterNativesImpl() */ - DCHECK(!g_InputStream_clazz.is_null()); + DCHECK(g_InputStream_clazz); DCHECK(g_InputStream_close); env->CallVoidMethod(obj, @@ -1279,7 +1276,7 @@ static void Java_InputStream_mark(JNIEnv* env, jobject obj, jint p0) __attribute__ ((unused)); static void Java_InputStream_mark(JNIEnv* env, jobject obj, jint p0) { /* Must call RegisterNativesImpl() */ - DCHECK(!g_InputStream_clazz.is_null()); + DCHECK(g_InputStream_clazz); DCHECK(g_InputStream_mark); env->CallVoidMethod(obj, @@ -1293,7 +1290,7 @@ static jboolean Java_InputStream_markSupported(JNIEnv* env, jobject obj) __attribute__ ((unused)); static jboolean Java_InputStream_markSupported(JNIEnv* env, jobject obj) { /* Must call RegisterNativesImpl() */ - DCHECK(!g_InputStream_clazz.is_null()); + DCHECK(g_InputStream_clazz); DCHECK(g_InputStream_markSupported); jboolean ret = env->CallBooleanMethod(obj, @@ -1307,7 +1304,7 @@ static jint Java_InputStream_read(JNIEnv* env, jobject obj) __attribute__ ((unused)); static jint Java_InputStream_read(JNIEnv* env, jobject obj) { /* Must call RegisterNativesImpl() */ - DCHECK(!g_InputStream_clazz.is_null()); + DCHECK(g_InputStream_clazz); DCHECK(g_InputStream_read_pqI); jint ret = env->CallIntMethod(obj, @@ -1321,7 +1318,7 @@ static jint Java_InputStream_read(JNIEnv* env, jobject obj, jbyteArray p0) __attribute__ ((unused)); static jint Java_InputStream_read(JNIEnv* env, jobject obj, jbyteArray p0) { /* Must call RegisterNativesImpl() */ - DCHECK(!g_InputStream_clazz.is_null()); + DCHECK(g_InputStream_clazz); DCHECK(g_InputStream_read_paBqI); jint ret = env->CallIntMethod(obj, @@ -1338,7 +1335,7 @@ static jint Java_InputStream_read(JNIEnv* env, jobject obj, jbyteArray p0, jint p1, jint p2) { /* Must call RegisterNativesImpl() */ - DCHECK(!g_InputStream_clazz.is_null()); + DCHECK(g_InputStream_clazz); DCHECK(g_InputStream_read_paBIIqI); jint ret = env->CallIntMethod(obj, @@ -1352,7 +1349,7 @@ static void Java_InputStream_reset(JNIEnv* env, jobject obj) __attribute__ ((unused)); static void Java_InputStream_reset(JNIEnv* env, jobject obj) { /* Must call RegisterNativesImpl() */ - DCHECK(!g_InputStream_clazz.is_null()); + DCHECK(g_InputStream_clazz); DCHECK(g_InputStream_reset); env->CallVoidMethod(obj, @@ -1366,7 +1363,7 @@ static jlong Java_InputStream_skip(JNIEnv* env, jobject obj, jlong p0) __attribute__ ((unused)); static jlong Java_InputStream_skip(JNIEnv* env, jobject obj, jlong p0) { /* Must call RegisterNativesImpl() */ - DCHECK(!g_InputStream_clazz.is_null()); + DCHECK(g_InputStream_clazz); DCHECK(g_InputStream_skip); jlong ret = env->CallLongMethod(obj, @@ -1379,61 +1376,68 @@ static jlong Java_InputStream_skip(JNIEnv* env, jobject obj, jlong p0) { namespace JNI_InputStream { static void GetMethodIDsImpl(JNIEnv* env) { - g_InputStream_clazz.Reset( - base::android::GetClass(env, kInputStreamClassPath)); - g_InputStream_available = base::android::GetMethodID( - env, g_InputStream_clazz, - "available", + g_InputStream_clazz = reinterpret_cast<jclass>(env->NewGlobalRef( + base::android::GetUnscopedClass(env, kInputStreamClassPath))); + g_InputStream_available = + base::android::GetMethodID( + env, g_InputStream_clazz, + "available", "(" ")" "I"); - g_InputStream_close = base::android::GetMethodID( - env, g_InputStream_clazz, - "close", + g_InputStream_close = + base::android::GetMethodID( + env, g_InputStream_clazz, + "close", "(" ")" "V"); - g_InputStream_mark = base::android::GetMethodID( - env, g_InputStream_clazz, - "mark", + g_InputStream_mark = + base::android::GetMethodID( + env, g_InputStream_clazz, + "mark", "(" "I" ")" "V"); - g_InputStream_markSupported = base::android::GetMethodID( - env, g_InputStream_clazz, - "markSupported", + g_InputStream_markSupported = + base::android::GetMethodID( + env, g_InputStream_clazz, + "markSupported", "(" ")" "Z"); - g_InputStream_read_pqI = base::android::GetMethodID( - env, g_InputStream_clazz, - "read", + g_InputStream_read_pqI = + base::android::GetMethodID( + env, g_InputStream_clazz, + "read", "(" ")" "I"); - g_InputStream_read_paBqI = base::android::GetMethodID( - env, g_InputStream_clazz, - "read", + g_InputStream_read_paBqI = + base::android::GetMethodID( + env, g_InputStream_clazz, + "read", "(" "[B" ")" "I"); - g_InputStream_read_paBIIqI = base::android::GetMethodID( - env, g_InputStream_clazz, - "read", + g_InputStream_read_paBIIqI = + base::android::GetMethodID( + env, g_InputStream_clazz, + "read", "(" "[B" @@ -1442,17 +1446,19 @@ static void GetMethodIDsImpl(JNIEnv* env) { ")" "I"); - g_InputStream_reset = base::android::GetMethodID( - env, g_InputStream_clazz, - "reset", + g_InputStream_reset = + base::android::GetMethodID( + env, g_InputStream_clazz, + "reset", "(" ")" "V"); - g_InputStream_skip = base::android::GetMethodID( - env, g_InputStream_clazz, - "skip", + g_InputStream_skip = + base::android::GetMethodID( + env, g_InputStream_clazz, + "skip", "(" "J" |