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

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

static jclass class_java_lang_Runnable;
static jmethodID m_java_lang_Runnable_run;
static jclass class_java_io_InputStream;
static jmethodID m_java_io_InputStream_read__;
static jmethodID m_java_io_InputStream_read___3B;
static jmethodID m_java_io_InputStream_read___3BII;
static jmethodID m_java_io_InputStream_toString;
static jclass class_java_util_concurrent_Future;
static jmethodID m_java_util_concurrent_Future_get__;
static jmethodID m_java_util_concurrent_Future_get__JLjava_util_concurrent_TimeUnit_2;
static jclass class_java_lang_Object;
static jmethodID m_java_lang_Object_toString;
static jclass class_java_util_concurrent_TimeUnit;
static jmethodID m_java_util_concurrent_TimeUnit_toString;
static jclass class_java_util_Spliterators;
static jmethodID m_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_2;
static jmethodID m_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfInt_2;
static jmethodID m_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfLong_2;
static jmethodID m_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfDouble_2;
static jmethodID m_java_util_Spliterators_toString;
ret_jint cproxy_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_2(jint a0) {
	JNIEnv *env = go_seq_push_local_frame(1);
	jobject _a0 = go_seq_from_refnum(env, a0, NULL, NULL);
	jobject res = (*env)->CallStaticObjectMethod(env, class_java_util_Spliterators, m_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_2, _a0);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = NULL;
	}
	jint _res = go_seq_to_refnum(env, res);
	go_seq_pop_local_frame(env);
	ret_jint __res = {_res, _exc_ref};
	return __res;
}

ret_jint cproxy_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfInt_2(jint a0) {
	JNIEnv *env = go_seq_push_local_frame(1);
	jobject _a0 = go_seq_from_refnum(env, a0, NULL, NULL);
	jobject res = (*env)->CallStaticObjectMethod(env, class_java_util_Spliterators, m_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfInt_2, _a0);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = NULL;
	}
	jint _res = go_seq_to_refnum(env, res);
	go_seq_pop_local_frame(env);
	ret_jint __res = {_res, _exc_ref};
	return __res;
}

ret_jint cproxy_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfLong_2(jint a0) {
	JNIEnv *env = go_seq_push_local_frame(1);
	jobject _a0 = go_seq_from_refnum(env, a0, NULL, NULL);
	jobject res = (*env)->CallStaticObjectMethod(env, class_java_util_Spliterators, m_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfLong_2, _a0);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = NULL;
	}
	jint _res = go_seq_to_refnum(env, res);
	go_seq_pop_local_frame(env);
	ret_jint __res = {_res, _exc_ref};
	return __res;
}

ret_jint cproxy_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfDouble_2(jint a0) {
	JNIEnv *env = go_seq_push_local_frame(1);
	jobject _a0 = go_seq_from_refnum(env, a0, NULL, NULL);
	jobject res = (*env)->CallStaticObjectMethod(env, class_java_util_Spliterators, m_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfDouble_2, _a0);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = NULL;
	}
	jint _res = go_seq_to_refnum(env, res);
	go_seq_pop_local_frame(env);
	ret_jint __res = {_res, _exc_ref};
	return __res;
}

static jclass class_java_lang_System;
static jmethodID m_s_java_lang_System_console;
static jmethodID m_java_lang_System_toString;
ret_jint cproxy_s_java_lang_System_console() {
	JNIEnv *env = go_seq_push_local_frame(0);
	jobject res = (*env)->CallStaticObjectMethod(env, class_java_lang_System, m_s_java_lang_System_console);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = NULL;
	}
	jint _res = go_seq_to_refnum(env, res);
	go_seq_pop_local_frame(env);
	ret_jint __res = {_res, _exc_ref};
	return __res;
}

static jclass class_java_Future;
static jclass sclass_java_Future;
static jmethodID m_java_Future_get__;
static jmethodID sm_java_Future_get__;
static jmethodID m_java_Future_get__JLjava_util_concurrent_TimeUnit_2;
static jmethodID sm_java_Future_get__JLjava_util_concurrent_TimeUnit_2;
static jclass class_java_InputStream;
static jclass sclass_java_InputStream;
static jmethodID m_java_InputStream_read__;
static jmethodID sm_java_InputStream_read__;
static jmethodID m_java_InputStream_read___3B;
static jmethodID sm_java_InputStream_read___3B;
static jmethodID m_java_InputStream_read___3BII;
static jmethodID sm_java_InputStream_read___3BII;
static jmethodID m_java_InputStream_toString;
static jmethodID sm_java_InputStream_toString;
static jclass class_java_Object;
static jclass sclass_java_Object;
static jmethodID m_java_Object_toString;
static jmethodID sm_java_Object_toString;
static jclass class_java_Runnable;
static jclass sclass_java_Runnable;
static jmethodID m_java_Runnable_run;
static jmethodID sm_java_Runnable_run;
static jclass class_java_util_Iterator;
static jclass class_java_util_Spliterator;
static jclass class_java_util_PrimitiveIterator_OfInt;
static jclass class_java_util_Spliterator_OfInt;
static jclass class_java_util_PrimitiveIterator_OfLong;
static jclass class_java_util_Spliterator_OfLong;
static jclass class_java_util_PrimitiveIterator_OfDouble;
static jclass class_java_util_Spliterator_OfDouble;
static jclass class_java_io_Console;
static jmethodID m_java_io_Console_flush;
static jmethodID m_java_io_Console_toString;

void init_proxies() {
	JNIEnv *env = go_seq_push_local_frame(20);
	jclass clazz;
	clazz = go_seq_find_class("java/lang/Runnable");
	if (clazz != NULL) {
		class_java_lang_Runnable = (*env)->NewGlobalRef(env, clazz);
		m_java_lang_Runnable_run = go_seq_get_method_id(clazz, "run", "()V");
	}
	clazz = go_seq_find_class("java/io/InputStream");
	if (clazz != NULL) {
		class_java_io_InputStream = (*env)->NewGlobalRef(env, clazz);
		m_java_io_InputStream_read__ = go_seq_get_method_id(clazz, "read", "()I");
		m_java_io_InputStream_read___3B = go_seq_get_method_id(clazz, "read", "([B)I");
		m_java_io_InputStream_read___3BII = go_seq_get_method_id(clazz, "read", "([BII)I");
		m_java_io_InputStream_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
	}
	clazz = go_seq_find_class("java/util/concurrent/Future");
	if (clazz != NULL) {
		class_java_util_concurrent_Future = (*env)->NewGlobalRef(env, clazz);
		m_java_util_concurrent_Future_get__ = go_seq_get_method_id(clazz, "get", "()Ljava/lang/Object;");
		m_java_util_concurrent_Future_get__JLjava_util_concurrent_TimeUnit_2 = go_seq_get_method_id(clazz, "get", "(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;");
	}
	clazz = go_seq_find_class("java/lang/Object");
	if (clazz != NULL) {
		class_java_lang_Object = (*env)->NewGlobalRef(env, clazz);
		m_java_lang_Object_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
	}
	clazz = go_seq_find_class("java/util/concurrent/TimeUnit");
	if (clazz != NULL) {
		class_java_util_concurrent_TimeUnit = (*env)->NewGlobalRef(env, clazz);
		m_java_util_concurrent_TimeUnit_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
	}
	clazz = go_seq_find_class("java/util/Spliterators");
	if (clazz != NULL) {
		class_java_util_Spliterators = (*env)->NewGlobalRef(env, clazz);
		m_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_2 = go_seq_get_static_method_id(clazz, "iterator", "(Ljava/util/Spliterator;)Ljava/util/Iterator;");
		m_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfInt_2 = go_seq_get_static_method_id(clazz, "iterator", "(Ljava/util/Spliterator$OfInt;)Ljava/util/PrimitiveIterator$OfInt;");
		m_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfLong_2 = go_seq_get_static_method_id(clazz, "iterator", "(Ljava/util/Spliterator$OfLong;)Ljava/util/PrimitiveIterator$OfLong;");
		m_s_java_util_Spliterators_iterator__Ljava_util_Spliterator_00024OfDouble_2 = go_seq_get_static_method_id(clazz, "iterator", "(Ljava/util/Spliterator$OfDouble;)Ljava/util/PrimitiveIterator$OfDouble;");
		m_java_util_Spliterators_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
	}
	clazz = go_seq_find_class("java/lang/System");
	if (clazz != NULL) {
		class_java_lang_System = (*env)->NewGlobalRef(env, clazz);
		m_s_java_lang_System_console = go_seq_get_static_method_id(clazz, "console", "()Ljava/io/Console;");
		m_java_lang_System_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
	}
	clazz = go_seq_find_class("java/Future");
	if (clazz != NULL) {
		class_java_Future = (*env)->NewGlobalRef(env, clazz);
		sclass_java_Future = (*env)->GetSuperclass(env, clazz);
		sclass_java_Future = (*env)->NewGlobalRef(env, sclass_java_Future);
		m_java_Future_get__ = go_seq_get_method_id(clazz, "get", "()Ljava/lang/Object;");
		sm_java_Future_get__ = go_seq_get_method_id(sclass_java_Future, "get", "()Ljava/lang/Object;");
		m_java_Future_get__JLjava_util_concurrent_TimeUnit_2 = go_seq_get_method_id(clazz, "get", "(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;");
		sm_java_Future_get__JLjava_util_concurrent_TimeUnit_2 = go_seq_get_method_id(sclass_java_Future, "get", "(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;");
	}
	clazz = go_seq_find_class("java/InputStream");
	if (clazz != NULL) {
		class_java_InputStream = (*env)->NewGlobalRef(env, clazz);
		sclass_java_InputStream = (*env)->GetSuperclass(env, clazz);
		sclass_java_InputStream = (*env)->NewGlobalRef(env, sclass_java_InputStream);
		m_java_InputStream_read__ = go_seq_get_method_id(clazz, "read", "()I");
		sm_java_InputStream_read__ = go_seq_get_method_id(sclass_java_InputStream, "read", "()I");
		m_java_InputStream_read___3B = go_seq_get_method_id(clazz, "read", "([B)I");
		sm_java_InputStream_read___3B = go_seq_get_method_id(sclass_java_InputStream, "read", "([B)I");
		m_java_InputStream_read___3BII = go_seq_get_method_id(clazz, "read", "([BII)I");
		sm_java_InputStream_read___3BII = go_seq_get_method_id(sclass_java_InputStream, "read", "([BII)I");
		m_java_InputStream_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
		sm_java_InputStream_toString = go_seq_get_method_id(sclass_java_InputStream, "toString", "()Ljava/lang/String;");
	}
	clazz = go_seq_find_class("java/Object");
	if (clazz != NULL) {
		class_java_Object = (*env)->NewGlobalRef(env, clazz);
		sclass_java_Object = (*env)->GetSuperclass(env, clazz);
		sclass_java_Object = (*env)->NewGlobalRef(env, sclass_java_Object);
		m_java_Object_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
		sm_java_Object_toString = go_seq_get_method_id(sclass_java_Object, "toString", "()Ljava/lang/String;");
	}
	clazz = go_seq_find_class("java/Runnable");
	if (clazz != NULL) {
		class_java_Runnable = (*env)->NewGlobalRef(env, clazz);
		sclass_java_Runnable = (*env)->GetSuperclass(env, clazz);
		sclass_java_Runnable = (*env)->NewGlobalRef(env, sclass_java_Runnable);
		m_java_Runnable_run = go_seq_get_method_id(clazz, "run", "()V");
		sm_java_Runnable_run = go_seq_get_method_id(sclass_java_Runnable, "run", "()V");
	}
	clazz = go_seq_find_class("java/util/Iterator");
	if (clazz != NULL) {
		class_java_util_Iterator = (*env)->NewGlobalRef(env, clazz);
	}
	clazz = go_seq_find_class("java/util/Spliterator");
	if (clazz != NULL) {
		class_java_util_Spliterator = (*env)->NewGlobalRef(env, clazz);
	}
	clazz = go_seq_find_class("java/util/PrimitiveIterator$OfInt");
	if (clazz != NULL) {
		class_java_util_PrimitiveIterator_OfInt = (*env)->NewGlobalRef(env, clazz);
	}
	clazz = go_seq_find_class("java/util/Spliterator$OfInt");
	if (clazz != NULL) {
		class_java_util_Spliterator_OfInt = (*env)->NewGlobalRef(env, clazz);
	}
	clazz = go_seq_find_class("java/util/PrimitiveIterator$OfLong");
	if (clazz != NULL) {
		class_java_util_PrimitiveIterator_OfLong = (*env)->NewGlobalRef(env, clazz);
	}
	clazz = go_seq_find_class("java/util/Spliterator$OfLong");
	if (clazz != NULL) {
		class_java_util_Spliterator_OfLong = (*env)->NewGlobalRef(env, clazz);
	}
	clazz = go_seq_find_class("java/util/PrimitiveIterator$OfDouble");
	if (clazz != NULL) {
		class_java_util_PrimitiveIterator_OfDouble = (*env)->NewGlobalRef(env, clazz);
	}
	clazz = go_seq_find_class("java/util/Spliterator$OfDouble");
	if (clazz != NULL) {
		class_java_util_Spliterator_OfDouble = (*env)->NewGlobalRef(env, clazz);
	}
	clazz = go_seq_find_class("java/io/Console");
	if (clazz != NULL) {
		class_java_io_Console = (*env)->NewGlobalRef(env, clazz);
		m_java_io_Console_flush = go_seq_get_method_id(clazz, "flush", "()V");
		m_java_io_Console_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
	}
	go_seq_pop_local_frame(env);
}

jint cproxy_java_lang_Runnable_run(jint this) {
	JNIEnv *env = go_seq_push_local_frame(1);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	(*env)->CallVoidMethod(env, _this, m_java_lang_Runnable_run);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	go_seq_pop_local_frame(env);
	return _exc_ref;
}

ret_jint cproxy_java_io_InputStream_read__(jint this) {
	JNIEnv *env = go_seq_push_local_frame(1);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jint res = (*env)->CallIntMethod(env, _this, m_java_io_InputStream_read__);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = 0;
	}
	jint _res = res;
	go_seq_pop_local_frame(env);
	ret_jint __res = {_res, _exc_ref};
	return __res;
}

ret_jint cproxy_java_io_InputStream_read___3B(jint this, nbyteslice a0) {
	JNIEnv *env = go_seq_push_local_frame(2);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jbyteArray _a0 = go_seq_to_java_bytearray(env, a0, 0);
	jint res = (*env)->CallIntMethod(env, _this, m_java_io_InputStream_read___3B, _a0);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = 0;
	}
	jint _res = res;
	go_seq_pop_local_frame(env);
	ret_jint __res = {_res, _exc_ref};
	return __res;
}

ret_jint cproxy_java_io_InputStream_read___3BII(jint this, nbyteslice a0, jint a1, jint a2) {
	JNIEnv *env = go_seq_push_local_frame(4);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jbyteArray _a0 = go_seq_to_java_bytearray(env, a0, 0);
	jint _a1 = a1;
	jint _a2 = a2;
	jint res = (*env)->CallIntMethod(env, _this, m_java_io_InputStream_read___3BII, _a0, _a1, _a2);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = 0;
	}
	jint _res = res;
	go_seq_pop_local_frame(env);
	ret_jint __res = {_res, _exc_ref};
	return __res;
}

ret_nstring cproxy_java_io_InputStream_toString(jint this) {
	JNIEnv *env = go_seq_push_local_frame(1);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jstring res = (*env)->CallObjectMethod(env, _this, m_java_io_InputStream_toString);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = NULL;
	}
	nstring _res = go_seq_from_java_string(env, res);
	go_seq_pop_local_frame(env);
	ret_nstring __res = {_res, _exc_ref};
	return __res;
}

ret_jint cproxy_java_util_concurrent_Future_get__(jint this) {
	JNIEnv *env = go_seq_push_local_frame(1);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jobject res = (*env)->CallObjectMethod(env, _this, m_java_util_concurrent_Future_get__);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = NULL;
	}
	jint _res = go_seq_to_refnum(env, res);
	go_seq_pop_local_frame(env);
	ret_jint __res = {_res, _exc_ref};
	return __res;
}

ret_jint cproxy_java_util_concurrent_Future_get__JLjava_util_concurrent_TimeUnit_2(jint this, jlong a0, jint a1) {
	JNIEnv *env = go_seq_push_local_frame(3);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jlong _a0 = a0;
	jobject _a1 = go_seq_from_refnum(env, a1, NULL, NULL);
	jobject res = (*env)->CallObjectMethod(env, _this, m_java_util_concurrent_Future_get__JLjava_util_concurrent_TimeUnit_2, _a0, _a1);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = NULL;
	}
	jint _res = go_seq_to_refnum(env, res);
	go_seq_pop_local_frame(env);
	ret_jint __res = {_res, _exc_ref};
	return __res;
}

ret_nstring cproxy_java_lang_Object_toString(jint this) {
	JNIEnv *env = go_seq_push_local_frame(1);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jstring res = (*env)->CallObjectMethod(env, _this, m_java_lang_Object_toString);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = NULL;
	}
	nstring _res = go_seq_from_java_string(env, res);
	go_seq_pop_local_frame(env);
	ret_nstring __res = {_res, _exc_ref};
	return __res;
}

ret_nstring cproxy_java_util_concurrent_TimeUnit_toString(jint this) {
	JNIEnv *env = go_seq_push_local_frame(1);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jstring res = (*env)->CallObjectMethod(env, _this, m_java_util_concurrent_TimeUnit_toString);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = NULL;
	}
	nstring _res = go_seq_from_java_string(env, res);
	go_seq_pop_local_frame(env);
	ret_nstring __res = {_res, _exc_ref};
	return __res;
}

ret_nstring cproxy_java_util_Spliterators_toString(jint this) {
	JNIEnv *env = go_seq_push_local_frame(1);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jstring res = (*env)->CallObjectMethod(env, _this, m_java_util_Spliterators_toString);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = NULL;
	}
	nstring _res = go_seq_from_java_string(env, res);
	go_seq_pop_local_frame(env);
	ret_nstring __res = {_res, _exc_ref};
	return __res;
}

ret_nstring cproxy_java_lang_System_toString(jint this) {
	JNIEnv *env = go_seq_push_local_frame(1);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jstring res = (*env)->CallObjectMethod(env, _this, m_java_lang_System_toString);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = NULL;
	}
	nstring _res = go_seq_from_java_string(env, res);
	go_seq_pop_local_frame(env);
	ret_nstring __res = {_res, _exc_ref};
	return __res;
}

ret_jint cproxy_java_Future_get__(jint this) {
	JNIEnv *env = go_seq_push_local_frame(1);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jobject res = (*env)->CallObjectMethod(env, _this, m_java_Future_get__);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = NULL;
	}
	jint _res = go_seq_to_refnum(env, res);
	go_seq_pop_local_frame(env);
	ret_jint __res = {_res, _exc_ref};
	return __res;
}

ret_jint csuper_java_Future_get__(jint this) {
	JNIEnv *env = go_seq_push_local_frame(1);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jobject res = (*env)->CallNonvirtualObjectMethod(env, _this, sclass_java_Future, sm_java_Future_get__);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = NULL;
	}
	jint _res = go_seq_to_refnum(env, res);
	go_seq_pop_local_frame(env);
	ret_jint __res = {_res, _exc_ref};
	return __res;
}

ret_jint cproxy_java_Future_get__JLjava_util_concurrent_TimeUnit_2(jint this, jlong a0, jint a1) {
	JNIEnv *env = go_seq_push_local_frame(3);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jlong _a0 = a0;
	jobject _a1 = go_seq_from_refnum(env, a1, NULL, NULL);
	jobject res = (*env)->CallObjectMethod(env, _this, m_java_Future_get__JLjava_util_concurrent_TimeUnit_2, _a0, _a1);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = NULL;
	}
	jint _res = go_seq_to_refnum(env, res);
	go_seq_pop_local_frame(env);
	ret_jint __res = {_res, _exc_ref};
	return __res;
}

ret_jint csuper_java_Future_get__JLjava_util_concurrent_TimeUnit_2(jint this, jlong a0, jint a1) {
	JNIEnv *env = go_seq_push_local_frame(3);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jlong _a0 = a0;
	jobject _a1 = go_seq_from_refnum(env, a1, NULL, NULL);
	jobject res = (*env)->CallNonvirtualObjectMethod(env, _this, sclass_java_Future, sm_java_Future_get__JLjava_util_concurrent_TimeUnit_2, _a0, _a1);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = NULL;
	}
	jint _res = go_seq_to_refnum(env, res);
	go_seq_pop_local_frame(env);
	ret_jint __res = {_res, _exc_ref};
	return __res;
}

ret_jint cproxy_java_InputStream_read__(jint this) {
	JNIEnv *env = go_seq_push_local_frame(1);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jint res = (*env)->CallIntMethod(env, _this, m_java_InputStream_read__);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = 0;
	}
	jint _res = res;
	go_seq_pop_local_frame(env);
	ret_jint __res = {_res, _exc_ref};
	return __res;
}

ret_jint csuper_java_InputStream_read__(jint this) {
	JNIEnv *env = go_seq_push_local_frame(1);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jint res = (*env)->CallNonvirtualIntMethod(env, _this, sclass_java_InputStream, sm_java_InputStream_read__);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = 0;
	}
	jint _res = res;
	go_seq_pop_local_frame(env);
	ret_jint __res = {_res, _exc_ref};
	return __res;
}

ret_jint cproxy_java_InputStream_read___3B(jint this, nbyteslice a0) {
	JNIEnv *env = go_seq_push_local_frame(2);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jbyteArray _a0 = go_seq_to_java_bytearray(env, a0, 0);
	jint res = (*env)->CallIntMethod(env, _this, m_java_InputStream_read___3B, _a0);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = 0;
	}
	jint _res = res;
	go_seq_pop_local_frame(env);
	ret_jint __res = {_res, _exc_ref};
	return __res;
}

ret_jint csuper_java_InputStream_read___3B(jint this, nbyteslice a0) {
	JNIEnv *env = go_seq_push_local_frame(2);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jbyteArray _a0 = go_seq_to_java_bytearray(env, a0, 0);
	jint res = (*env)->CallNonvirtualIntMethod(env, _this, sclass_java_InputStream, sm_java_InputStream_read___3B, _a0);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = 0;
	}
	jint _res = res;
	go_seq_pop_local_frame(env);
	ret_jint __res = {_res, _exc_ref};
	return __res;
}

ret_jint cproxy_java_InputStream_read___3BII(jint this, nbyteslice a0, jint a1, jint a2) {
	JNIEnv *env = go_seq_push_local_frame(4);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jbyteArray _a0 = go_seq_to_java_bytearray(env, a0, 0);
	jint _a1 = a1;
	jint _a2 = a2;
	jint res = (*env)->CallIntMethod(env, _this, m_java_InputStream_read___3BII, _a0, _a1, _a2);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = 0;
	}
	jint _res = res;
	go_seq_pop_local_frame(env);
	ret_jint __res = {_res, _exc_ref};
	return __res;
}

ret_jint csuper_java_InputStream_read___3BII(jint this, nbyteslice a0, jint a1, jint a2) {
	JNIEnv *env = go_seq_push_local_frame(4);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jbyteArray _a0 = go_seq_to_java_bytearray(env, a0, 0);
	jint _a1 = a1;
	jint _a2 = a2;
	jint res = (*env)->CallNonvirtualIntMethod(env, _this, sclass_java_InputStream, sm_java_InputStream_read___3BII, _a0, _a1, _a2);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = 0;
	}
	jint _res = res;
	go_seq_pop_local_frame(env);
	ret_jint __res = {_res, _exc_ref};
	return __res;
}

ret_nstring cproxy_java_InputStream_toString(jint this) {
	JNIEnv *env = go_seq_push_local_frame(1);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jstring res = (*env)->CallObjectMethod(env, _this, m_java_InputStream_toString);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = NULL;
	}
	nstring _res = go_seq_from_java_string(env, res);
	go_seq_pop_local_frame(env);
	ret_nstring __res = {_res, _exc_ref};
	return __res;
}

ret_nstring csuper_java_InputStream_toString(jint this) {
	JNIEnv *env = go_seq_push_local_frame(1);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jstring res = (*env)->CallNonvirtualObjectMethod(env, _this, sclass_java_InputStream, sm_java_InputStream_toString);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = NULL;
	}
	nstring _res = go_seq_from_java_string(env, res);
	go_seq_pop_local_frame(env);
	ret_nstring __res = {_res, _exc_ref};
	return __res;
}

ret_nstring cproxy_java_Object_toString(jint this) {
	JNIEnv *env = go_seq_push_local_frame(1);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jstring res = (*env)->CallObjectMethod(env, _this, m_java_Object_toString);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = NULL;
	}
	nstring _res = go_seq_from_java_string(env, res);
	go_seq_pop_local_frame(env);
	ret_nstring __res = {_res, _exc_ref};
	return __res;
}

ret_nstring csuper_java_Object_toString(jint this) {
	JNIEnv *env = go_seq_push_local_frame(1);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jstring res = (*env)->CallNonvirtualObjectMethod(env, _this, sclass_java_Object, sm_java_Object_toString);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = NULL;
	}
	nstring _res = go_seq_from_java_string(env, res);
	go_seq_pop_local_frame(env);
	ret_nstring __res = {_res, _exc_ref};
	return __res;
}

jint cproxy_java_Runnable_run(jint this) {
	JNIEnv *env = go_seq_push_local_frame(1);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	(*env)->CallVoidMethod(env, _this, m_java_Runnable_run);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	go_seq_pop_local_frame(env);
	return _exc_ref;
}

jint csuper_java_Runnable_run(jint this) {
	JNIEnv *env = go_seq_push_local_frame(1);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	(*env)->CallNonvirtualVoidMethod(env, _this, sclass_java_Runnable, sm_java_Runnable_run);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	go_seq_pop_local_frame(env);
	return _exc_ref;
}

jint cproxy_java_io_Console_flush(jint this) {
	JNIEnv *env = go_seq_push_local_frame(1);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	(*env)->CallVoidMethod(env, _this, m_java_io_Console_flush);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	go_seq_pop_local_frame(env);
	return _exc_ref;
}

ret_nstring cproxy_java_io_Console_toString(jint this) {
	JNIEnv *env = go_seq_push_local_frame(1);
	// Must be a Java object
	jobject _this = go_seq_from_refnum(env, this, NULL, NULL);
	jstring res = (*env)->CallObjectMethod(env, _this, m_java_io_Console_toString);
	jobject _exc = go_seq_get_exception(env);
	int32_t _exc_ref = go_seq_to_refnum(env, _exc);
	if (_exc != NULL) {
		res = NULL;
	}
	nstring _res = go_seq_from_java_string(env, res);
	go_seq_pop_local_frame(env);
	ret_nstring __res = {_res, _exc_ref};
	return __res;
}

// JNI functions for the Go <=> Java bridge.
//   gobind -lang=java classes
//
// File is generated by gobind. Do not edit.

#include <android/log.h>
#include <stdint.h>
#include "seq.h"
#include "_cgo_export.h"
#include "java.h"

jclass proxy_class_java_Future;
jmethodID proxy_class_java_Future_cons;
jclass proxy_class_java_InputStream;
jmethodID proxy_class_java_InputStream_cons;
jclass proxy_class_java_Object;
jmethodID proxy_class_java_Object_cons;
jclass proxy_class_java_Runnable;
jmethodID proxy_class_java_Runnable_cons;

JNIEXPORT void JNICALL
Java_java_Java__1init(JNIEnv *env, jclass _unused) {
    jclass clazz;
    clazz = (*env)->FindClass(env, "java/Future");
    proxy_class_java_Future = (*env)->NewGlobalRef(env, clazz);
    proxy_class_java_Future_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
    clazz = (*env)->FindClass(env, "java/Object");
    proxy_class_java_Object = (*env)->NewGlobalRef(env, clazz);
    proxy_class_java_Object_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
    clazz = (*env)->FindClass(env, "java/Runnable");
    proxy_class_java_Runnable = (*env)->NewGlobalRef(env, clazz);
    proxy_class_java_Runnable_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
}

JNIEXPORT jobject JNICALL
Java_java_Java_newInputStream(JNIEnv* env, jclass _clazz) {
    int32_t r0 = proxyjava__NewInputStream();
    jobject _r0 = go_seq_from_refnum(env, r0, proxy_class_java_InputStream, proxy_class_java_InputStream_cons);
    return _r0;
}

JNIEXPORT jobject JNICALL
Java_java_Future__1_1New(JNIEnv *env, jclass clazz) {
    int32_t refnum = new_java_Future();
    return go_seq_from_refnum(env, refnum, NULL, NULL);
}

JNIEXPORT jobject JNICALL
Java_java_Future_get__(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    struct proxyjava_Future_Get_return res = proxyjava_Future_Get(o);
    jobject _r0 = go_seq_from_refnum(env, res.r0, NULL, NULL);
    jobject _r1 = go_seq_from_refnum(env, res.r1, proxy_class__error, proxy_class__error_cons);
    go_seq_maybe_throw_exception(env, _r1);
    return _r0;
}

JNIEXPORT jobject JNICALL
Java_java_Future_get__JLjava_util_concurrent_TimeUnit_2(JNIEnv* env, jobject __this__, jlong p0, jobject p1) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    int64_t _p0 = (int64_t)p0;
    int32_t _p1 = go_seq_to_refnum(env, p1);
    struct proxyjava_Future_Get__return res = proxyjava_Future_Get_(o, _p0, _p1);
    jobject _r0 = go_seq_from_refnum(env, res.r0, NULL, NULL);
    jobject _r1 = go_seq_from_refnum(env, res.r1, proxy_class__error, proxy_class__error_cons);
    go_seq_maybe_throw_exception(env, _r1);
    return _r0;
}

JNIEXPORT void JNICALL
Java_java_Future_setFuture(JNIEnv *env, jobject this, jobject v) {
    int32_t o = go_seq_to_refnum_go(env, this);
    int32_t _v = go_seq_to_refnum(env, v);
    proxyjava_Future_Future_Set(o, _v);
}

JNIEXPORT jobject JNICALL
Java_java_Future_getFuture(JNIEnv *env, jobject this) {
    int32_t o = go_seq_to_refnum_go(env, this);
    int32_t r0 = proxyjava_Future_Future_Get(o);
    jobject _r0 = go_seq_from_refnum(env, r0, NULL, NULL);
    return _r0;
}

JNIEXPORT jobject JNICALL
Java_java_InputStream__1_1NewInputStream(JNIEnv *env, jclass clazz) {
    int32_t refnum = proxyjava__NewInputStream();
    return go_seq_from_refnum(env, refnum, NULL, NULL);
}

JNIEXPORT jint JNICALL
Java_java_InputStream_read__(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    struct proxyjava_InputStream_Read_return res = proxyjava_InputStream_Read(o);
    jint _r0 = (jint)res.r0;
    jobject _r1 = go_seq_from_refnum(env, res.r1, proxy_class__error, proxy_class__error_cons);
    go_seq_maybe_throw_exception(env, _r1);
    return _r0;
}

JNIEXPORT void JNICALL
Java_java_InputStream_setInputStream(JNIEnv *env, jobject this, jobject v) {
    int32_t o = go_seq_to_refnum_go(env, this);
    int32_t _v = go_seq_to_refnum(env, v);
    proxyjava_InputStream_InputStream_Set(o, _v);
}

JNIEXPORT jobject JNICALL
Java_java_InputStream_getInputStream(JNIEnv *env, jobject this) {
    int32_t o = go_seq_to_refnum_go(env, this);
    int32_t r0 = proxyjava_InputStream_InputStream_Get(o);
    jobject _r0 = go_seq_from_refnum(env, r0, NULL, NULL);
    return _r0;
}

JNIEXPORT jobject JNICALL
Java_java_Object__1_1New(JNIEnv *env, jclass clazz) {
    int32_t refnum = new_java_Object();
    return go_seq_from_refnum(env, refnum, NULL, NULL);
}

JNIEXPORT void JNICALL
Java_java_Object_setObject(JNIEnv *env, jobject this, jobject v) {
    int32_t o = go_seq_to_refnum_go(env, this);
    int32_t _v = go_seq_to_refnum(env, v);
    proxyjava_Object_Object_Set(o, _v);
}

JNIEXPORT jobject JNICALL
Java_java_Object_getObject(JNIEnv *env, jobject this) {
    int32_t o = go_seq_to_refnum_go(env, this);
    int32_t r0 = proxyjava_Object_Object_Get(o);
    jobject _r0 = go_seq_from_refnum(env, r0, NULL, NULL);
    return _r0;
}

JNIEXPORT jobject JNICALL
Java_java_Runnable__1_1New(JNIEnv *env, jclass clazz) {
    int32_t refnum = new_java_Runnable();
    return go_seq_from_refnum(env, refnum, NULL, NULL);
}

JNIEXPORT void JNICALL
Java_java_Runnable_run(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    int32_t _this_ = go_seq_to_refnum(env, __this__);
    proxyjava_Runnable_Run(o, _this_);
}

JNIEXPORT void JNICALL
Java_java_Runnable_setRunnable(JNIEnv *env, jobject this, jobject v) {
    int32_t o = go_seq_to_refnum_go(env, this);
    int32_t _v = go_seq_to_refnum(env, v);
    proxyjava_Runnable_Runnable_Set(o, _v);
}

JNIEXPORT jobject JNICALL
Java_java_Runnable_getRunnable(JNIEnv *env, jobject this) {
    int32_t o = go_seq_to_refnum_go(env, this);
    int32_t r0 = proxyjava_Runnable_Runnable_Get(o);
    jobject _r0 = go_seq_from_refnum(env, r0, NULL, NULL);
    return _r0;
}

