/*
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You 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.
 */
/** 
 * @author Alexey V. Varlamov
 */  

/*
 * THE FILE HAS BEEN AUTOGENERATED BY THE IJH TOOL.
 * Please be aware that all changes made to this file manually
 * will be overwritten by the tool if it runs again.
 */

#include <jni.h>


/* Header for class org.apache.harmony.vm.VMGenericsAndAnnotations */

#ifndef _ORG_APACHE_HARMONY_VM_VMGENERICSANDANNOTATIONS_H
#define _ORG_APACHE_HARMONY_VM_VMGENERICSANDANNOTATIONS_H

#ifdef __cplusplus
extern "C" {
#endif


/* Native methods */

/*
 * Method: org.apache.harmony.vm.VMGenericsAndAnnotations.getSignature(J)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL
Java_org_apache_harmony_vm_VMGenericsAndAnnotations_getSignature__J(JNIEnv *, jclass, 
    jlong);

/*
 * Method: org.apache.harmony.vm.VMGenericsAndAnnotations.getSignature(Ljava/lang/Class;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL
Java_org_apache_harmony_vm_VMGenericsAndAnnotations_getSignature__Ljava_lang_Class_2(JNIEnv *, jclass, 
    jclass);

/*
 * Method: org.apache.harmony.vm.VMGenericsAndAnnotations.getDeclaredAnnotations(J)[Ljava/lang/annotation/Annotation;
 */
JNIEXPORT jobjectArray JNICALL
Java_org_apache_harmony_vm_VMGenericsAndAnnotations_getDeclaredAnnotations__J(JNIEnv *, jclass, 
    jlong);

/*
 * Method: org.apache.harmony.vm.VMGenericsAndAnnotations.getDeclaredAnnotations(Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;
 */
JNIEXPORT jobjectArray JNICALL
Java_org_apache_harmony_vm_VMGenericsAndAnnotations_getDeclaredAnnotations__Ljava_lang_Class_2(JNIEnv *, jclass, 
    jclass);

/*
 * Method: org.apache.harmony.vm.VMGenericsAndAnnotations.getParameterAnnotations(J)[[Ljava/lang/annotation/Annotation;
 */
JNIEXPORT jobjectArray JNICALL
Java_org_apache_harmony_vm_VMGenericsAndAnnotations_getParameterAnnotations(JNIEnv *, jclass, 
    jlong);

/*
 * Method: org.apache.harmony.vm.VMGenericsAndAnnotations.getDefaultValue(J)Ljava/lang/Object;
 */
JNIEXPORT jobject JNICALL
Java_org_apache_harmony_vm_VMGenericsAndAnnotations_getDefaultValue(JNIEnv *, jclass, 
    jlong);


#ifdef __cplusplus
}
#endif

#endif /* _ORG_APACHE_HARMONY_VM_VMGENERICSANDANNOTATIONS_H */

