Commit 60d72c0b authored by Aiden Benner's avatar Aiden Benner Committed by Commit Bot

Add helpers to generate GEN_JNI.java during JNI registration

GEN_JNI contains the actual native method declaration
that corresponds to a method in an @JniNatives annotation.
This change adds helpers to generate GEN_JNI with all
proxy natives that are being registered in a generated
registration header file.

- Also fixes bug where hashed method names were escaped
one too many times.
- Adds better tests for special JNI type cases.

Change-Id: Ie705d0cf55233c513ad4bc32024212454115bcba
Bug: 898261
Reviewed-on: https://chromium-review.googlesource.com/c/1315687
Commit-Queue: Aiden Benner <abenner@google.com>
Reviewed-by: default avataragrieve <agrieve@chromium.org>
Reviewed-by: default avatarEric Stevenson <estevenson@chromium.org>
Cr-Commit-Position: refs/heads/master@{#608974}
parent 6efc7a2b
// Copyright 2018 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.
package org.chromium.base.natives;
// This file is autogenerated by
// base/android/jni_generator/jni_registration_generator.py
// Please do not change its content.
public class GEN_JNI {
public static final boolean TESTING_ENABLED = false;
public static native void org_chromium_example_jni_1generator_SampleForAnnotationProcessor_foo();
public static native Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_bar(Object sample);
public static native String org_chromium_example_jni_1generator_SampleForAnnotationProcessor_revString(String stringToReverse);
public static native String[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendToNative(String[] strs);
public static native Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendSamplesToNative(Object[] strs);
public static native boolean org_chromium_example_jni_1generator_SampleForAnnotationProcessor_hasPhalange();
public static native int[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testAllPrimitives(int zint, int[] ints, long zlong, long[] longs, short zshort, short[] shorts, char zchar, char[] chars, byte zbyte, byte[] bytes, double zdouble, double[] doubles, float zfloat, float[] floats, boolean zbool, boolean[] bools);
public static native void org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testSpecialTypes(Class clazz, Class[] classes, Throwable throwable, Throwable[] throwables, String string, String[] strings, Object tStruct, Object[] structs, Object obj, Object[] objects);
public static native Throwable org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowable();
public static native Throwable[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowables();
public static native Class org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClass();
public static native Class[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClasses();
public static native String org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnString();
public static native String[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStrings();
public static native Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStruct();
public static native Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStructs();
public static native Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObject();
public static native Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObjects();
}
...@@ -94,5 +94,205 @@ JNI_GENERATOR_EXPORT jboolean Java_org_chromium_base_natives_GEN_1JNI_MW0aEs4h( ...@@ -94,5 +94,205 @@ JNI_GENERATOR_EXPORT jboolean Java_org_chromium_base_natives_GEN_1JNI_MW0aEs4h(
jcaller)); jcaller));
} }
static base::android::ScopedJavaLocalRef<jintArray>
JNI_SampleForAnnotationProcessor_TestAllPrimitives(JNIEnv* env, const
base::android::JavaParamRef<jclass>& jcaller,
jint zint,
const base::android::JavaParamRef<jintArray>& ints,
jlong zlong,
const base::android::JavaParamRef<jlongArray>& longs,
jshort zshort,
const base::android::JavaParamRef<jshortArray>& shorts,
jchar zchar,
const base::android::JavaParamRef<jcharArray>& chars,
jbyte zbyte,
const base::android::JavaParamRef<jbyteArray>& bytes,
jdouble zdouble,
const base::android::JavaParamRef<jdoubleArray>& doubles,
jfloat zfloat,
const base::android::JavaParamRef<jfloatArray>& floats,
jboolean zbool,
const base::android::JavaParamRef<jbooleanArray>& bools);
JNI_GENERATOR_EXPORT jintArray Java_org_chromium_base_natives_GEN_1JNI_MlVFI4RX(
JNIEnv* env,
jclass jcaller,
jint zint,
jintArray ints,
jlong zlong,
jlongArray longs,
jshort zshort,
jshortArray shorts,
jchar zchar,
jcharArray chars,
jbyte zbyte,
jbyteArray bytes,
jdouble zdouble,
jdoubleArray doubles,
jfloat zfloat,
jfloatArray floats,
jboolean zbool,
jbooleanArray bools) {
return JNI_SampleForAnnotationProcessor_TestAllPrimitives(env,
base::android::JavaParamRef<jclass>(env, jcaller), zint,
base::android::JavaParamRef<jintArray>(env, ints), zlong,
base::android::JavaParamRef<jlongArray>(env, longs), zshort,
base::android::JavaParamRef<jshortArray>(env, shorts), zchar,
base::android::JavaParamRef<jcharArray>(env, chars), zbyte,
base::android::JavaParamRef<jbyteArray>(env, bytes), zdouble,
base::android::JavaParamRef<jdoubleArray>(env, doubles), zfloat,
base::android::JavaParamRef<jfloatArray>(env, floats), zbool,
base::android::JavaParamRef<jbooleanArray>(env, bools)).Release();
}
static void JNI_SampleForAnnotationProcessor_TestSpecialTypes(JNIEnv* env, const
base::android::JavaParamRef<jclass>& jcaller,
const base::android::JavaParamRef<jclass>& clazz,
const base::android::JavaParamRef<jobjectArray>& classes,
const base::android::JavaParamRef<jthrowable>& throwable,
const base::android::JavaParamRef<jobjectArray>& throwables,
const base::android::JavaParamRef<jstring>& string,
const base::android::JavaParamRef<jobjectArray>& strings,
const base::android::JavaParamRef<jobject>& tStruct,
const base::android::JavaParamRef<jobjectArray>& structs,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobjectArray>& objects);
JNI_GENERATOR_EXPORT void Java_org_chromium_base_natives_GEN_1JNI_MqOnlud7(
JNIEnv* env,
jclass jcaller,
jclass clazz,
jobjectArray classes,
jthrowable throwable,
jobjectArray throwables,
jstring string,
jobjectArray strings,
jobject tStruct,
jobjectArray structs,
jobject obj,
jobjectArray objects) {
return JNI_SampleForAnnotationProcessor_TestSpecialTypes(env,
base::android::JavaParamRef<jclass>(env, jcaller), base::android::JavaParamRef<jclass>(env,
clazz), base::android::JavaParamRef<jobjectArray>(env, classes),
base::android::JavaParamRef<jthrowable>(env, throwable),
base::android::JavaParamRef<jobjectArray>(env, throwables),
base::android::JavaParamRef<jstring>(env, string),
base::android::JavaParamRef<jobjectArray>(env, strings),
base::android::JavaParamRef<jobject>(env, tStruct),
base::android::JavaParamRef<jobjectArray>(env, structs),
base::android::JavaParamRef<jobject>(env, obj), base::android::JavaParamRef<jobjectArray>(env,
objects));
}
static base::android::ScopedJavaLocalRef<jthrowable>
JNI_SampleForAnnotationProcessor_ReturnThrowable(JNIEnv* env, const
base::android::JavaParamRef<jclass>& jcaller);
JNI_GENERATOR_EXPORT jthrowable Java_org_chromium_base_natives_GEN_1JNI_MuZc76Vt(
JNIEnv* env,
jclass jcaller) {
return JNI_SampleForAnnotationProcessor_ReturnThrowable(env,
base::android::JavaParamRef<jclass>(env, jcaller)).Release();
}
static base::android::ScopedJavaLocalRef<jobjectArray>
JNI_SampleForAnnotationProcessor_ReturnThrowables(JNIEnv* env, const
base::android::JavaParamRef<jclass>& jcaller);
JNI_GENERATOR_EXPORT jobjectArray Java_org_chromium_base_natives_GEN_1JNI_MAD53J7V(
JNIEnv* env,
jclass jcaller) {
return JNI_SampleForAnnotationProcessor_ReturnThrowables(env,
base::android::JavaParamRef<jclass>(env, jcaller)).Release();
}
static base::android::ScopedJavaLocalRef<jclass>
JNI_SampleForAnnotationProcessor_ReturnClass(JNIEnv* env, const
base::android::JavaParamRef<jclass>& jcaller);
JNI_GENERATOR_EXPORT jclass Java_org_chromium_base_natives_GEN_1JNI_M_00024ZgOi4g(
JNIEnv* env,
jclass jcaller) {
return JNI_SampleForAnnotationProcessor_ReturnClass(env, base::android::JavaParamRef<jclass>(env,
jcaller)).Release();
}
static base::android::ScopedJavaLocalRef<jobjectArray>
JNI_SampleForAnnotationProcessor_ReturnClasses(JNIEnv* env, const
base::android::JavaParamRef<jclass>& jcaller);
JNI_GENERATOR_EXPORT jobjectArray Java_org_chromium_base_natives_GEN_1JNI_M_00024hL1577(
JNIEnv* env,
jclass jcaller) {
return JNI_SampleForAnnotationProcessor_ReturnClasses(env,
base::android::JavaParamRef<jclass>(env, jcaller)).Release();
}
static base::android::ScopedJavaLocalRef<jstring>
JNI_SampleForAnnotationProcessor_ReturnString(JNIEnv* env, const
base::android::JavaParamRef<jclass>& jcaller);
JNI_GENERATOR_EXPORT jstring Java_org_chromium_base_natives_GEN_1JNI_M0k1OjBK(
JNIEnv* env,
jclass jcaller) {
return JNI_SampleForAnnotationProcessor_ReturnString(env, base::android::JavaParamRef<jclass>(env,
jcaller)).Release();
}
static base::android::ScopedJavaLocalRef<jobjectArray>
JNI_SampleForAnnotationProcessor_ReturnStrings(JNIEnv* env, const
base::android::JavaParamRef<jclass>& jcaller);
JNI_GENERATOR_EXPORT jobjectArray Java_org_chromium_base_natives_GEN_1JNI_Mssfs54E(
JNIEnv* env,
jclass jcaller) {
return JNI_SampleForAnnotationProcessor_ReturnStrings(env,
base::android::JavaParamRef<jclass>(env, jcaller)).Release();
}
static base::android::ScopedJavaLocalRef<jobject>
JNI_SampleForAnnotationProcessor_ReturnStruct(JNIEnv* env, const
base::android::JavaParamRef<jclass>& jcaller);
JNI_GENERATOR_EXPORT jobject Java_org_chromium_base_natives_GEN_1JNI_MSzcel_1H(
JNIEnv* env,
jclass jcaller) {
return JNI_SampleForAnnotationProcessor_ReturnStruct(env, base::android::JavaParamRef<jclass>(env,
jcaller)).Release();
}
static base::android::ScopedJavaLocalRef<jobjectArray>
JNI_SampleForAnnotationProcessor_ReturnStructs(JNIEnv* env, const
base::android::JavaParamRef<jclass>& jcaller);
JNI_GENERATOR_EXPORT jobjectArray Java_org_chromium_base_natives_GEN_1JNI_MIBrQLK4(
JNIEnv* env,
jclass jcaller) {
return JNI_SampleForAnnotationProcessor_ReturnStructs(env,
base::android::JavaParamRef<jclass>(env, jcaller)).Release();
}
static base::android::ScopedJavaLocalRef<jobject>
JNI_SampleForAnnotationProcessor_ReturnObject(JNIEnv* env, const
base::android::JavaParamRef<jclass>& jcaller);
JNI_GENERATOR_EXPORT jobject Java_org_chromium_base_natives_GEN_1JNI_M_00024hPywjv(
JNIEnv* env,
jclass jcaller) {
return JNI_SampleForAnnotationProcessor_ReturnObject(env, base::android::JavaParamRef<jclass>(env,
jcaller)).Release();
}
static base::android::ScopedJavaLocalRef<jobjectArray>
JNI_SampleForAnnotationProcessor_ReturnObjects(JNIEnv* env, const
base::android::JavaParamRef<jclass>& jcaller);
JNI_GENERATOR_EXPORT jobjectArray Java_org_chromium_base_natives_GEN_1JNI_MPpCU1l5(
JNIEnv* env,
jclass jcaller) {
return JNI_SampleForAnnotationProcessor_ReturnObjects(env,
base::android::JavaParamRef<jclass>(env, jcaller)).Release();
}
#endif // org_chromium_example_jni_generator_SampleForAnnotationProcessor_JNI #endif // org_chromium_example_jni_generator_SampleForAnnotationProcessor_JNI
...@@ -100,5 +100,217 @@ JNI_GENERATOR_EXPORT jboolean ...@@ -100,5 +100,217 @@ JNI_GENERATOR_EXPORT jboolean
jcaller)); jcaller));
} }
static base::android::ScopedJavaLocalRef<jintArray>
JNI_SampleForAnnotationProcessor_TestAllPrimitives(JNIEnv* env, const
base::android::JavaParamRef<jclass>& jcaller,
jint zint,
const base::android::JavaParamRef<jintArray>& ints,
jlong zlong,
const base::android::JavaParamRef<jlongArray>& longs,
jshort zshort,
const base::android::JavaParamRef<jshortArray>& shorts,
jchar zchar,
const base::android::JavaParamRef<jcharArray>& chars,
jbyte zbyte,
const base::android::JavaParamRef<jbyteArray>& bytes,
jdouble zdouble,
const base::android::JavaParamRef<jdoubleArray>& doubles,
jfloat zfloat,
const base::android::JavaParamRef<jfloatArray>& floats,
jboolean zbool,
const base::android::JavaParamRef<jbooleanArray>& bools);
JNI_GENERATOR_EXPORT jintArray
Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testAllPrimitives(
JNIEnv* env,
jclass jcaller,
jint zint,
jintArray ints,
jlong zlong,
jlongArray longs,
jshort zshort,
jshortArray shorts,
jchar zchar,
jcharArray chars,
jbyte zbyte,
jbyteArray bytes,
jdouble zdouble,
jdoubleArray doubles,
jfloat zfloat,
jfloatArray floats,
jboolean zbool,
jbooleanArray bools) {
return JNI_SampleForAnnotationProcessor_TestAllPrimitives(env,
base::android::JavaParamRef<jclass>(env, jcaller), zint,
base::android::JavaParamRef<jintArray>(env, ints), zlong,
base::android::JavaParamRef<jlongArray>(env, longs), zshort,
base::android::JavaParamRef<jshortArray>(env, shorts), zchar,
base::android::JavaParamRef<jcharArray>(env, chars), zbyte,
base::android::JavaParamRef<jbyteArray>(env, bytes), zdouble,
base::android::JavaParamRef<jdoubleArray>(env, doubles), zfloat,
base::android::JavaParamRef<jfloatArray>(env, floats), zbool,
base::android::JavaParamRef<jbooleanArray>(env, bools)).Release();
}
static void JNI_SampleForAnnotationProcessor_TestSpecialTypes(JNIEnv* env, const
base::android::JavaParamRef<jclass>& jcaller,
const base::android::JavaParamRef<jclass>& clazz,
const base::android::JavaParamRef<jobjectArray>& classes,
const base::android::JavaParamRef<jthrowable>& throwable,
const base::android::JavaParamRef<jobjectArray>& throwables,
const base::android::JavaParamRef<jstring>& string,
const base::android::JavaParamRef<jobjectArray>& strings,
const base::android::JavaParamRef<jobject>& tStruct,
const base::android::JavaParamRef<jobjectArray>& structs,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobjectArray>& objects);
JNI_GENERATOR_EXPORT void
Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testSpecialTypes(
JNIEnv* env,
jclass jcaller,
jclass clazz,
jobjectArray classes,
jthrowable throwable,
jobjectArray throwables,
jstring string,
jobjectArray strings,
jobject tStruct,
jobjectArray structs,
jobject obj,
jobjectArray objects) {
return JNI_SampleForAnnotationProcessor_TestSpecialTypes(env,
base::android::JavaParamRef<jclass>(env, jcaller), base::android::JavaParamRef<jclass>(env,
clazz), base::android::JavaParamRef<jobjectArray>(env, classes),
base::android::JavaParamRef<jthrowable>(env, throwable),
base::android::JavaParamRef<jobjectArray>(env, throwables),
base::android::JavaParamRef<jstring>(env, string),
base::android::JavaParamRef<jobjectArray>(env, strings),
base::android::JavaParamRef<jobject>(env, tStruct),
base::android::JavaParamRef<jobjectArray>(env, structs),
base::android::JavaParamRef<jobject>(env, obj), base::android::JavaParamRef<jobjectArray>(env,
objects));
}
static base::android::ScopedJavaLocalRef<jthrowable>
JNI_SampleForAnnotationProcessor_ReturnThrowable(JNIEnv* env, const
base::android::JavaParamRef<jclass>& jcaller);
JNI_GENERATOR_EXPORT jthrowable
Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowable(
JNIEnv* env,
jclass jcaller) {
return JNI_SampleForAnnotationProcessor_ReturnThrowable(env,
base::android::JavaParamRef<jclass>(env, jcaller)).Release();
}
static base::android::ScopedJavaLocalRef<jobjectArray>
JNI_SampleForAnnotationProcessor_ReturnThrowables(JNIEnv* env, const
base::android::JavaParamRef<jclass>& jcaller);
JNI_GENERATOR_EXPORT jobjectArray
Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowables(
JNIEnv* env,
jclass jcaller) {
return JNI_SampleForAnnotationProcessor_ReturnThrowables(env,
base::android::JavaParamRef<jclass>(env, jcaller)).Release();
}
static base::android::ScopedJavaLocalRef<jclass>
JNI_SampleForAnnotationProcessor_ReturnClass(JNIEnv* env, const
base::android::JavaParamRef<jclass>& jcaller);
JNI_GENERATOR_EXPORT jclass
Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClass(
JNIEnv* env,
jclass jcaller) {
return JNI_SampleForAnnotationProcessor_ReturnClass(env, base::android::JavaParamRef<jclass>(env,
jcaller)).Release();
}
static base::android::ScopedJavaLocalRef<jobjectArray>
JNI_SampleForAnnotationProcessor_ReturnClasses(JNIEnv* env, const
base::android::JavaParamRef<jclass>& jcaller);
JNI_GENERATOR_EXPORT jobjectArray
Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClasses(
JNIEnv* env,
jclass jcaller) {
return JNI_SampleForAnnotationProcessor_ReturnClasses(env,
base::android::JavaParamRef<jclass>(env, jcaller)).Release();
}
static base::android::ScopedJavaLocalRef<jstring>
JNI_SampleForAnnotationProcessor_ReturnString(JNIEnv* env, const
base::android::JavaParamRef<jclass>& jcaller);
JNI_GENERATOR_EXPORT jstring
Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnString(
JNIEnv* env,
jclass jcaller) {
return JNI_SampleForAnnotationProcessor_ReturnString(env, base::android::JavaParamRef<jclass>(env,
jcaller)).Release();
}
static base::android::ScopedJavaLocalRef<jobjectArray>
JNI_SampleForAnnotationProcessor_ReturnStrings(JNIEnv* env, const
base::android::JavaParamRef<jclass>& jcaller);
JNI_GENERATOR_EXPORT jobjectArray
Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStrings(
JNIEnv* env,
jclass jcaller) {
return JNI_SampleForAnnotationProcessor_ReturnStrings(env,
base::android::JavaParamRef<jclass>(env, jcaller)).Release();
}
static base::android::ScopedJavaLocalRef<jobject>
JNI_SampleForAnnotationProcessor_ReturnStruct(JNIEnv* env, const
base::android::JavaParamRef<jclass>& jcaller);
JNI_GENERATOR_EXPORT jobject
Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStruct(
JNIEnv* env,
jclass jcaller) {
return JNI_SampleForAnnotationProcessor_ReturnStruct(env, base::android::JavaParamRef<jclass>(env,
jcaller)).Release();
}
static base::android::ScopedJavaLocalRef<jobjectArray>
JNI_SampleForAnnotationProcessor_ReturnStructs(JNIEnv* env, const
base::android::JavaParamRef<jclass>& jcaller);
JNI_GENERATOR_EXPORT jobjectArray
Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStructs(
JNIEnv* env,
jclass jcaller) {
return JNI_SampleForAnnotationProcessor_ReturnStructs(env,
base::android::JavaParamRef<jclass>(env, jcaller)).Release();
}
static base::android::ScopedJavaLocalRef<jobject>
JNI_SampleForAnnotationProcessor_ReturnObject(JNIEnv* env, const
base::android::JavaParamRef<jclass>& jcaller);
JNI_GENERATOR_EXPORT jobject
Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObject(
JNIEnv* env,
jclass jcaller) {
return JNI_SampleForAnnotationProcessor_ReturnObject(env, base::android::JavaParamRef<jclass>(env,
jcaller)).Release();
}
static base::android::ScopedJavaLocalRef<jobjectArray>
JNI_SampleForAnnotationProcessor_ReturnObjects(JNIEnv* env, const
base::android::JavaParamRef<jclass>& jcaller);
JNI_GENERATOR_EXPORT jobjectArray
Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObjects(
JNIEnv* env,
jclass jcaller) {
return JNI_SampleForAnnotationProcessor_ReturnObjects(env,
base::android::JavaParamRef<jclass>(env, jcaller)).Release();
}
#endif // org_chromium_example_jni_generator_SampleForAnnotationProcessor_JNI #endif // org_chromium_example_jni_generator_SampleForAnnotationProcessor_JNI
...@@ -11,6 +11,10 @@ import org.chromium.base.annotations.JniStaticNatives; ...@@ -11,6 +11,10 @@ import org.chromium.base.annotations.JniStaticNatives;
* See generated files at bottom. * See generated files at bottom.
*/ */
class SampleForAnnotationProcessor { class SampleForAnnotationProcessor {
class TestStruct {
int mA;
int mB;
}
/** /**
* Static methods declared here, each of these refer to a native method * Static methods declared here, each of these refer to a native method
* which will have its declaration generated by our annotation processor. * which will have its declaration generated by our annotation processor.
...@@ -26,6 +30,25 @@ class SampleForAnnotationProcessor { ...@@ -26,6 +30,25 @@ class SampleForAnnotationProcessor {
String[] sendToNative(String[] strs); String[] sendToNative(String[] strs);
SampleForAnnotationProcessor[] sendSamplesToNative(SampleForAnnotationProcessor[] strs); SampleForAnnotationProcessor[] sendSamplesToNative(SampleForAnnotationProcessor[] strs);
boolean hasPhalange(); boolean hasPhalange();
int[] testAllPrimitives(int zint, int[] ints, long zlong, long[] longs, short zshort,
short[] shorts, char zchar, char[] chars, byte zbyte, byte[] bytes, double zdouble,
double[] doubles, float zfloat, float[] floats, boolean zbool, boolean[] bools);
void testSpecialTypes(Class clazz, Class[] classes, Throwable throwable,
Throwable[] throwables, String string, String[] strings, TestStruct tStruct,
TestStruct[] structs, Object obj, Object[] objects);
Throwable returnThrowable();
Throwable[] returnThrowables();
Class returnClass();
Class[] returnClasses();
String returnString();
String[] returnStrings();
TestStruct returnStruct();
TestStruct[] returnStructs();
Object returnObject();
Object[] returnObjects();
} }
void test() { void test() {
......
...@@ -82,6 +82,27 @@ _WRAPPERS_BY_INDENT = [ ...@@ -82,6 +82,27 @@ _WRAPPERS_BY_INDENT = [
break_long_words=False) break_long_words=False)
for indent in xrange(50)] # 50 chosen experimentally. for indent in xrange(50)] # 50 chosen experimentally.
JAVA_POD_TYPE_MAP = {
'int': 'jint',
'byte': 'jbyte',
'char': 'jchar',
'short': 'jshort',
'boolean': 'jboolean',
'long': 'jlong',
'double': 'jdouble',
'float': 'jfloat',
}
JAVA_TYPE_MAP = {
'void': 'void',
'String': 'jstring',
'Class': 'jclass',
'Throwable': 'jthrowable',
'java/lang/String': 'jstring',
'java/lang/Class': 'jclass',
'java/lang/Throwable': 'jthrowable',
}
class ParseError(Exception): class ParseError(Exception):
"""Exception thrown when we can't parse the input file.""" """Exception thrown when we can't parse the input file."""
...@@ -157,39 +178,34 @@ class ConstantField(object): ...@@ -157,39 +178,34 @@ class ConstantField(object):
def JavaDataTypeToC(java_type): def JavaDataTypeToC(java_type):
"""Returns a C datatype for the given java type.""" """Returns a C datatype for the given java type."""
java_pod_type_map = {
'int': 'jint',
'byte': 'jbyte',
'char': 'jchar',
'short': 'jshort',
'boolean': 'jboolean',
'long': 'jlong',
'double': 'jdouble',
'float': 'jfloat',
}
java_type_map = {
'void': 'void',
'String': 'jstring',
'Class': 'jclass',
'Throwable': 'jthrowable',
'java/lang/String': 'jstring',
'java/lang/Class': 'jclass',
'java/lang/Throwable': 'jthrowable',
}
java_type = _StripGenerics(java_type) java_type = _StripGenerics(java_type)
if java_type in java_pod_type_map: if java_type in JAVA_POD_TYPE_MAP:
return java_pod_type_map[java_type] return JAVA_POD_TYPE_MAP[java_type]
elif java_type in java_type_map: elif java_type in JAVA_TYPE_MAP:
return java_type_map[java_type] return JAVA_TYPE_MAP[java_type]
elif java_type.endswith('[]'): elif java_type.endswith('[]'):
if java_type[:-2] in java_pod_type_map: if java_type[:-2] in JAVA_POD_TYPE_MAP:
return java_pod_type_map[java_type[:-2]] + 'Array' return JAVA_POD_TYPE_MAP[java_type[:-2]] + 'Array'
return 'jobjectArray' return 'jobjectArray'
else: else:
return 'jobject' return 'jobject'
def JavaTypeToProxyCast(type):
"""Maps from a java type to the type used by the native proxy GEN_JNI class"""
if type in JAVA_POD_TYPE_MAP or type in JAVA_TYPE_MAP:
return type
# All the array types of JAVA_TYPE_MAP become jobjectArray across jni but
# they still need to be passed as the original type on the java side.
if type[:-2] in JAVA_POD_TYPE_MAP or type[:-2] in JAVA_TYPE_MAP:
return type
# Otherwise we have a jobject type that should be an object.
if type[-2:] == '[]':
return 'Object[]'
return 'Object'
def WrapCTypeForDeclaration(c_type): def WrapCTypeForDeclaration(c_type):
"""Wrap the C datatype in a JavaRef if required.""" """Wrap the C datatype in a JavaRef if required."""
if re.match(RE_SCOPED_JNI_TYPES, c_type): if re.match(RE_SCOPED_JNI_TYPES, c_type):
...@@ -449,7 +465,11 @@ class JniParams(object): ...@@ -449,7 +465,11 @@ class JniParams(object):
return '"%s"' % signature_line[index + len(prefix):] return '"%s"' % signature_line[index + len(prefix):]
@staticmethod @staticmethod
def Parse(params): def MakeProxyParamSignature(params):
return ', '.join('%s %s' % (p.datatype, p.name) for p in params)
@staticmethod
def Parse(params, use_proxy_types=False):
"""Parses the params into a list of Param objects.""" """Parses the params into a list of Param objects."""
if not params: if not params:
return [] return []
...@@ -469,6 +489,10 @@ class JniParams(object): ...@@ -469,6 +489,10 @@ class JniParams(object):
datatype=items[0], datatype=items[0],
name=(items[1] if len(items) > 1 else 'p%s' % len(ret)), name=(items[1] if len(items) > 1 else 'p%s' % len(ret)),
) )
if use_proxy_types:
param.datatype = JavaTypeToProxyCast(param.datatype)
ret += [param] ret += [param]
return ret return ret
...@@ -824,7 +848,7 @@ class NativeProxyHelpers(object): ...@@ -824,7 +848,7 @@ class NativeProxyHelpers(object):
if use_hash: if use_hash:
hashed_name = NativeProxyHelpers.CreateHashedMethodName( hashed_name = NativeProxyHelpers.CreateHashedMethodName(
fully_qualified_class, old_name) fully_qualified_class, old_name)
return EscapeClassName(hashed_name) return hashed_name
# The annotation processor currently uses a method name # The annotation processor currently uses a method name
# org_chromium_example_foo_method_1name escaping _ to _1 # org_chromium_example_foo_method_1name escaping _ to _1
...@@ -844,8 +868,8 @@ class NativeProxyHelpers(object): ...@@ -844,8 +868,8 @@ class NativeProxyHelpers(object):
interface_body = match.group('interface_body') interface_body = match.group('interface_body')
for method in _EXTRACT_METHODS_REGEX.finditer(interface_body): for method in _EXTRACT_METHODS_REGEX.finditer(interface_body):
name = method.group('name') name = method.group('name')
params = JniParams.Parse(method.group('params')) params = JniParams.Parse(method.group('params'), use_proxy_types=True)
return_type = method.group('return_type') return_type = JavaTypeToProxyCast(method.group('return_type'))
unescaped_proxy_name = NativeProxyHelpers.CreateProxyMethodName( unescaped_proxy_name = NativeProxyHelpers.CreateProxyMethodName(
fully_qualified_class, name, use_hash) fully_qualified_class, name, use_hash)
......
...@@ -135,6 +135,8 @@ class TestGenerator(unittest.TestCase): ...@@ -135,6 +135,8 @@ class TestGenerator(unittest.TestCase):
'assertGoldenTextEquals can only be called from a ' 'assertGoldenTextEquals can only be called from a '
'test* method, not %s' % caller) 'test* method, not %s' % caller)
golden_file = os.path.join(script_dir, '%s%s.golden' % (caller, suffix)) golden_file = os.path.join(script_dir, '%s%s.golden' % (caller, suffix))
self.assertTrue(
os.path.exists(golden_file), '%s does not exist' % golden_file)
golden_text = self._ReadGoldenFile(golden_file) golden_text = self._ReadGoldenFile(golden_file)
if os.environ.get(REBASELINE_ENV): if os.environ.get(REBASELINE_ENV):
if golden_text != generated_text: if golden_text != generated_text:
...@@ -325,7 +327,6 @@ class TestGenerator(unittest.TestCase): ...@@ -325,7 +327,6 @@ class TestGenerator(unittest.TestCase):
proxy_name='org_chromium_example_SampleProxyJni_foobar', proxy_name='org_chromium_example_SampleProxyJni_foobar',
type='function'), type='function'),
] ]
self.assertListEquals(golden_natives, natives) self.assertListEquals(golden_natives, natives)
self.assertListEquals(golden_natives, bad_spacing_natives) self.assertListEquals(golden_natives, bad_spacing_natives)
...@@ -337,6 +338,10 @@ class TestGenerator(unittest.TestCase): ...@@ -337,6 +338,10 @@ class TestGenerator(unittest.TestCase):
natives, jni_params, False) natives, jni_params, False)
content = TestGenerator._MergeRegistrationForTests([h2.Generate()]) content = TestGenerator._MergeRegistrationForTests([h2.Generate()])
self.assertGoldenTextEquals(
jni_registration_generator.CreateProxyJavaFromDict(content),
suffix='Java')
self.assertGoldenTextEquals( self.assertGoldenTextEquals(
jni_registration_generator.CreateFromDict(content), jni_registration_generator.CreateFromDict(content),
suffix='Registrations') suffix='Registrations')
...@@ -1099,13 +1104,21 @@ public class java.util.HashSet { ...@@ -1099,13 +1104,21 @@ public class java.util.HashSet {
def testHashedProxyExample(self): def testHashedProxyExample(self):
opts = TestOptions() opts = TestOptions()
opts.use_proxy_hash = True opts.use_proxy_hash = True
path = 'java/src/org/chromium/example/jni_generator/SampleForAnnotationProcessor.java'
generated_text = self._createJniHeaderFromFile( generated_text = self._createJniHeaderFromFile(
'java/src/org/chromium/example/jni_generator/SampleForAnnotationProcessor.java', path, 'org/chromium/example/jni_generator/SampleForAnnotationProcessor',
'org/chromium/example/jni_generator/SampleForAnnotationProcessor', opts) opts)
self.assertGoldenTextEquals( self.assertGoldenTextEquals(
generated_text, generated_text,
golden_file='HashedSampleForAnnotationProcessor_jni.golden') golden_file='HashedSampleForAnnotationProcessor_jni.golden')
reg_dict = jni_registration_generator._DictForPath(path)
reg_dict = self._MergeRegistrationForTests([reg_dict])
self.assertGoldenTextEquals(
jni_registration_generator.CreateProxyJavaFromDict(reg_dict),
golden_file='HashedSampleForAnnotationProcessorGenJni.golden')
def testJniProxyExample(self): def testJniProxyExample(self):
generated_text = self._createJniHeaderFromFile( generated_text = self._createJniHeaderFromFile(
'java/src/org/chromium/example/jni_generator/SampleForAnnotationProcessor.java', 'java/src/org/chromium/example/jni_generator/SampleForAnnotationProcessor.java',
......
...@@ -26,6 +26,7 @@ MERGEABLE_KEYS = [ ...@@ -26,6 +26,7 @@ MERGEABLE_KEYS = [
'FORWARD_DECLARATIONS', 'FORWARD_DECLARATIONS',
'JNI_NATIVE_METHOD', 'JNI_NATIVE_METHOD',
'JNI_NATIVE_METHOD_ARRAY', 'JNI_NATIVE_METHOD_ARRAY',
'PROXY_NATIVE_SIGNATURES',
'PROXY_NATIVE_METHOD_ARRAY', 'PROXY_NATIVE_METHOD_ARRAY',
'PROXY_NATIVE_METHOD_ARRAY_MAIN_DEX', 'PROXY_NATIVE_METHOD_ARRAY_MAIN_DEX',
'REGISTER_MAIN_DEX_NATIVES', 'REGISTER_MAIN_DEX_NATIVES',
...@@ -169,6 +170,32 @@ JNI_REGISTRATION_EXPORT bool ${REGISTRATION_NAME}(JNIEnv* env) { ...@@ -169,6 +170,32 @@ JNI_REGISTRATION_EXPORT bool ${REGISTRATION_NAME}(JNIEnv* env) {
registration_dict['REGISTER_MAIN_DEX_PROXY_NATIVES'] = main_dex_call registration_dict['REGISTER_MAIN_DEX_PROXY_NATIVES'] = main_dex_call
def CreateProxyJavaFromDict(registration_dict):
template = string.Template("""\
// Copyright 2018 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.
package ${PACKAGE};
// This file is autogenerated by
// base/android/jni_generator/jni_registration_generator.py
// Please do not change its content.
public class ${CLASS_NAME} {
public static final boolean TESTING_ENABLED = false;
${SIGNATURES}
}
""")
return template.substitute({
'CLASS_NAME': jni_generator.NATIVE_PROXY_CLASS_NAME,
'PACKAGE': jni_generator.NATIVE_PROXY_PACKAGE_NAME.replace('/', '.'),
'SIGNATURES': registration_dict['PROXY_NATIVE_SIGNATURES']
})
def CreateFromDict(registration_dict): def CreateFromDict(registration_dict):
"""Returns the content of the header file.""" """Returns the content of the header file."""
...@@ -254,6 +281,7 @@ class HeaderGenerator(object): ...@@ -254,6 +281,7 @@ class HeaderGenerator(object):
self._AddClassPathDeclarations() self._AddClassPathDeclarations()
self._AddForwardDeclaration() self._AddForwardDeclaration()
self._AddJNINativeMethodsArrays() self._AddJNINativeMethodsArrays()
self._AddProxySignatures()
self._AddProxyNativeMethodKStrings() self._AddProxyNativeMethodKStrings()
self._AddRegisterNativesCalls() self._AddRegisterNativesCalls()
self._AddRegisterNativesFunctions() self._AddRegisterNativesFunctions()
...@@ -355,6 +383,10 @@ ${KMETHODS} ...@@ -355,6 +383,10 @@ ${KMETHODS}
} }
return template.substitute(values) return template.substitute(values)
def _AddProxySignatures(self):
self.registration_dict['PROXY_NATIVE_SIGNATURES'] = ('\n'.join(
_MakeProxySignature(n) for n in self.proxy_natives))
def _AddProxyNativeMethodKStrings(self): def _AddProxyNativeMethodKStrings(self):
"""Returns KMethodString for wrapped native methods in all_classes """ """Returns KMethodString for wrapped native methods in all_classes """
...@@ -364,7 +396,7 @@ ${KMETHODS} ...@@ -364,7 +396,7 @@ ${KMETHODS}
key = 'PROXY_NATIVE_METHOD_ARRAY' key = 'PROXY_NATIVE_METHOD_ARRAY'
proxy_k_strings = ('\n'.join( proxy_k_strings = ('\n'.join(
[self._GetKMethodArrayEntry(p) for p in self.proxy_natives])) self._GetKMethodArrayEntry(p) for p in self.proxy_natives))
self._SetDictValue(key, proxy_k_strings) self._SetDictValue(key, proxy_k_strings)
...@@ -446,6 +478,20 @@ ${NATIVES}\ ...@@ -446,6 +478,20 @@ ${NATIVES}\
return '' return ''
def _MakeProxySignature(proxy_native):
signature_template = string.Template("""
public static native ${RETURN_TYPE} ${NAME}(${PARAMS});""")
return signature_template.substitute({
'RETURN_TYPE':
proxy_native.return_type,
'NAME':
proxy_native.proxy_name,
'PARAMS':
jni_generator.JniParams.MakeProxyParamSignature(proxy_native.params)
})
def main(argv): def main(argv):
arg_parser = argparse.ArgumentParser() arg_parser = argparse.ArgumentParser()
build_utils.AddDepfileOption(arg_parser) build_utils.AddDepfileOption(arg_parser)
......
...@@ -164,6 +164,113 @@ static jboolean JNI_SampleForAnnotationProcessor_HasPhalange( ...@@ -164,6 +164,113 @@ static jboolean JNI_SampleForAnnotationProcessor_HasPhalange(
return jboolean(true); return jboolean(true);
} }
static base::android::ScopedJavaLocalRef<jintArray>
JNI_SampleForAnnotationProcessor_TestAllPrimitives(
JNIEnv* env,
const base::android::JavaParamRef<jclass>& jcaller,
jint zint,
const base::android::JavaParamRef<jintArray>& ints,
jlong zlong,
const base::android::JavaParamRef<jlongArray>& longs,
jshort zshort,
const base::android::JavaParamRef<jshortArray>& shorts,
jchar zchar,
const base::android::JavaParamRef<jcharArray>& chars,
jbyte zbyte,
const base::android::JavaParamRef<jbyteArray>& bytes,
jdouble zdouble,
const base::android::JavaParamRef<jdoubleArray>& doubles,
jfloat zfloat,
const base::android::JavaParamRef<jfloatArray>& floats,
jboolean zbool,
const base::android::JavaParamRef<jbooleanArray>& bools) {
return ScopedJavaLocalRef<jintArray>(ints);
}
static void JNI_SampleForAnnotationProcessor_TestSpecialTypes(
JNIEnv* env,
const base::android::JavaParamRef<jclass>& jcaller,
const base::android::JavaParamRef<jclass>& clazz,
const base::android::JavaParamRef<jobjectArray>& classes,
const base::android::JavaParamRef<jthrowable>& throwable,
const base::android::JavaParamRef<jobjectArray>& throwables,
const base::android::JavaParamRef<jstring>& string,
const base::android::JavaParamRef<jobjectArray>& strings,
const base::android::JavaParamRef<jobject>& tStruct,
const base::android::JavaParamRef<jobjectArray>& structs,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobjectArray>& objects) {}
static base::android::ScopedJavaLocalRef<jthrowable>
JNI_SampleForAnnotationProcessor_ReturnThrowable(
JNIEnv* env,
const base::android::JavaParamRef<jclass>& jcaller) {
return ScopedJavaLocalRef<jthrowable>();
}
static base::android::ScopedJavaLocalRef<jobjectArray>
JNI_SampleForAnnotationProcessor_ReturnThrowables(
JNIEnv* env,
const base::android::JavaParamRef<jclass>& jcaller) {
return ScopedJavaLocalRef<jobjectArray>();
}
static base::android::ScopedJavaLocalRef<jclass>
JNI_SampleForAnnotationProcessor_ReturnClass(
JNIEnv* env,
const base::android::JavaParamRef<jclass>& jcaller) {
return ScopedJavaLocalRef<jclass>();
}
static base::android::ScopedJavaLocalRef<jobjectArray>
JNI_SampleForAnnotationProcessor_ReturnClasses(
JNIEnv* env,
const base::android::JavaParamRef<jclass>& jcaller) {
return ScopedJavaLocalRef<jobjectArray>();
}
static base::android::ScopedJavaLocalRef<jstring>
JNI_SampleForAnnotationProcessor_ReturnString(
JNIEnv* env,
const base::android::JavaParamRef<jclass>& jcaller) {
return ScopedJavaLocalRef<jstring>();
}
static base::android::ScopedJavaLocalRef<jobjectArray>
JNI_SampleForAnnotationProcessor_ReturnStrings(
JNIEnv* env,
const base::android::JavaParamRef<jclass>& jcaller) {
return ScopedJavaLocalRef<jobjectArray>();
}
static base::android::ScopedJavaLocalRef<jobject>
JNI_SampleForAnnotationProcessor_ReturnStruct(
JNIEnv* env,
const base::android::JavaParamRef<jclass>& jcaller) {
return ScopedJavaLocalRef<jobject>();
}
static base::android::ScopedJavaLocalRef<jobjectArray>
JNI_SampleForAnnotationProcessor_ReturnStructs(
JNIEnv* env,
const base::android::JavaParamRef<jclass>& jcaller) {
return ScopedJavaLocalRef<jobjectArray>();
}
static base::android::ScopedJavaLocalRef<jobject>
JNI_SampleForAnnotationProcessor_ReturnObject(
JNIEnv* env,
const base::android::JavaParamRef<jclass>& jcaller) {
return ScopedJavaLocalRef<jobject>();
}
static base::android::ScopedJavaLocalRef<jobjectArray>
JNI_SampleForAnnotationProcessor_ReturnObjects(
JNIEnv* env,
const base::android::JavaParamRef<jclass>& jcaller) {
return ScopedJavaLocalRef<jobjectArray>();
}
int main() { int main() {
// On a regular application, you'd call AttachCurrentThread(). This sample is // On a regular application, you'd call AttachCurrentThread(). This sample is
// not yet linking with all the libraries. // not yet linking with all the libraries.
......
// Copyright 2018 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.
package org.chromium.base.natives;
// This file is autogenerated by
// base/android/jni_generator/jni_registration_generator.py
// Please do not change its content.
public class GEN_JNI {
public static final boolean TESTING_ENABLED = false;
public static native void org_chromium_example_SampleProxyJni_foo();
public static native int org_chromium_example_SampleProxyJni_bar(int x, int y);
public static native String org_chromium_example_SampleProxyJni_foobar(String x, String y);
}
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