// Code 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();
// Code generated by gobind. DO NOT EDIT.

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

#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
