// Code generated by gobind. DO NOT EDIT.

// JNI function headers for the Go <=> Java bridge.
//
//   autogenerated by gobind -lang=java interfaces

#ifndef __Interfaces_H__
#define __Interfaces_H__

#include <jni.h>

extern jclass proxy_class_interfaces_Error;
extern jmethodID proxy_class_interfaces_Error_cons;

int32_t cproxyinterfaces_Error_Err(int32_t refnum);

extern jclass proxy_class_interfaces_I;
extern jmethodID proxy_class_interfaces_I_cons;

int32_t cproxyinterfaces_I_Rand(int32_t refnum);

extern jclass proxy_class_interfaces_I1;
extern jmethodID proxy_class_interfaces_I1_cons;

void cproxyinterfaces_I1_J(int32_t refnum);

extern jclass proxy_class_interfaces_I2;
extern jmethodID proxy_class_interfaces_I2_cons;

void cproxyinterfaces_I2_G(int32_t refnum);

extern jclass proxy_class_interfaces_I3;
extern jmethodID proxy_class_interfaces_I3_cons;

int32_t cproxyinterfaces_I3_F(int32_t refnum);

extern jclass proxy_class_interfaces_Interfaces;
extern jmethodID proxy_class_interfaces_Interfaces_cons;

void cproxyinterfaces_Interfaces_SomeMethod(int32_t refnum);

extern jclass proxy_class_interfaces_LargerI;
extern jmethodID proxy_class_interfaces_LargerI_cons;

void cproxyinterfaces_LargerI_AnotherFunc(int32_t refnum);

int32_t cproxyinterfaces_LargerI_Rand(int32_t refnum);

extern jclass proxy_class_interfaces_SameI;
extern jmethodID proxy_class_interfaces_SameI_cons;

int32_t cproxyinterfaces_SameI_Rand(int32_t refnum);

extern jclass proxy_class_interfaces_WithParam;
extern jmethodID proxy_class_interfaces_WithParam_cons;

void cproxyinterfaces_WithParam_HasParam(int32_t refnum, char p0);

#endif
