// File is generated by gobind. Do not edit.

#include <jni.h>
#include "seq.h"

extern void init_proxies();

typedef struct ret_jint {
	jint res;
	jint exc;
} ret_jint;
typedef struct ret_jboolean {
	jboolean res;
	jint exc;
} ret_jboolean;
typedef struct ret_jshort {
	jshort res;
	jint exc;
} ret_jshort;
typedef struct ret_jchar {
	jchar res;
	jint exc;
} ret_jchar;
typedef struct ret_jbyte {
	jbyte res;
	jint exc;
} ret_jbyte;
typedef struct ret_jlong {
	jlong res;
	jint exc;
} ret_jlong;
typedef struct ret_jfloat {
	jfloat res;
	jint exc;
} ret_jfloat;
typedef struct ret_jdouble {
	jdouble res;
	jint exc;
} ret_jdouble;
typedef struct ret_nstring {
	nstring res;
	jint exc;
} ret_nstring;
typedef struct ret_nbyteslice {
	nbyteslice res;
	jint exc;
} ret_nbyteslice;

extern jint cproxy_java_lang_Runnable_run(jint this);
extern ret_jint cproxy_java_io_InputStream_read__(jint this);
extern ret_jint cproxy_java_util_concurrent_Future_get__(jint this);
extern ret_jint cproxy_java_util_concurrent_Future_get__JLjava_util_concurrent_TimeUnit_2(jint this, jlong a0, jint a1);
extern ret_jint cproxy_java_Future_get__(jint this);
extern ret_jint csuper_java_Future_get__(jint this);
extern ret_jint cproxy_java_Future_get__JLjava_util_concurrent_TimeUnit_2(jint this, jlong a0, jint a1);
extern ret_jint csuper_java_Future_get__JLjava_util_concurrent_TimeUnit_2(jint this, jlong a0, jint a1);
extern ret_jint cproxy_java_InputStream_read__(jint this);
extern ret_jint csuper_java_InputStream_read__(jint this);
extern jint cproxy_java_Runnable_run(jint this);
extern jint csuper_java_Runnable_run(jint this);
extern jint cproxy_java_io_Console_flush(jint this);
extern ret_jint cproxy_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfInt_2(jclass clazz, jmethodID m, jint a0);
extern ret_jint cproxy_s_java_lang_System_console(jclass clazz, jmethodID m);
// JNI function headers for the Go <=> Java bridge.
//   gobind -lang=java classes
//
// File is generated by gobind. Do not edit.

#ifndef __Java_H__
#define __Java_H__

#include <jni.h>

extern jclass proxy_class_java_Future;
extern jmethodID proxy_class_java_Future_cons;
extern jclass proxy_class_java_InputStream;
extern jmethodID proxy_class_java_InputStream_cons;
extern jclass proxy_class_java_Object;
extern jmethodID proxy_class_java_Object_cons;
extern jclass proxy_class_java_Runnable;
extern jmethodID proxy_class_java_Runnable_cons;
#endif
