summaryrefslogtreecommitdiffstats
path: root/base/android/jni_generator
diff options
context:
space:
mode:
authorbulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-13 14:35:00 +0000
committerbulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-13 14:35:00 +0000
commit3935de6bb03ff3516529f70567731232145150df (patch)
treea97924bc611be4a4562f32fbc9f27ae0e535c266 /base/android/jni_generator
parenta8c7a1a8ca3a2ec6468f4966f8dcc38f143cafa2 (diff)
downloadchromium_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-xbase/android/jni_generator/jni_generator.py26
-rwxr-xr-xbase/android/jni_generator/jni_generator_tests.py7
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__':