// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package this.is.a.package.prefix.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 final boolean REQUIRE_MOCK = false;


    public static void this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_foo() {
        this.is.a.package.prefix.J.N.MGfHLNVl();
    }

    public static Object this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_bar(Object sample) {
        return this.is.a.package.prefix.J.N.M5EfCheU(sample);
    }

    public static String this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_revString(String stringToReverse) {
        return this.is.a.package.prefix.J.N.MXQefv1w(stringToReverse);
    }

    public static String[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendToNative(String[] strs) {
        return this.is.a.package.prefix.J.N.MSYtnUBS(strs);
    }

    public static Object[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendSamplesToNative(Object[] strs) {
        return this.is.a.package.prefix.J.N.MaV5G8K8(strs);
    }

    public static boolean this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_hasPhalange() {
        return this.is.a.package.prefix.J.N.MM2Yz6XD();
    }

    public static int[] this_is_a_package_prefix_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) {
        return this.is.a.package.prefix.J.N.MMy4dcxH(zint, ints, zlong, longs, zshort, shorts, zchar, chars, zbyte, bytes, zdouble, doubles, zfloat, floats, zbool, bools);
    }

    public static void this_is_a_package_prefix_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) {
        this.is.a.package.prefix.J.N.MSslZIsy(clazz, classes, throwable, throwables, string, strings, tStruct, structs, obj, objects);
    }

    public static Throwable this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowable() {
        return this.is.a.package.prefix.J.N.Mehs9t7u();
    }

    public static Throwable[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowables() {
        return this.is.a.package.prefix.J.N.MQH82FhP();
    }

    public static Class this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClass() {
        return this.is.a.package.prefix.J.N.MyxAHj2Y();
    }

    public static Class[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClasses() {
        return this.is.a.package.prefix.J.N.MNGv55Cm();
    }

    public static String this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnString() {
        return this.is.a.package.prefix.J.N.Mysjo$pl();
    }

    public static String[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStrings() {
        return this.is.a.package.prefix.J.N.M3B287zk();
    }

    public static Object this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStruct() {
        return this.is.a.package.prefix.J.N.M8UGsyhL();
    }

    public static Object[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStructs() {
        return this.is.a.package.prefix.J.N.MtYMX5wX();
    }

    public static Object this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObject() {
        return this.is.a.package.prefix.J.N.MIs8T9aQ();
    }

    public static Object[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObjects() {
        return this.is.a.package.prefix.J.N.MtkQGyRy();
    }
}
