// 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_io_InputStream_read___3B(jint this, nbyteslice a0);
extern ret_jint cproxy_java_io_InputStream_read___3BII(jint this, nbyteslice a0, jint a1, jint a2);
extern ret_nstring cproxy_java_io_InputStream_toString(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_nstring cproxy_java_lang_Object_toString(jint this);
extern ret_nstring cproxy_java_util_concurrent_TimeUnit_toString(jint this);
extern ret_nstring cproxy_java_util_Spliterators_toString(jint this);
extern ret_nstring cproxy_java_lang_System_toString(jint this);
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 ret_jint cproxy_java_InputStream_read___3B(jint this, nbyteslice a0);
extern ret_jint csuper_java_InputStream_read___3B(jint this, nbyteslice a0);
extern ret_jint cproxy_java_InputStream_read___3BII(jint this, nbyteslice a0, jint a1, jint a2);
extern ret_jint csuper_java_InputStream_read___3BII(jint this, nbyteslice a0, jint a1, jint a2);
extern ret_nstring cproxy_java_InputStream_toString(jint this);
extern ret_nstring csuper_java_InputStream_toString(jint this);
extern ret_nstring cproxy_java_Object_toString(jint this);
extern ret_nstring csuper_java_Object_toString(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_nstring cproxy_java_io_Console_toString(jint this);
extern ret_jint cproxy_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_2(jint a0);
extern ret_jint cproxy_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfInt_2(jint a0);
extern ret_jint cproxy_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfLong_2(jint a0);
extern ret_jint cproxy_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfDouble_2(jint a0);
extern ret_jint cproxy_s_java_lang_System_console();
// 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
