/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import dalvik.annotation.optimization.CriticalNative;
import dalvik.annotation.optimization.FastNative;

/*
 * AUTOMATICALLY GENERATED FROM art/tools/mako-source-generator/...../MyClassNatives.java.mako
 *
 * The tool is however not available, so the changes now need to be done by hand.
 */
class MyClassNatives {

    // Normal native
    native void throwException();
    // Normal native
    native void foo();
    // Normal native
    native int bar(int count);
    // Normal native
    static native int sbar(int count);
    // Normal native
    native int fooI(int x);
    // Normal native
    native int fooII(int x, int y);
    // Normal native
    native long fooJJ(long x, long y);
    // Normal native
    native Object fooO(Object x);
    // Normal native
    native double fooDD(double x, double y);
    // Normal native
    synchronized native long fooJJ_synchronized(long x, long y);
    // Normal native
    native Object fooIOO(int x, Object y, Object z);
    // Normal native
    static native Object fooSIOO(int x, Object y, Object z);
    // Normal native
    static native int fooSII(int x, int y);
    // Normal native
    static native double fooSDD(double x, double y);
    // Normal native
    static synchronized native Object fooSSIOO(int x, Object y, Object z);
    // Normal native
    static native void arraycopy(Object src, int src_pos, Object dst, int dst_pos, int length);
    // Normal native
    native boolean compareAndSwapInt(Object obj, long offset, int expected, int newval);
    // Normal native
    static native int getText(long val1, Object obj1, long val2, Object obj2);
    // Normal native
    synchronized native Object[] getSinkPropertiesNative(String path);

    // Normal native
    native Class<?> instanceMethodThatShouldReturnClass();
    // Normal native
    static native Class<?> staticMethodThatShouldReturnClass();

    // Normal native
    native void instanceMethodThatShouldTakeClass(int i, Class<?> c);
    // Normal native
    static native void staticMethodThatShouldTakeClass(int i, Class<?> c);

    // TODO: These 3 seem like they could work for @CriticalNative as well if they were static.
    // Normal native
    native float checkFloats(float f1, float f2);
    // Normal native
    native void forceStackParameters(int i1, int i2, int i3, int i4, int i5, int i6, int i8, int i9,
                                     float f1, float f2, float f3, float f4, float f5, float f6,
                                     float f7, float f8, float f9);
    // Normal native
    native void checkParameterAlign(int i1, long l1);

    // Normal native
    native void maxParamNumber(Object o0, Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7,
        Object o8, Object o9, Object o10, Object o11, Object o12, Object o13, Object o14, Object o15,
        Object o16, Object o17, Object o18, Object o19, Object o20, Object o21, Object o22, Object o23,
        Object o24, Object o25, Object o26, Object o27, Object o28, Object o29, Object o30, Object o31,
        Object o32, Object o33, Object o34, Object o35, Object o36, Object o37, Object o38, Object o39,
        Object o40, Object o41, Object o42, Object o43, Object o44, Object o45, Object o46, Object o47,
        Object o48, Object o49, Object o50, Object o51, Object o52, Object o53, Object o54, Object o55,
        Object o56, Object o57, Object o58, Object o59, Object o60, Object o61, Object o62, Object o63,
        Object o64, Object o65, Object o66, Object o67, Object o68, Object o69, Object o70, Object o71,
        Object o72, Object o73, Object o74, Object o75, Object o76, Object o77, Object o78, Object o79,
        Object o80, Object o81, Object o82, Object o83, Object o84, Object o85, Object o86, Object o87,
        Object o88, Object o89, Object o90, Object o91, Object o92, Object o93, Object o94, Object o95,
        Object o96, Object o97, Object o98, Object o99, Object o100, Object o101, Object o102, Object o103,
        Object o104, Object o105, Object o106, Object o107, Object o108, Object o109, Object o110, Object o111,
        Object o112, Object o113, Object o114, Object o115, Object o116, Object o117, Object o118, Object o119,
        Object o120, Object o121, Object o122, Object o123, Object o124, Object o125, Object o126, Object o127,
        Object o128, Object o129, Object o130, Object o131, Object o132, Object o133, Object o134, Object o135,
        Object o136, Object o137, Object o138, Object o139, Object o140, Object o141, Object o142, Object o143,
        Object o144, Object o145, Object o146, Object o147, Object o148, Object o149, Object o150, Object o151,
        Object o152, Object o153, Object o154, Object o155, Object o156, Object o157, Object o158, Object o159,
        Object o160, Object o161, Object o162, Object o163, Object o164, Object o165, Object o166, Object o167,
        Object o168, Object o169, Object o170, Object o171, Object o172, Object o173, Object o174, Object o175,
        Object o176, Object o177, Object o178, Object o179, Object o180, Object o181, Object o182, Object o183,
        Object o184, Object o185, Object o186, Object o187, Object o188, Object o189, Object o190, Object o191,
        Object o192, Object o193, Object o194, Object o195, Object o196, Object o197, Object o198, Object o199,
        Object o200, Object o201, Object o202, Object o203, Object o204, Object o205, Object o206, Object o207,
        Object o208, Object o209, Object o210, Object o211, Object o212, Object o213, Object o214, Object o215,
        Object o216, Object o217, Object o218, Object o219, Object o220, Object o221, Object o222, Object o223,
        Object o224, Object o225, Object o226, Object o227, Object o228, Object o229, Object o230, Object o231,
        Object o232, Object o233, Object o234, Object o235, Object o236, Object o237, Object o238, Object o239,
        Object o240, Object o241, Object o242, Object o243, Object o244, Object o245, Object o246, Object o247,
        Object o248, Object o249, Object o250, Object o251, Object o252, Object o253);

    // Normal native
    native void withoutImplementation();
    // Normal native
    native Object withoutImplementationRefReturn();
    // Normal native
    native static void staticWithoutImplementation();

    // Normal native
    native static void stackArgsIntsFirst(int i1, int i2, int i3, int i4, int i5, int i6, int i7,
        int i8, int i9, int i10, float f1, float f2, float f3, float f4, float f5, float f6,
        float f7, float f8, float f9, float f10);

    // Normal native
    native static void stackArgsFloatsFirst(float f1, float f2, float f3, float f4, float f5,
        float f6, float f7, float f8, float f9, float f10, int i1, int i2, int i3, int i4, int i5,
        int i6, int i7, int i8, int i9, int i10);

    // Normal native
    native static void stackArgsMixed(int i1, float f1, int i2, float f2, int i3, float f3, int i4,
        float f4, int i5, float f5, int i6, float f6, int i7, float f7, int i8, float f8, int i9,
        float f9, int i10, float f10);

    // Normal native
    static native double logD(double d);
    // Normal native
    static native float logF(float f);
    // Normal native
    static native boolean returnTrue();
    // Normal native
    static native boolean returnFalse();
    // Normal native
    static native int returnInt();
    // Normal native
    static native double returnDouble();
    // Normal native
    static native long returnLong();



    @FastNative
    native void throwException_Fast();
    @FastNative
    native void foo_Fast();
    @FastNative
    native int bar_Fast(int count);
    @FastNative
    static native int sbar_Fast(int count);
    @FastNative
    native int fooI_Fast(int x);
    @FastNative
    native int fooII_Fast(int x, int y);
    @FastNative
    native long fooJJ_Fast(long x, long y);
    @FastNative
    native Object fooO_Fast(Object x);
    @FastNative
    native double fooDD_Fast(double x, double y);
    @FastNative
    native Object fooIOO_Fast(int x, Object y, Object z);
    @FastNative
    static native Object fooSIOO_Fast(int x, Object y, Object z);
    @FastNative
    static native int fooSII_Fast(int x, int y);
    @FastNative
    static native double fooSDD_Fast(double x, double y);
    @FastNative
    static native void arraycopy_Fast(Object src, int src_pos, Object dst, int dst_pos, int length);
    @FastNative
    native boolean compareAndSwapInt_Fast(Object obj, long offset, int expected, int newval);
    @FastNative
    static native int getText_Fast(long val1, Object obj1, long val2, Object obj2);
    @FastNative
    native Object[] getSinkPropertiesNative_Fast(String path);

    @FastNative
    native Class<?> instanceMethodThatShouldReturnClass_Fast();
    @FastNative
    static native Class<?> staticMethodThatShouldReturnClass_Fast();

    @FastNative
    native void instanceMethodThatShouldTakeClass_Fast(int i, Class<?> c);
    @FastNative
    static native void staticMethodThatShouldTakeClass_Fast(int i, Class<?> c);

    // TODO: These 3 seem like they could work for @CriticalNative as well if they were static.
    @FastNative
    native float checkFloats_Fast(float f1, float f2);
    @FastNative
    native void forceStackParameters_Fast(int i1, int i2, int i3, int i4, int i5, int i6, int i8, int i9,
                                     float f1, float f2, float f3, float f4, float f5, float f6,
                                     float f7, float f8, float f9);
    @FastNative
    native void checkParameterAlign_Fast(int i1, long l1);

    @FastNative
    native void maxParamNumber_Fast(Object o0, Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7,
        Object o8, Object o9, Object o10, Object o11, Object o12, Object o13, Object o14, Object o15,
        Object o16, Object o17, Object o18, Object o19, Object o20, Object o21, Object o22, Object o23,
        Object o24, Object o25, Object o26, Object o27, Object o28, Object o29, Object o30, Object o31,
        Object o32, Object o33, Object o34, Object o35, Object o36, Object o37, Object o38, Object o39,
        Object o40, Object o41, Object o42, Object o43, Object o44, Object o45, Object o46, Object o47,
        Object o48, Object o49, Object o50, Object o51, Object o52, Object o53, Object o54, Object o55,
        Object o56, Object o57, Object o58, Object o59, Object o60, Object o61, Object o62, Object o63,
        Object o64, Object o65, Object o66, Object o67, Object o68, Object o69, Object o70, Object o71,
        Object o72, Object o73, Object o74, Object o75, Object o76, Object o77, Object o78, Object o79,
        Object o80, Object o81, Object o82, Object o83, Object o84, Object o85, Object o86, Object o87,
        Object o88, Object o89, Object o90, Object o91, Object o92, Object o93, Object o94, Object o95,
        Object o96, Object o97, Object o98, Object o99, Object o100, Object o101, Object o102, Object o103,
        Object o104, Object o105, Object o106, Object o107, Object o108, Object o109, Object o110, Object o111,
        Object o112, Object o113, Object o114, Object o115, Object o116, Object o117, Object o118, Object o119,
        Object o120, Object o121, Object o122, Object o123, Object o124, Object o125, Object o126, Object o127,
        Object o128, Object o129, Object o130, Object o131, Object o132, Object o133, Object o134, Object o135,
        Object o136, Object o137, Object o138, Object o139, Object o140, Object o141, Object o142, Object o143,
        Object o144, Object o145, Object o146, Object o147, Object o148, Object o149, Object o150, Object o151,
        Object o152, Object o153, Object o154, Object o155, Object o156, Object o157, Object o158, Object o159,
        Object o160, Object o161, Object o162, Object o163, Object o164, Object o165, Object o166, Object o167,
        Object o168, Object o169, Object o170, Object o171, Object o172, Object o173, Object o174, Object o175,
        Object o176, Object o177, Object o178, Object o179, Object o180, Object o181, Object o182, Object o183,
        Object o184, Object o185, Object o186, Object o187, Object o188, Object o189, Object o190, Object o191,
        Object o192, Object o193, Object o194, Object o195, Object o196, Object o197, Object o198, Object o199,
        Object o200, Object o201, Object o202, Object o203, Object o204, Object o205, Object o206, Object o207,
        Object o208, Object o209, Object o210, Object o211, Object o212, Object o213, Object o214, Object o215,
        Object o216, Object o217, Object o218, Object o219, Object o220, Object o221, Object o222, Object o223,
        Object o224, Object o225, Object o226, Object o227, Object o228, Object o229, Object o230, Object o231,
        Object o232, Object o233, Object o234, Object o235, Object o236, Object o237, Object o238, Object o239,
        Object o240, Object o241, Object o242, Object o243, Object o244, Object o245, Object o246, Object o247,
        Object o248, Object o249, Object o250, Object o251, Object o252, Object o253);

    @FastNative
    native void withoutImplementation_Fast();
    @FastNative
    native Object withoutImplementationRefReturn_Fast();
    @FastNative
    native static void staticWithoutImplementation_Fast();

    @FastNative
    native static void stackArgsIntsFirst_Fast(int i1, int i2, int i3, int i4, int i5, int i6, int i7,
        int i8, int i9, int i10, float f1, float f2, float f3, float f4, float f5, float f6,
        float f7, float f8, float f9, float f10);

    @FastNative
    native static void stackArgsFloatsFirst_Fast(float f1, float f2, float f3, float f4, float f5,
        float f6, float f7, float f8, float f9, float f10, int i1, int i2, int i3, int i4, int i5,
        int i6, int i7, int i8, int i9, int i10);

    @FastNative
    native static void stackArgsMixed_Fast(int i1, float f1, int i2, float f2, int i3, float f3, int i4,
        float f4, int i5, float f5, int i6, float f6, int i7, float f7, int i8, float f8, int i9,
        float f9, int i10, float f10);

    @FastNative
    static native double logD_Fast(double d);
    @FastNative
    static native float logF_Fast(float f);
    @FastNative
    static native boolean returnTrue_Fast();
    @FastNative
    static native boolean returnFalse_Fast();
    @FastNative
    static native int returnInt_Fast();
    @FastNative
    static native double returnDouble_Fast();
    @FastNative
    static native long returnLong_Fast();



    @CriticalNative
    static native int sbar_Critical(int count);
    @CriticalNative
    static native int fooSII_Critical(int x, int y);
    @CriticalNative
    static native double fooSDD_Critical(double x, double y);

    @CriticalNative
    native static void staticWithoutImplementation_Critical();

    @CriticalNative
    native static void stackArgsIntsFirst_Critical(int i1, int i2, int i3, int i4, int i5, int i6, int i7,
        int i8, int i9, int i10, float f1, float f2, float f3, float f4, float f5, float f6,
        float f7, float f8, float f9, float f10);

    @CriticalNative
    native static void stackArgsFloatsFirst_Critical(float f1, float f2, float f3, float f4, float f5,
        float f6, float f7, float f8, float f9, float f10, int i1, int i2, int i3, int i4, int i5,
        int i6, int i7, int i8, int i9, int i10);

    @CriticalNative
    native static void stackArgsMixed_Critical(int i1, float f1, int i2, float f2, int i3, float f3, int i4,
        float f4, int i5, float f5, int i6, float f6, int i7, float f7, int i8, float f8, int i9,
        float f9, int i10, float f10);

    @CriticalNative
    static native double logD_Critical(double d);
    @CriticalNative
    static native float logF_Critical(float f);
    @CriticalNative
    static native boolean returnTrue_Critical();
    @CriticalNative
    static native boolean returnFalse_Critical();
    @CriticalNative
    static native int returnInt_Critical();
    @CriticalNative
    static native double returnDouble_Critical();
    @CriticalNative
    static native long returnLong_Critical();



    // Check for @FastNative/@CriticalNative annotation presence [or lack of presence].
    public static native void normalNative();
    @FastNative
    public static native void fastNative();
    @CriticalNative
    public static native void criticalNative();
}
