summaryrefslogtreecommitdiffstats
path: root/base
diff options
context:
space:
mode:
authorbulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-28 12:34:33 +0000
committerbulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-28 12:34:33 +0000
commita8b031b35441ae40e872226ebf4c911dc71c2699 (patch)
treeaa1473aa0c58d136e62e40409d8e5b1bf774e1da /base
parentd6ccc98afc48baa048b3599a358103bde21cbf41 (diff)
downloadchromium_src-a8b031b35441ae40e872226ebf4c911dc71c2699.zip
chromium_src-a8b031b35441ae40e872226ebf4c911dc71c2699.tar.gz
chromium_src-a8b031b35441ae40e872226ebf4c911dc71c2699.tar.bz2
Improves jni_generator name mangling.
Uses a more compact format to avoid generating uber-long names. Changes media_player_bridge to use such format. BUG= TEST= Review URL: https://chromiumcodereview.appspot.com/10957037 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@159240 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base')
-rwxr-xr-xbase/android/jni_generator/jni_generator.py40
-rwxr-xr-xbase/android/jni_generator/jni_generator_tests.py62
2 files changed, 65 insertions, 37 deletions
diff --git a/base/android/jni_generator/jni_generator.py b/base/android/jni_generator/jni_generator.py
index 164778ac..de3532f 100755
--- a/base/android/jni_generator/jni_generator.py
+++ b/base/android/jni_generator/jni_generator.py
@@ -214,6 +214,9 @@ def JavaParamToJni(param):
param = param[:param.index('<')]
if param in pod_param_map:
return prefix + pod_param_map[param]
+ if '/' in param:
+ # Coming from javap, use the fully qualified param directly.
+ return 'L' + param + ';'
for qualified_name in object_param_list + app_param_list:
if (qualified_name.endswith('/' + param) or
qualified_name.endswith('$' + param.replace('.', '$')) or
@@ -332,22 +335,38 @@ def GetEnvCall(is_constructor, is_static, return_type):
return 'Call' + call + 'Method'
-def GetMangledMethodName(name, jni_signature):
- """Returns a mangled method name for a (name, jni_signature) pair.
+def GetMangledParam(datatype):
+ """Returns a mangled identifier for the datatype."""
+ if len(datatype) <= 2:
+ return datatype.replace('[', 'A')
+ ret = ''
+ for i in range(1, len(datatype)):
+ c = datatype[i]
+ if c == '[':
+ ret += 'A'
+ elif c.isupper() or datatype[i - 1] in ['/', 'L']:
+ ret += c.upper()
+ return ret
+
+
+def GetMangledMethodName(name, params, return_type):
+ """Returns a mangled method name for the given signature.
The returned name can be used as a C identifier and will be unique for all
valid overloads of the same method.
Args:
name: string.
- jni_signature: string.
+ params: list of Param.
+ return_type: string.
Returns:
A mangled name.
"""
- sig_translation = string.maketrans('[()/;$', 'apq_xs')
- mangled_name = name + '_' + string.translate(jni_signature, sig_translation,
- '"')
+ mangled_items = []
+ for datatype in [return_type] + [x.datatype for x in params]:
+ mangled_items += [GetMangledParam(JavaParamToJni(datatype))]
+ mangled_name = name + '_'.join(mangled_items)
assert re.match(r'[0-9a-zA-Z_]+', mangled_name)
return mangled_name
@@ -365,10 +384,9 @@ def MangleCalledByNatives(called_by_natives):
method_name = called_by_native.name
method_id_var_name = method_name
if method_counts[java_class_name][method_name] > 1:
- jni_signature = JniSignature(called_by_native.params,
- called_by_native.return_type,
- False)
- method_id_var_name = GetMangledMethodName(method_name, jni_signature)
+ method_id_var_name = GetMangledMethodName(method_name,
+ called_by_native.params,
+ called_by_native.return_type)
called_by_native.method_id_var_name = method_id_var_name
return called_by_natives
@@ -765,7 +783,7 @@ static ${RETURN} ${NAME}(JNIEnv* env, ${PARAMS_IN_DECLARATION}) {
def GetCalledByNativeMethodStub(self, called_by_native):
"""Returns a string."""
function_signature_template = Template("""\
-static ${RETURN_TYPE} Java_${JAVA_CLASS}_${METHOD}(\
+static ${RETURN_TYPE} Java_${JAVA_CLASS}_${METHOD_ID_VAR_NAME}(\
JNIEnv* env${FIRST_PARAM_IN_DECLARATION}${PARAMS_IN_DECLARATION})""")
function_header_template = Template("""\
${FUNCTION_SIGNATURE} {""")
diff --git a/base/android/jni_generator/jni_generator_tests.py b/base/android/jni_generator/jni_generator_tests.py
index d833851..fdedc97 100755
--- a/base/android/jni_generator/jni_generator_tests.py
+++ b/base/android/jni_generator/jni_generator_tests.py
@@ -1149,14 +1149,22 @@ import org.chromium.base.BuildInfo;
'com/foo/Bar', 'no PACKAGE line')
def testMethodNameMangling(self):
- self.assertEquals('close_pqV',
- jni_generator.GetMangledMethodName('close', '()V'))
- self.assertEquals('read_paBIIqI',
- jni_generator.GetMangledMethodName('read', '([BII)I'))
- self.assertEquals('open_pLjava_lang_StringxqLjava_io_InputStreamx',
- jni_generator.GetMangledMethodName(
- 'open',
- '(Ljava/lang/String;)Ljava/io/InputStream;'))
+ self.assertEquals('closeV',
+ jni_generator.GetMangledMethodName('close', [], 'void'))
+ self.assertEquals('readI_AB_I_I',
+ jni_generator.GetMangledMethodName('read',
+ [Param(name='p1',
+ datatype='byte[]'),
+ Param(name='p2',
+ datatype='int'),
+ Param(name='p3',
+ datatype='int'),],
+ 'int'))
+ self.assertEquals('openJIIS_JLS',
+ jni_generator.GetMangledMethodName('open',
+ [Param(name='p1',
+ datatype='java/lang/String'),],
+ 'java/io/InputStream'))
def testFromJavaP(self):
contents = """
@@ -1265,47 +1273,49 @@ static jboolean Java_InputStream_markSupported(JNIEnv* env, jobject obj) {
return ret;
}
-static jmethodID g_InputStream_read_pqI = 0;
-static jint Java_InputStream_read(JNIEnv* env, jobject obj) __attribute__
+static jmethodID g_InputStream_readI = 0;
+static jint Java_InputStream_readI(JNIEnv* env, jobject obj) __attribute__
((unused));
-static jint Java_InputStream_read(JNIEnv* env, jobject obj) {
+static jint Java_InputStream_readI(JNIEnv* env, jobject obj) {
/* Must call RegisterNativesImpl() */
DCHECK(g_InputStream_clazz);
- DCHECK(g_InputStream_read_pqI);
+ DCHECK(g_InputStream_readI);
jint ret =
env->CallIntMethod(obj,
- g_InputStream_read_pqI);
+ g_InputStream_readI);
base::android::CheckException(env);
return ret;
}
-static jmethodID g_InputStream_read_paBqI = 0;
-static jint Java_InputStream_read(JNIEnv* env, jobject obj, jbyteArray p0)
+static jmethodID g_InputStream_readI_AB = 0;
+static jint Java_InputStream_readI_AB(JNIEnv* env, jobject obj, jbyteArray p0)
__attribute__ ((unused));
-static jint Java_InputStream_read(JNIEnv* env, jobject obj, jbyteArray p0) {
+static jint Java_InputStream_readI_AB(JNIEnv* env, jobject obj, jbyteArray p0) {
/* Must call RegisterNativesImpl() */
DCHECK(g_InputStream_clazz);
- DCHECK(g_InputStream_read_paBqI);
+ DCHECK(g_InputStream_readI_AB);
jint ret =
env->CallIntMethod(obj,
- g_InputStream_read_paBqI, p0);
+ g_InputStream_readI_AB, p0);
base::android::CheckException(env);
return ret;
}
-static jmethodID g_InputStream_read_paBIIqI = 0;
-static jint Java_InputStream_read(JNIEnv* env, jobject obj, jbyteArray p0,
+static jmethodID g_InputStream_readI_AB_I_I = 0;
+static jint Java_InputStream_readI_AB_I_I(JNIEnv* env, jobject obj, jbyteArray
+ p0,
jint p1,
jint p2) __attribute__ ((unused));
-static jint Java_InputStream_read(JNIEnv* env, jobject obj, jbyteArray p0,
+static jint Java_InputStream_readI_AB_I_I(JNIEnv* env, jobject obj, jbyteArray
+ p0,
jint p1,
jint p2) {
/* Must call RegisterNativesImpl() */
DCHECK(g_InputStream_clazz);
- DCHECK(g_InputStream_read_paBIIqI);
+ DCHECK(g_InputStream_readI_AB_I_I);
jint ret =
env->CallIntMethod(obj,
- g_InputStream_read_paBIIqI, p0, p1, p2);
+ g_InputStream_readI_AB_I_I, p0, p1, p2);
base::android::CheckException(env);
return ret;
}
@@ -1391,7 +1401,7 @@ static void GetMethodIDsImpl(JNIEnv* env) {
")"
"Z");
- g_InputStream_read_pqI =
+ g_InputStream_readI =
base::android::GetMethodID(
env, g_InputStream_clazz,
"read",
@@ -1400,7 +1410,7 @@ static void GetMethodIDsImpl(JNIEnv* env) {
")"
"I");
- g_InputStream_read_paBqI =
+ g_InputStream_readI_AB =
base::android::GetMethodID(
env, g_InputStream_clazz,
"read",
@@ -1410,7 +1420,7 @@ static void GetMethodIDsImpl(JNIEnv* env) {
")"
"I");
- g_InputStream_read_paBIIqI =
+ g_InputStream_readI_AB_I_I =
base::android::GetMethodID(
env, g_InputStream_clazz,
"read",