Commit ec34c46c authored by bulach@chromium.org's avatar bulach@chromium.org

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
parent 1125eece
......@@ -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__;
......
......@@ -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,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment