summaryrefslogtreecommitdiffstats
path: root/base/android/jni_generator
diff options
context:
space:
mode:
authorbulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-10-16 18:35:10 +0000
committerbulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-10-16 18:35:10 +0000
commitc410a2cb9f7120b5c1e6a83ff54b53b19cae79d3 (patch)
treeea2a3871c5bae617dd9ceb8e8418f84cd60e74bd /base/android/jni_generator
parent784ba78a56c2e541bff04fdc54e8ea8a235c14f0 (diff)
downloadchromium_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.h164
-rwxr-xr-xbase/android/jni_generator/jni_generator.py38
-rwxr-xr-xbase/android/jni_generator/jni_generator_tests.py531
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