diff options
author | bulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-16 18:35:10 +0000 |
---|---|---|
committer | bulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-16 18:35:10 +0000 |
commit | c410a2cb9f7120b5c1e6a83ff54b53b19cae79d3 (patch) | |
tree | ea2a3871c5bae617dd9ceb8e8418f84cd60e74bd /base/android/jni_generator | |
parent | 784ba78a56c2e541bff04fdc54e8ea8a235c14f0 (diff) | |
download | chromium_src-c410a2cb9f7120b5c1e6a83ff54b53b19cae79d3.zip chromium_src-c410a2cb9f7120b5c1e6a83ff54b53b19cae79d3.tar.gz chromium_src-c410a2cb9f7120b5c1e6a83ff54b53b19cae79d3.tar.bz2 |
Android: lazy initialization for method id.
Rather than requiring early registration for all method id, we can initialize
them lazily as required.
This solves the problem of building against SDK X but running against X - 1.
Also adds a microbenchmark to ensure there are no considerable regressions.
Results are a bit variable, but it hovers over:
[ERROR:jni_android_unittest.cc(125)] JNI LazyMethodIDCall (us) 1983
[ERROR:jni_android_unittest.cc(127)] JNI MethodIDCall (us) 1862
BUG=152987
TEST=JNIAndroidMicrobenchmark.MethodId
TBR=akalin
Review URL: https://chromiumcodereview.appspot.com/11038015
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@162186 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/android/jni_generator')
-rw-r--r-- | base/android/jni_generator/golden_sample_for_tests_jni.h | 164 | ||||
-rwxr-xr-x | base/android/jni_generator/jni_generator.py | 38 | ||||
-rwxr-xr-x | base/android/jni_generator/jni_generator_tests.py | 531 |
3 files changed, 357 insertions, 376 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 b80f8f4..08f25a7 100644 --- a/base/android/jni_generator/golden_sample_for_tests_jni.h +++ b/base/android/jni_generator/golden_sample_for_tests_jni.h @@ -66,7 +66,7 @@ static jdouble MethodOtherP0(JNIEnv* env, jobject obj, jint nativePtr) { DCHECK(nativePtr) << "MethodOtherP0"; CPPClass::InnerClass* native = - reinterpret_cast<CPPClass::InnerClass*>(nativePtr); + reinterpret_cast<CPPClass::InnerClass*>(nativePtr); return native->MethodOtherP0(env, obj); } @@ -77,147 +77,147 @@ static jstring InnerMethod(JNIEnv* env, jobject obj, return native->InnerMethod(env, obj).Release(); } -static jmethodID g_SampleForTests_javaMethod = 0; +static base::subtle::AtomicWord g_SampleForTests_javaMethod = 0; static jint Java_SampleForTests_javaMethod(JNIEnv* env, jobject obj, jint foo, jint bar) { /* Must call RegisterNativesImpl() */ DCHECK(g_SampleForTests_clazz); - DCHECK(g_SampleForTests_javaMethod); + jmethodID method_id = + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_INSTANCE>( + env, g_SampleForTests_clazz, + "javaMethod", + +"(" +"I" +"I" +")" +"I", + &g_SampleForTests_javaMethod); + jint ret = env->CallIntMethod(obj, - g_SampleForTests_javaMethod, foo, bar); + method_id, foo, bar); base::android::CheckException(env); return ret; } -static jmethodID g_SampleForTests_staticJavaMethod = 0; +static base::subtle::AtomicWord g_SampleForTests_staticJavaMethod = 0; static jboolean Java_SampleForTests_staticJavaMethod(JNIEnv* env) { /* Must call RegisterNativesImpl() */ DCHECK(g_SampleForTests_clazz); - DCHECK(g_SampleForTests_staticJavaMethod); + jmethodID method_id = + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_STATIC>( + env, g_SampleForTests_clazz, + "staticJavaMethod", + +"(" +")" +"Z", + &g_SampleForTests_staticJavaMethod); + jboolean ret = env->CallStaticBooleanMethod(g_SampleForTests_clazz, - g_SampleForTests_staticJavaMethod); + method_id); base::android::CheckException(env); return ret; } -static jmethodID g_SampleForTests_packagePrivateJavaMethod = 0; +static base::subtle::AtomicWord g_SampleForTests_packagePrivateJavaMethod = 0; static void Java_SampleForTests_packagePrivateJavaMethod(JNIEnv* env, jobject obj) { /* Must call RegisterNativesImpl() */ DCHECK(g_SampleForTests_clazz); - DCHECK(g_SampleForTests_packagePrivateJavaMethod); + jmethodID method_id = + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_INSTANCE>( + env, g_SampleForTests_clazz, + "packagePrivateJavaMethod", + +"(" +")" +"V", + &g_SampleForTests_packagePrivateJavaMethod); env->CallVoidMethod(obj, - g_SampleForTests_packagePrivateJavaMethod); + method_id); base::android::CheckException(env); } -static jmethodID g_SampleForTests_methodThatThrowsException = 0; +static base::subtle::AtomicWord g_SampleForTests_methodThatThrowsException = 0; static void Java_SampleForTests_methodThatThrowsException(JNIEnv* env, jobject obj) { /* Must call RegisterNativesImpl() */ DCHECK(g_SampleForTests_clazz); - DCHECK(g_SampleForTests_methodThatThrowsException); + jmethodID method_id = + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_INSTANCE>( + env, g_SampleForTests_clazz, + "methodThatThrowsException", + +"(" +")" +"V", + &g_SampleForTests_methodThatThrowsException); env->CallVoidMethod(obj, - g_SampleForTests_methodThatThrowsException); + method_id); } -static jmethodID g_InnerClass_JavaInnerMethod = 0; +static base::subtle::AtomicWord g_InnerClass_JavaInnerMethod = 0; static jfloat Java_InnerClass_JavaInnerMethod(JNIEnv* env, jobject obj) { /* Must call RegisterNativesImpl() */ DCHECK(g_InnerClass_clazz); - DCHECK(g_InnerClass_JavaInnerMethod); + jmethodID method_id = + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_INSTANCE>( + env, g_InnerClass_clazz, + "JavaInnerMethod", + +"(" +")" +"F", + &g_InnerClass_JavaInnerMethod); + jfloat ret = env->CallFloatMethod(obj, - g_InnerClass_JavaInnerMethod); + method_id); base::android::CheckException(env); return ret; } -static jmethodID g_InnerClass_javaInnerFunction = 0; +static base::subtle::AtomicWord g_InnerClass_javaInnerFunction = 0; static void Java_InnerClass_javaInnerFunction(JNIEnv* env) { /* Must call RegisterNativesImpl() */ DCHECK(g_InnerClass_clazz); - DCHECK(g_InnerClass_javaInnerFunction); + jmethodID method_id = + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_STATIC>( + env, g_InnerClass_clazz, + "javaInnerFunction", + +"(" +")" +"V", + &g_InnerClass_javaInnerFunction); env->CallStaticVoidMethod(g_InnerClass_clazz, - g_InnerClass_javaInnerFunction); + method_id); base::android::CheckException(env); } -// Step 3: GetMethodIDs and RegisterNatives. -static void GetMethodIDsImpl(JNIEnv* env) { +// Step 3: RegisterNatives. + +static bool RegisterNativesImpl(JNIEnv* env) { + 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" -"I" -")" -"I"); - - g_SampleForTests_staticJavaMethod = - base::android::GetStaticMethodID( - env, g_SampleForTests_clazz, - "staticJavaMethod", - -"(" -")" -"Z"); - - g_SampleForTests_packagePrivateJavaMethod = - base::android::GetMethodID( - env, g_SampleForTests_clazz, - "packagePrivateJavaMethod", - -"(" -")" -"V"); - - g_SampleForTests_methodThatThrowsException = - base::android::GetMethodID( - env, g_SampleForTests_clazz, - "methodThatThrowsException", - -"(" -")" -"V"); - - g_InnerClass_JavaInnerMethod = - base::android::GetMethodID( - env, g_InnerClass_clazz, - "JavaInnerMethod", - -"(" -")" -"F"); - - g_InnerClass_javaInnerFunction = - base::android::GetStaticMethodID( - env, g_InnerClass_clazz, - "javaInnerFunction", - -"(" -")" -"V"); - -} - -static bool RegisterNativesImpl(JNIEnv* env) { - GetMethodIDsImpl(env); - static const JNINativeMethod kMethodsInnerClass[] = { { "nativeInnerFunction", "(" diff --git a/base/android/jni_generator/jni_generator.py b/base/android/jni_generator/jni_generator.py index f8df00a..afc2389 100755 --- a/base/android/jni_generator/jni_generator.py +++ b/base/android/jni_generator/jni_generator.py @@ -603,13 +603,9 @@ $FORWARD_DECLARATIONS // Step 2: method stubs. $METHOD_STUBS -// Step 3: GetMethodIDs and RegisterNatives. -static void GetMethodIDsImpl(JNIEnv* env) { -$GET_METHOD_IDS_IMPL -} +// Step 3: RegisterNatives. static bool RegisterNativesImpl(JNIEnv* env) { - GetMethodIDsImpl(env); $REGISTER_NATIVES_IMPL return true; } @@ -626,7 +622,6 @@ $CLOSE_NAMESPACE 'FORWARD_DECLARATIONS': self.GetForwardDeclarationsString(), 'METHOD_STUBS': self.GetMethodStubsString(), 'OPEN_NAMESPACE': self.GetOpenNamespaceString(), - 'GET_METHOD_IDS_IMPL': self.GetMethodIDsImplString(), 'REGISTER_NATIVES_IMPL': self.GetRegisterNativesImplString(), 'CLOSE_NAMESPACE': self.GetCloseNamespaceString(), 'HEADER_GUARD': self.header_guard, @@ -662,13 +657,6 @@ $CLOSE_NAMESPACE ret += [self.GetKMethodArrayEntry(native)] return '\n'.join(ret) - def GetMethodIDsImplString(self): - ret = [] - ret += [self.GetFindClasses()] - for called_by_native in self.called_by_natives: - ret += [self.GetMethodIDImpl(called_by_native)] - return '\n'.join(ret) - def GetRegisterNativesImplString(self): """Returns the implementation for RegisterNatives.""" template = Template("""\ @@ -684,7 +672,7 @@ ${KMETHODS} return false; } """) - ret = [] + ret = [self.GetFindClasses()] all_classes = self.GetUniqueClasses(self.natives) all_classes[self.class_name] = self.fully_qualified_class for clazz in all_classes: @@ -793,14 +781,15 @@ ${FUNCTION_SIGNATURE} {""") ${FUNCTION_SIGNATURE} __attribute__ ((unused)); ${FUNCTION_SIGNATURE} {""") template = Template(""" -static jmethodID g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME} = 0; +static base::subtle::AtomicWord g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME} = 0; ${FUNCTION_HEADER} /* Must call RegisterNativesImpl() */ DCHECK(g_${JAVA_CLASS}_clazz); - DCHECK(g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME}); + jmethodID method_id = + ${GET_METHOD_ID_IMPL} ${RETURN_DECLARATION} ${PRE_CALL}env->${ENV_CALL}(${FIRST_PARAM_IN_CALL}, - g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME}${PARAMS_IN_CALL})${POST_CALL}; + method_id${PARAMS_IN_CALL})${POST_CALL}; ${CHECK_EXCEPTION} ${RETURN_CLAUSE} }""") @@ -855,6 +844,7 @@ ${FUNCTION_HEADER} 'PARAMS_IN_CALL': params_for_call, 'METHOD_ID_VAR_NAME': called_by_native.method_id_var_name, 'CHECK_EXCEPTION': check_exception, + 'GET_METHOD_ID_IMPL': self.GetMethodIDImpl(called_by_native) } values['FUNCTION_SIGNATURE'] = ( function_signature_template.substitute(values)) @@ -924,11 +914,12 @@ jclass g_${JAVA_CLASS}_clazz = NULL;""") 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${SUFFIX}( - env, g_${JAVA_CLASS}_clazz, - "${JNI_NAME}", - ${JNI_SIGNATURE}); + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_${STATIC}>( + env, g_${JAVA_CLASS}_clazz, + "${JNI_NAME}", + ${JNI_SIGNATURE}, + &g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME}); """) jni_name = called_by_native.name jni_return_type = called_by_native.return_type @@ -939,8 +930,7 @@ jclass g_${JAVA_CLASS}_clazz = NULL;""") 'JAVA_CLASS': called_by_native.java_class_name or self.class_name, 'JNI_NAME': jni_name, 'METHOD_ID_VAR_NAME': called_by_native.method_id_var_name, - 'STATIC': 'Static' if called_by_native.static else '', - 'SUFFIX': 'OrNull' if called_by_native.system_class else '', + 'STATIC': 'STATIC' if called_by_native.static else 'INSTANCE', 'JNI_SIGNATURE': JniSignature(called_by_native.params, jni_return_type, True) diff --git a/base/android/jni_generator/jni_generator_tests.py b/base/android/jni_generator/jni_generator_tests.py index 23efa02..4c345ed 100755 --- a/base/android/jni_generator/jni_generator_tests.py +++ b/base/android/jni_generator/jni_generator_tests.py @@ -315,19 +315,16 @@ static void GotOrientation(JNIEnv* env, jobject obj, jdouble gamma) { DCHECK(nativeDataFetcherImplAndroid) << "GotOrientation"; DataFetcherImplAndroid* native = - reinterpret_cast<DataFetcherImplAndroid*>(nativeDataFetcherImplAndroid); + reinterpret_cast<DataFetcherImplAndroid*>(nativeDataFetcherImplAndroid); return native->GotOrientation(env, obj, alpha, beta, gamma); } -// Step 3: GetMethodIDs and RegisterNatives. -static void GetMethodIDsImpl(JNIEnv* env) { - g_TestJni_clazz = reinterpret_cast<jclass>(env->NewGlobalRef( - base::android::GetUnscopedClass(env, kTestJniClassPath))); -} +// Step 3: RegisterNatives. static bool RegisterNativesImpl(JNIEnv* env) { - GetMethodIDsImpl(env); + g_TestJni_clazz = reinterpret_cast<jclass>(env->NewGlobalRef( + base::android::GetUnscopedClass(env, kTestJniClassPath))); static const JNINativeMethod kMethodsTestJni[] = { { "nativeInit", "(" @@ -481,15 +478,12 @@ static jint Init(JNIEnv* env, jobject obj); // Step 2: method stubs. -// Step 3: GetMethodIDs and RegisterNatives. -static void GetMethodIDsImpl(JNIEnv* env) { - g_TestJni_clazz = reinterpret_cast<jclass>(env->NewGlobalRef( - base::android::GetUnscopedClass(env, kTestJniClassPath))); -} +// Step 3: RegisterNatives. static bool RegisterNativesImpl(JNIEnv* env) { - GetMethodIDsImpl(env); + g_TestJni_clazz = reinterpret_cast<jclass>(env->NewGlobalRef( + base::android::GetUnscopedClass(env, kTestJniClassPath))); static const JNINativeMethod kMethodsMyInnerClass[] = { { "nativeInit", "(" @@ -575,15 +569,12 @@ static jint Init(JNIEnv* env, jobject obj); // Step 2: method stubs. -// Step 3: GetMethodIDs and RegisterNatives. -static void GetMethodIDsImpl(JNIEnv* env) { - g_TestJni_clazz = reinterpret_cast<jclass>(env->NewGlobalRef( - base::android::GetUnscopedClass(env, kTestJniClassPath))); -} +// Step 3: RegisterNatives. static bool RegisterNativesImpl(JNIEnv* env) { - GetMethodIDsImpl(env); + g_TestJni_clazz = reinterpret_cast<jclass>(env->NewGlobalRef( + base::android::GetUnscopedClass(env, kTestJniClassPath))); static const JNINativeMethod kMethodsMyOtherInnerClass[] = { { "nativeInit", "(" @@ -683,15 +674,12 @@ static jint Init(JNIEnv* env, jobject obj); // Step 2: method stubs. -// Step 3: GetMethodIDs and RegisterNatives. -static void GetMethodIDsImpl(JNIEnv* env) { - g_TestJni_clazz = reinterpret_cast<jclass>(env->NewGlobalRef( - base::android::GetUnscopedClass(env, kTestJniClassPath))); -} +// Step 3: RegisterNatives. static bool RegisterNativesImpl(JNIEnv* env) { - GetMethodIDsImpl(env); + g_TestJni_clazz = reinterpret_cast<jclass>(env->NewGlobalRef( + base::android::GetUnscopedClass(env, kTestJniClassPath))); static const JNINativeMethod kMethodsMyOtherInnerClass[] = { { "nativeInit", "(" @@ -910,7 +898,7 @@ jclass g_InfoBar_clazz = NULL; // Step 2: method stubs. -static jmethodID g_TestJni_showConfirmInfoBar = 0; +static base::subtle::AtomicWord g_TestJni_showConfirmInfoBar = 0; static ScopedJavaLocalRef<jobject> Java_TestJni_showConfirmInfoBar(JNIEnv* env, jobject obj, jint nativeInfoBar, jstring buttonOk, @@ -919,16 +907,30 @@ static ScopedJavaLocalRef<jobject> Java_TestJni_showConfirmInfoBar(JNIEnv* env, jobject icon) { /* Must call RegisterNativesImpl() */ DCHECK(g_TestJni_clazz); - DCHECK(g_TestJni_showConfirmInfoBar); + jmethodID method_id = + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_INSTANCE>( + env, g_TestJni_clazz, + "showConfirmInfoBar", + +"(" +"I" +"Ljava/lang/String;" +"Ljava/lang/String;" +"Ljava/lang/String;" +"Landroid/graphics/Bitmap;" +")" +"Lcom/google/android/apps/chrome/infobar/InfoBarContainer$NativeInfoBar;", + &g_TestJni_showConfirmInfoBar); + jobject ret = env->CallObjectMethod(obj, - g_TestJni_showConfirmInfoBar, nativeInfoBar, buttonOk, buttonCancel, - title, icon); + method_id, nativeInfoBar, buttonOk, buttonCancel, title, icon); base::android::CheckException(env); return ScopedJavaLocalRef<jobject>(env, ret); } -static jmethodID g_TestJni_showAutoLoginInfoBar = 0; +static base::subtle::AtomicWord g_TestJni_showAutoLoginInfoBar = 0; static ScopedJavaLocalRef<jobject> Java_TestJni_showAutoLoginInfoBar(JNIEnv* env, jobject obj, jint nativeInfoBar, jstring realm, @@ -936,27 +938,50 @@ static ScopedJavaLocalRef<jobject> Java_TestJni_showAutoLoginInfoBar(JNIEnv* jstring args) { /* Must call RegisterNativesImpl() */ DCHECK(g_TestJni_clazz); - DCHECK(g_TestJni_showAutoLoginInfoBar); + jmethodID method_id = + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_INSTANCE>( + env, g_TestJni_clazz, + "showAutoLoginInfoBar", + +"(" +"I" +"Ljava/lang/String;" +"Ljava/lang/String;" +"Ljava/lang/String;" +")" +"Lcom/google/android/apps/chrome/infobar/InfoBarContainer$NativeInfoBar;", + &g_TestJni_showAutoLoginInfoBar); + jobject ret = env->CallObjectMethod(obj, - g_TestJni_showAutoLoginInfoBar, nativeInfoBar, realm, account, args); + method_id, nativeInfoBar, realm, account, args); base::android::CheckException(env); return ScopedJavaLocalRef<jobject>(env, ret); } -static jmethodID g_InfoBar_dismiss = 0; +static base::subtle::AtomicWord g_InfoBar_dismiss = 0; static void Java_InfoBar_dismiss(JNIEnv* env, jobject obj) { /* Must call RegisterNativesImpl() */ DCHECK(g_InfoBar_clazz); - DCHECK(g_InfoBar_dismiss); + jmethodID method_id = + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_INSTANCE>( + env, g_InfoBar_clazz, + "dismiss", + +"(" +")" +"V", + &g_InfoBar_dismiss); env->CallVoidMethod(obj, - g_InfoBar_dismiss); + method_id); base::android::CheckException(env); } -static jmethodID g_TestJni_shouldShowAutoLogin = 0; +static base::subtle::AtomicWord g_TestJni_shouldShowAutoLogin = 0; static jboolean Java_TestJni_shouldShowAutoLogin(JNIEnv* env, jobject contentView, jstring realm, @@ -964,28 +989,53 @@ static jboolean Java_TestJni_shouldShowAutoLogin(JNIEnv* env, jobject jstring args) { /* Must call RegisterNativesImpl() */ DCHECK(g_TestJni_clazz); - DCHECK(g_TestJni_shouldShowAutoLogin); + jmethodID method_id = + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_STATIC>( + env, g_TestJni_clazz, + "shouldShowAutoLogin", + +"(" +"Lorg/chromium/content/browser/ContentViewCore;" +"Ljava/lang/String;" +"Ljava/lang/String;" +"Ljava/lang/String;" +")" +"Z", + &g_TestJni_shouldShowAutoLogin); + jboolean ret = env->CallStaticBooleanMethod(g_TestJni_clazz, - g_TestJni_shouldShowAutoLogin, contentView, realm, account, args); + method_id, contentView, realm, account, args); base::android::CheckException(env); return ret; } -static jmethodID g_TestJni_openUrl = 0; +static base::subtle::AtomicWord g_TestJni_openUrl = 0; static ScopedJavaLocalRef<jobject> Java_TestJni_openUrl(JNIEnv* env, jstring url) { /* Must call RegisterNativesImpl() */ DCHECK(g_TestJni_clazz); - DCHECK(g_TestJni_openUrl); + jmethodID method_id = + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_STATIC>( + env, g_TestJni_clazz, + "openUrl", + +"(" +"Ljava/lang/String;" +")" +"Ljava/io/InputStream;", + &g_TestJni_openUrl); + jobject ret = env->CallStaticObjectMethod(g_TestJni_clazz, - g_TestJni_openUrl, url); + method_id, url); base::android::CheckException(env); return ScopedJavaLocalRef<jobject>(env, ret); } -static jmethodID g_TestJni_activateHardwareAcceleration = 0; +static base::subtle::AtomicWord g_TestJni_activateHardwareAcceleration = 0; static void Java_TestJni_activateHardwareAcceleration(JNIEnv* env, jobject obj, jboolean activated, jint iPid, @@ -994,120 +1044,57 @@ static void Java_TestJni_activateHardwareAcceleration(JNIEnv* env, jobject obj, jint iSecondaryID) { /* Must call RegisterNativesImpl() */ DCHECK(g_TestJni_clazz); - DCHECK(g_TestJni_activateHardwareAcceleration); + jmethodID method_id = + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_INSTANCE>( + env, g_TestJni_clazz, + "activateHardwareAcceleration", + +"(" +"Z" +"I" +"I" +"I" +"I" +")" +"V", + &g_TestJni_activateHardwareAcceleration); env->CallVoidMethod(obj, - g_TestJni_activateHardwareAcceleration, activated, iPid, iType, - iPrimaryID, iSecondaryID); + method_id, activated, iPid, iType, iPrimaryID, iSecondaryID); base::android::CheckException(env); } -static jmethodID g_TestJni_uncheckedCall = 0; +static base::subtle::AtomicWord g_TestJni_uncheckedCall = 0; static void Java_TestJni_uncheckedCall(JNIEnv* env, jobject obj, jint iParam) { /* Must call RegisterNativesImpl() */ DCHECK(g_TestJni_clazz); - DCHECK(g_TestJni_uncheckedCall); - - env->CallVoidMethod(obj, - g_TestJni_uncheckedCall, iParam); - -} - -// Step 3: GetMethodIDs and RegisterNatives. -static void GetMethodIDsImpl(JNIEnv* env) { - 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", + jmethodID method_id = + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_INSTANCE>( + env, g_TestJni_clazz, + "uncheckedCall", "(" "I" -"Ljava/lang/String;" -"Ljava/lang/String;" -"Ljava/lang/String;" -"Landroid/graphics/Bitmap;" ")" -"Lcom/google/android/apps/chrome/infobar/InfoBarContainer$NativeInfoBar;"); - - g_TestJni_showAutoLoginInfoBar = - base::android::GetMethodID( - env, g_TestJni_clazz, - "showAutoLoginInfoBar", +"V", + &g_TestJni_uncheckedCall); -"(" -"I" -"Ljava/lang/String;" -"Ljava/lang/String;" -"Ljava/lang/String;" -")" -"Lcom/google/android/apps/chrome/infobar/InfoBarContainer$NativeInfoBar;"); - - g_InfoBar_dismiss = - base::android::GetMethodID( - env, g_InfoBar_clazz, - "dismiss", - -"(" -")" -"V"); - - g_TestJni_shouldShowAutoLogin = - base::android::GetStaticMethodID( - env, g_TestJni_clazz, - "shouldShowAutoLogin", - -"(" -"Lorg/chromium/content/browser/ContentViewCore;" -"Ljava/lang/String;" -"Ljava/lang/String;" -"Ljava/lang/String;" -")" -"Z"); - - 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", - -"(" -"Z" -"I" -"I" -"I" -"I" -")" -"V"); - - g_TestJni_uncheckedCall = - base::android::GetMethodID( - env, g_TestJni_clazz, - "uncheckedCall", - -"(" -"I" -")" -"V"); + env->CallVoidMethod(obj, + method_id, iParam); } +// Step 3: RegisterNatives. + static bool RegisterNativesImpl(JNIEnv* env) { - GetMethodIDsImpl(env); + 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))); return true; } @@ -1217,91 +1204,151 @@ namespace JNI_InputStream { // Step 2: method stubs. -static jmethodID g_InputStream_available = 0; +static base::subtle::AtomicWord g_InputStream_available = 0; 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); - DCHECK(g_InputStream_available); + jmethodID method_id = + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_INSTANCE>( + env, g_InputStream_clazz, + "available", + +"(" +")" +"I", + &g_InputStream_available); + jint ret = env->CallIntMethod(obj, - g_InputStream_available); + method_id); base::android::CheckException(env); return ret; } -static jmethodID g_InputStream_close = 0; +static base::subtle::AtomicWord g_InputStream_close = 0; 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); - DCHECK(g_InputStream_close); + jmethodID method_id = + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_INSTANCE>( + env, g_InputStream_clazz, + "close", + +"(" +")" +"V", + &g_InputStream_close); env->CallVoidMethod(obj, - g_InputStream_close); + method_id); base::android::CheckException(env); } -static jmethodID g_InputStream_mark = 0; +static base::subtle::AtomicWord g_InputStream_mark = 0; 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); - DCHECK(g_InputStream_mark); + jmethodID method_id = + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_INSTANCE>( + env, g_InputStream_clazz, + "mark", + +"(" +"I" +")" +"V", + &g_InputStream_mark); env->CallVoidMethod(obj, - g_InputStream_mark, p0); + method_id, p0); base::android::CheckException(env); } -static jmethodID g_InputStream_markSupported = 0; +static base::subtle::AtomicWord g_InputStream_markSupported = 0; 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); - DCHECK(g_InputStream_markSupported); + jmethodID method_id = + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_INSTANCE>( + env, g_InputStream_clazz, + "markSupported", + +"(" +")" +"Z", + &g_InputStream_markSupported); + jboolean ret = env->CallBooleanMethod(obj, - g_InputStream_markSupported); + method_id); base::android::CheckException(env); return ret; } -static jmethodID g_InputStream_readI = 0; +static base::subtle::AtomicWord g_InputStream_readI = 0; static jint Java_InputStream_readI(JNIEnv* env, jobject obj) __attribute__ ((unused)); static jint Java_InputStream_readI(JNIEnv* env, jobject obj) { /* Must call RegisterNativesImpl() */ DCHECK(g_InputStream_clazz); - DCHECK(g_InputStream_readI); + jmethodID method_id = + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_INSTANCE>( + env, g_InputStream_clazz, + "read", + +"(" +")" +"I", + &g_InputStream_readI); + jint ret = env->CallIntMethod(obj, - g_InputStream_readI); + method_id); base::android::CheckException(env); return ret; } -static jmethodID g_InputStream_readI_AB = 0; +static base::subtle::AtomicWord g_InputStream_readI_AB = 0; static jint Java_InputStream_readI_AB(JNIEnv* env, jobject obj, jbyteArray p0) __attribute__ ((unused)); static jint Java_InputStream_readI_AB(JNIEnv* env, jobject obj, jbyteArray p0) { /* Must call RegisterNativesImpl() */ DCHECK(g_InputStream_clazz); - DCHECK(g_InputStream_readI_AB); + jmethodID method_id = + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_INSTANCE>( + env, g_InputStream_clazz, + "read", + +"(" +"[B" +")" +"I", + &g_InputStream_readI_AB); + jint ret = env->CallIntMethod(obj, - g_InputStream_readI_AB, p0); + method_id, p0); base::android::CheckException(env); return ret; } -static jmethodID g_InputStream_readI_AB_I_I = 0; +static base::subtle::AtomicWord g_InputStream_readI_AB_I_I = 0; static jint Java_InputStream_readI_AB_I_I(JNIEnv* env, jobject obj, jbyteArray p0, jint p1, @@ -1312,161 +1359,105 @@ static jint Java_InputStream_readI_AB_I_I(JNIEnv* env, jobject obj, jbyteArray jint p2) { /* Must call RegisterNativesImpl() */ DCHECK(g_InputStream_clazz); - DCHECK(g_InputStream_readI_AB_I_I); + jmethodID method_id = + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_INSTANCE>( + env, g_InputStream_clazz, + "read", + +"(" +"[B" +"I" +"I" +")" +"I", + &g_InputStream_readI_AB_I_I); + jint ret = env->CallIntMethod(obj, - g_InputStream_readI_AB_I_I, p0, p1, p2); + method_id, p0, p1, p2); base::android::CheckException(env); return ret; } -static jmethodID g_InputStream_reset = 0; +static base::subtle::AtomicWord g_InputStream_reset = 0; 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); - DCHECK(g_InputStream_reset); + jmethodID method_id = + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_INSTANCE>( + env, g_InputStream_clazz, + "reset", + +"(" +")" +"V", + &g_InputStream_reset); env->CallVoidMethod(obj, - g_InputStream_reset); + method_id); base::android::CheckException(env); } -static jmethodID g_InputStream_skip = 0; +static base::subtle::AtomicWord g_InputStream_skip = 0; 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); - DCHECK(g_InputStream_skip); + jmethodID method_id = + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_INSTANCE>( + env, g_InputStream_clazz, + "skip", + +"(" +"J" +")" +"J", + &g_InputStream_skip); + jlong ret = env->CallLongMethod(obj, - g_InputStream_skip, p0); + method_id, p0); base::android::CheckException(env); return ret; } -static jmethodID g_InputStream_Constructor = 0; +static base::subtle::AtomicWord g_InputStream_Constructor = 0; static ScopedJavaLocalRef<jobject> Java_InputStream_Constructor(JNIEnv* env) -__attribute__ ((unused)); + __attribute__ ((unused)); static ScopedJavaLocalRef<jobject> Java_InputStream_Constructor(JNIEnv* env) { /* Must call RegisterNativesImpl() */ DCHECK(g_InputStream_clazz); - DCHECK(g_InputStream_Constructor); + jmethodID method_id = + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_INSTANCE>( + env, g_InputStream_clazz, + "<init>", + +"(" +")" +"V", + &g_InputStream_Constructor); + jobject ret = env->NewObject(g_InputStream_clazz, - g_InputStream_Constructor); + method_id); base::android::CheckException(env); return ScopedJavaLocalRef<jobject>(env, ret); } -// Step 3: GetMethodIDs and RegisterNatives. -static void GetMethodIDsImpl(JNIEnv* env) { - g_InputStream_clazz = reinterpret_cast<jclass>(env->NewGlobalRef( - base::android::GetUnscopedClass(env, kInputStreamClassPath))); - g_InputStream_available = - base::android::GetMethodIDOrNull( - env, g_InputStream_clazz, - "available", - -"(" -")" -"I"); - - g_InputStream_close = - base::android::GetMethodIDOrNull( - env, g_InputStream_clazz, - "close", - -"(" -")" -"V"); - - g_InputStream_mark = - base::android::GetMethodIDOrNull( - env, g_InputStream_clazz, - "mark", - -"(" -"I" -")" -"V"); - - g_InputStream_markSupported = - base::android::GetMethodIDOrNull( - env, g_InputStream_clazz, - "markSupported", - -"(" -")" -"Z"); - - g_InputStream_readI = - base::android::GetMethodIDOrNull( - env, g_InputStream_clazz, - "read", - -"(" -")" -"I"); - - g_InputStream_readI_AB = - base::android::GetMethodIDOrNull( - env, g_InputStream_clazz, - "read", - -"(" -"[B" -")" -"I"); - - g_InputStream_readI_AB_I_I = - base::android::GetMethodIDOrNull( - env, g_InputStream_clazz, - "read", - -"(" -"[B" -"I" -"I" -")" -"I"); - - g_InputStream_reset = - base::android::GetMethodIDOrNull( - env, g_InputStream_clazz, - "reset", - -"(" -")" -"V"); - - g_InputStream_skip = - base::android::GetMethodIDOrNull( - env, g_InputStream_clazz, - "skip", - -"(" -"J" -")" -"J"); - - g_InputStream_Constructor = - base::android::GetMethodIDOrNull( - env, g_InputStream_clazz, - "<init>", - -"(" -")" -"V"); - -} +// Step 3: RegisterNatives. static bool RegisterNativesImpl(JNIEnv* env) { - GetMethodIDsImpl(env); + g_InputStream_clazz = reinterpret_cast<jclass>(env->NewGlobalRef( + base::android::GetUnscopedClass(env, kInputStreamClassPath))); return true; } } // namespace JNI_InputStream |