// Code 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;
}

// Code generated by gobind. DO NOT EDIT.

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

#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>", "(I)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>", "(I)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>", "(I)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 jint JNICALL
Java_java_Future__1_1New(JNIEnv *env, jclass clazz) {
    return new_java_Future();
}

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 jint JNICALL
Java_java_InputStream__1_1NewInputStream(JNIEnv *env, jclass clazz) {
    int32_t refnum = proxyjava__NewInputStream();
    return refnum;
}

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 jint JNICALL
Java_java_Object__1_1New(JNIEnv *env, jclass clazz) {
    return new_java_Object();
}

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 jint JNICALL
Java_java_Runnable__1_1New(JNIEnv *env, jclass clazz) {
    return new_java_Runnable();
}

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;
}

