diff --git a/base/android/jni_generator/jni_generator.py b/base/android/jni_generator/jni_generator.py index de865d527be81..317105e07bcdf 100755 --- a/base/android/jni_generator/jni_generator.py +++ b/base/android/jni_generator/jni_generator.py @@ -456,6 +456,9 @@ def __init__(self, contents, namespace): '.*?(class|interface) (?P.*?)( |{)', contents[1]).group('class_name') self.fully_qualified_class = self.fully_qualified_class.replace('.', '/') + # Java 7's javap includes type parameters in output, like HashSet. Strip + # away the <...> and use the raw class name that Java 6 would've given us. + self.fully_qualified_class = self.fully_qualified_class.split('<', 1)[0] JniParams.SetFullyQualifiedClass(self.fully_qualified_class) self.java_class_name = self.fully_qualified_class.split('/')[-1] if not self.namespace: diff --git a/base/android/jni_generator/jni_generator_tests.py b/base/android/jni_generator/jni_generator_tests.py index f008f394cec95..3ce58f1d95a6c 100755 --- a/base/android/jni_generator/jni_generator_tests.py +++ b/base/android/jni_generator/jni_generator_tests.py @@ -1566,6 +1566,85 @@ def testMethodNameMangling(self): datatype='java/lang/String'),], 'java/io/InputStream')) + def testFromJavaPGenerics(self): + contents = """ +public abstract class java.util.HashSet extends java.util.AbstractSet + implements java.util.Set, java.lang.Cloneable, java.io.Serializable { + public void dummy(); +} +""" + jni_from_javap = jni_generator.JNIFromJavaP(contents.split('\n'), None) + self.assertEquals(1, len(jni_from_javap.called_by_natives)) + golden_content = """\ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file is autogenerated by +// base/android/jni_generator/jni_generator_tests.py +// For +// java/util/HashSet + +#ifndef java_util_HashSet_JNI +#define java_util_HashSet_JNI + +#include + +#include "base/android/jni_android.h" +#include "base/android/scoped_java_ref.h" +#include "base/basictypes.h" +#include "base/logging.h" + +using base::android::ScopedJavaLocalRef; + +// Step 1: forward declarations. +namespace { +const char kHashSetClassPath[] = "java/util/HashSet"; +// Leaking this jclass as we cannot use LazyInstance from some threads. +jclass g_HashSet_clazz = NULL; +} // namespace + +namespace JNI_HashSet { + +// Step 2: method stubs. + +static base::subtle::AtomicWord g_HashSet_dummy = 0; +static void Java_HashSet_dummy(JNIEnv* env, jobject obj) __attribute__ + ((unused)); +static void Java_HashSet_dummy(JNIEnv* env, jobject obj) { + /* Must call RegisterNativesImpl() */ + DCHECK(g_HashSet_clazz); + jmethodID method_id = + base::android::MethodID::LazyGet< + base::android::MethodID::TYPE_INSTANCE>( + env, g_HashSet_clazz, + "dummy", + +"(" +")" +"V", + &g_HashSet_dummy); + + env->CallVoidMethod(obj, + method_id); + base::android::CheckException(env); + +} + +// Step 3: RegisterNatives. + +static bool RegisterNativesImpl(JNIEnv* env) { + + g_HashSet_clazz = reinterpret_cast(env->NewGlobalRef( + base::android::GetClass(env, kHashSetClassPath).obj())); + return true; +} +} // namespace JNI_HashSet + +#endif // java_util_HashSet_JNI +""" + self.assertTextEquals(golden_content, jni_from_javap.GetContent()) + def testFromJavaP(self): contents = """ public abstract class java.io.InputStream extends java.lang.Object diff --git a/build/android/gyp/jar_toc.py b/build/android/gyp/jar_toc.py index 9db9d2665b526..54e90bcf28729 100755 --- a/build/android/gyp/jar_toc.py +++ b/build/android/gyp/jar_toc.py @@ -38,8 +38,7 @@ def GetClassesInZipFile(zip_file): def CallJavap(classpath, classes): javap_cmd = [ 'javap', - '-public', - '-protected', + '-protected', # In reality both public & protected. # -verbose is required to get constant values (which can be inlined in # dependents). '-verbose', @@ -109,4 +108,3 @@ def main(argv): if __name__ == '__main__': sys.exit(main(sys.argv)) -