diff options
-rw-r--r-- | base/android/jni_generator/SampleForTests.java | 13 | ||||
-rwxr-xr-x | base/android/jni_generator/jni_generator.py | 21 |
2 files changed, 29 insertions, 5 deletions
diff --git a/base/android/jni_generator/SampleForTests.java b/base/android/jni_generator/SampleForTests.java index 3d354cb..6f8b1ca 100644 --- a/base/android/jni_generator/SampleForTests.java +++ b/base/android/jni_generator/SampleForTests.java @@ -78,6 +78,19 @@ class SampleForTests { @CalledByNativeUnchecked void methodThatThrowsException() throws Exception {} + // The generator is not confused by inline comments: + // @CalledByNative void thisShouldNotAppearInTheOutput(); + // @CalledByNativeUnchecked public static void neitherShouldThis(int foo); + + /** + * The generator is not confused by block comments: + * @CalledByNative void thisShouldNotAppearInTheOutputEither(); + * @CalledByNativeUnchecked public static void andDefinitelyNotThis(int foo); + */ + + // String constants that look like comments don't confuse the generator: + private String arrgh = "*/*"; + //------------------------------------------------------------------------------------------------ // Java fields which are accessed from C++ code only must be annotated with @AccessedByNative to // prevent them being eliminated when unreferenced code is stripped. diff --git a/base/android/jni_generator/jni_generator.py b/base/android/jni_generator/jni_generator.py index 456f3de..02e2232 100755 --- a/base/android/jni_generator/jni_generator.py +++ b/base/android/jni_generator/jni_generator.py @@ -451,11 +451,22 @@ class JNIFromJavaSource(object): self.content = inl_header_file_generator.GetContent() def _RemoveComments(self, contents): - ret = [] - for c in [c.strip() for c in contents.split('\n')]: - if not c.startswith('//'): - ret += [c] - return '\n'.join(ret) + # We need to support both inline and block comments, and we need to handle + # strings that contain '//' or '/*'. Rather than trying to do all that with + # regexps, we just pipe the contents through the C preprocessor. We tell cpp + # the file has already been preprocessed, so it just removes comments and + # doesn't try to parse #include, #pragma etc. + # + # TODO(husky): This is a bit hacky. It would be cleaner to use a real Java + # parser. Maybe we could ditch JNIFromJavaSource and just always use + # JNIFromJavaP; or maybe we could rewrite this script in Java and use APT. + # http://code.google.com/p/chromium/issues/detail?id=138941 + p = subprocess.Popen(args=['cpp', '-fpreprocessed'], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + stdout, _ = p.communicate(contents) + return stdout def GetContent(self): return self.content |