diff options
author | bulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-13 14:35:00 +0000 |
---|---|---|
committer | bulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-13 14:35:00 +0000 |
commit | 3935de6bb03ff3516529f70567731232145150df (patch) | |
tree | a97924bc611be4a4562f32fbc9f27ae0e535c266 /base/android/jni_generator | |
parent | a8c7a1a8ca3a2ec6468f4966f8dcc38f143cafa2 (diff) | |
download | chromium_src-3935de6bb03ff3516529f70567731232145150df.zip chromium_src-3935de6bb03ff3516529f70567731232145150df.tar.gz chromium_src-3935de6bb03ff3516529f70567731232145150df.tar.bz2 |
Android: correctly generates inner class from import clause.
After r166482, it started deriving the JNI parameters from the "import" clause.
However, for "import foo.Outer.Inner", it'd generate "Lfoo/Outer/Inner" rather
than "Lfoo/Outer$Inner".
BUG=
TEST=build/android/jni_generator/jni_generator_tests.py
Review URL: https://chromiumcodereview.appspot.com/11293206
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@167384 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/android/jni_generator')
-rwxr-xr-x | base/android/jni_generator/jni_generator.py | 26 | ||||
-rwxr-xr-x | base/android/jni_generator/jni_generator_tests.py | 7 |
2 files changed, 32 insertions, 1 deletions
diff --git a/base/android/jni_generator/jni_generator.py b/base/android/jni_generator/jni_generator.py index 8616240..b797cf1 100755 --- a/base/android/jni_generator/jni_generator.py +++ b/base/android/jni_generator/jni_generator.py @@ -168,13 +168,37 @@ class JniParams(object): # Coming from javap, use the fully qualified param directly. return 'L' + param + ';' for qualified_name in (object_param_list + - JniParams._imports + [JniParams._fully_qualified_class] + JniParams._inner_classes): if (qualified_name.endswith('/' + param) or qualified_name.endswith('$' + param.replace('.', '$')) or qualified_name == 'L' + param): return prefix + qualified_name + ';' + + # Is it from an import? (e.g. referecing Class from import pkg.Class; + # note that referencing an inner class Inner from import pkg.Class.Inner + # is not supported). + for qualified_name in JniParams._imports: + if qualified_name.endswith('/' + param): + # Ensure it's not an inner class. + components = qualified_name.split('/') + if len(components) > 2 and components[-2][0].isupper(): + raise SyntaxError('Inner class (%s) can not be imported ' + 'and used by JNI (%s). Please import the outer ' + 'class and use Outer.Inner instead.' % + (qualified_name, param)) + return prefix + qualified_name + ';' + + # Is it an inner class from an outer class import? (e.g. referencing + # Class.Inner from import pkg.Class). + if '.' in param: + components = param.split('.') + outer = '/'.join(components[:-1]) + inner = components[-1] + for qualified_name in JniParams._imports: + if qualified_name.endswith('/' + outer): + return prefix + qualified_name + '$' + inner + # Type not found, falling back to same package as this class. return prefix + 'L' + JniParams._package + '/' + param + ';' diff --git a/base/android/jni_generator/jni_generator_tests.py b/base/android/jni_generator/jni_generator_tests.py index 886b731..5863977 100755 --- a/base/android/jni_generator/jni_generator_tests.py +++ b/base/android/jni_generator/jni_generator_tests.py @@ -1556,6 +1556,8 @@ import org.chromium.content.browser.SandboxedProcessConnection; import org.chromium.content.common.ISandboxedProcessCallback; import org.chromium.content.common.ISandboxedProcessService; import org.chromium.content.common.SurfaceCallback; +import org.chromium.content.common.WillNotRaise.AnException; +import org.chromium.content.common.WillRaise.AnException; import static org.chromium.Bar.Zoo; @@ -1577,6 +1579,11 @@ class Foo { jni_generator.JniParams._inner_classes) self.assertTrue('Lorg/chromium/content/app/Foo$PasswordListObserver' in jni_generator.JniParams._inner_classes) + self.assertEquals('Lorg/chromium/content/app/ContentMain$Inner', + jni_generator.JniParams.JavaToJni('ContentMain.Inner')) + self.assertRaises(SyntaxError, + jni_generator.JniParams.JavaToJni, + 'AnException') if __name__ == '__main__': |