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
static std::atomic<jmethodID>
g_org_chromium_example_jni_1generator_SampleForTests_javaMethodWithAnnotatedParam(nullptr);
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);
CHECK_CLAZZ(env, obj.obj(),
org_chromium_example_jni_1generator_SampleForTests_clazz(env));
......@@ -341,11 +344,11 @@ static void Java_SampleForTests_javaMethodWithAnnotatedParam(JNIEnv* env, const
env,
clazz,
"javaMethodWithAnnotatedParam",
"(I)V",
"(IIII)V",
&g_org_chromium_example_jni_1generator_SampleForTests_javaMethodWithAnnotatedParam);
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>
......
......@@ -118,11 +118,12 @@ class SampleForTests {
private String mArrgh = "*/*";
private @interface SomeAnnotation {}
private @interface AnotherAnnotation {}
// The generator is not confused by @Annotated parameters.
@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
......
......@@ -494,15 +494,15 @@ class JniParams(object):
for p in params.split(','):
items = p.split()
if 'final' in items:
items.remove('final')
# Remove @Annotations from parameters.
annotations = []
while items[0].startswith('@'):
annotations.append(items[0])
del items[0]
if 'final' in items:
items.remove('final')
param = Param(
annotations=annotations,
datatype=items[0],
......
......@@ -272,7 +272,7 @@ int main() {
base::android::Java_SampleForTests_methodThatThrowsException(env,
my_java_object);
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_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