diff options
author | bulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-28 12:34:33 +0000 |
---|---|---|
committer | bulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-28 12:34:33 +0000 |
commit | a8b031b35441ae40e872226ebf4c911dc71c2699 (patch) | |
tree | aa1473aa0c58d136e62e40409d8e5b1bf774e1da /base | |
parent | d6ccc98afc48baa048b3599a358103bde21cbf41 (diff) | |
download | chromium_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-x | base/android/jni_generator/jni_generator.py | 40 | ||||
-rwxr-xr-x | base/android/jni_generator/jni_generator_tests.py | 62 |
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", |