Commit 86377dd9 authored by Richard Knoll's avatar Richard Knoll Committed by Commit Bot

Fix JNI generator for final args with annotations.

This removes the final keyword before parsing the annotations to support
the following (valid) method signatures:

@CalledByNative void Foo(final @Bar int value);
@CalledByNative void Foo(@Bar final int value);
@CalledByNative void Foo(@Bar final @Baz int value);

Bug: 977593
Change-Id: I7ef87dc7c16353ab74bf7cca533bc893dbebe7fc
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1670891Reviewed-by: default avatarEric Stevenson <estevenson@chromium.org>
Commit-Queue: Richard Knoll <knollr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#672029}
parent eab4b185
...@@ -330,7 +330,10 @@ static void Java_SampleForTests_methodThatThrowsException(JNIEnv* env, const ...@@ -330,7 +330,10 @@ static void Java_SampleForTests_methodThatThrowsException(JNIEnv* env, const
static std::atomic<jmethodID> static std::atomic<jmethodID>
g_org_chromium_example_jni_1generator_SampleForTests_javaMethodWithAnnotatedParam(nullptr); g_org_chromium_example_jni_1generator_SampleForTests_javaMethodWithAnnotatedParam(nullptr);
static void Java_SampleForTests_javaMethodWithAnnotatedParam(JNIEnv* env, const static void Java_SampleForTests_javaMethodWithAnnotatedParam(JNIEnv* env, const
base::android::JavaRef<jobject>& obj, JniIntWrapper foo) { base::android::JavaRef<jobject>& obj, JniIntWrapper foo,
JniIntWrapper bar,
JniIntWrapper baz,
JniIntWrapper bat) {
jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env); jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
CHECK_CLAZZ(env, obj.obj(), CHECK_CLAZZ(env, obj.obj(),
org_chromium_example_jni_1generator_SampleForTests_clazz(env)); org_chromium_example_jni_1generator_SampleForTests_clazz(env));
...@@ -341,11 +344,11 @@ static void Java_SampleForTests_javaMethodWithAnnotatedParam(JNIEnv* env, const ...@@ -341,11 +344,11 @@ static void Java_SampleForTests_javaMethodWithAnnotatedParam(JNIEnv* env, const
env, env,
clazz, clazz,
"javaMethodWithAnnotatedParam", "javaMethodWithAnnotatedParam",
"(I)V", "(IIII)V",
&g_org_chromium_example_jni_1generator_SampleForTests_javaMethodWithAnnotatedParam); &g_org_chromium_example_jni_1generator_SampleForTests_javaMethodWithAnnotatedParam);
env->CallVoidMethod(obj.obj(), env->CallVoidMethod(obj.obj(),
call_context.base.method_id, as_jint(foo)); call_context.base.method_id, as_jint(foo), as_jint(bar), as_jint(baz), as_jint(bat));
} }
static std::atomic<jmethodID> static std::atomic<jmethodID>
......
...@@ -118,11 +118,12 @@ class SampleForTests { ...@@ -118,11 +118,12 @@ class SampleForTests {
private String mArrgh = "*/*"; private String mArrgh = "*/*";
private @interface SomeAnnotation {} private @interface SomeAnnotation {}
private @interface AnotherAnnotation {}
// The generator is not confused by @Annotated parameters. // The generator is not confused by @Annotated parameters.
@CalledByNative @CalledByNative
void javaMethodWithAnnotatedParam(@SomeAnnotation int foo) { void javaMethodWithAnnotatedParam(@SomeAnnotation int foo, final @SomeAnnotation int bar,
} @SomeAnnotation final int baz, @SomeAnnotation final @AnotherAnnotation int bat) {}
// --------------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------------
// Java fields which are accessed from C++ code only must be annotated with @AccessedByNative to // Java fields which are accessed from C++ code only must be annotated with @AccessedByNative to
......
...@@ -494,15 +494,15 @@ class JniParams(object): ...@@ -494,15 +494,15 @@ class JniParams(object):
for p in params.split(','): for p in params.split(','):
items = p.split() items = p.split()
if 'final' in items:
items.remove('final')
# Remove @Annotations from parameters. # Remove @Annotations from parameters.
annotations = [] annotations = []
while items[0].startswith('@'): while items[0].startswith('@'):
annotations.append(items[0]) annotations.append(items[0])
del items[0] del items[0]
if 'final' in items:
items.remove('final')
param = Param( param = Param(
annotations=annotations, annotations=annotations,
datatype=items[0], datatype=items[0],
......
...@@ -272,7 +272,7 @@ int main() { ...@@ -272,7 +272,7 @@ int main() {
base::android::Java_SampleForTests_methodThatThrowsException(env, base::android::Java_SampleForTests_methodThatThrowsException(env,
my_java_object); my_java_object);
base::android::Java_SampleForTests_javaMethodWithAnnotatedParam( base::android::Java_SampleForTests_javaMethodWithAnnotatedParam(
env, my_java_object, 42); env, my_java_object, 42, 13, -1, 99);
base::android::Java_SampleForTests_getInnerInterface(env); base::android::Java_SampleForTests_getInnerInterface(env);
base::android::Java_SampleForTests_getInnerEnum(env); base::android::Java_SampleForTests_getInnerEnum(env);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment