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

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

static jclass class_java_lang_Float;
static jmethodID m_java_lang_Float_toString;
static jclass class_java_lang_Long;
static jmethodID m_java_lang_Long_toString;
static jclass class_java_lang_Object;
static jmethodID m_java_lang_Object_toString;
static jclass class_java_lang_Runnable;
static jclass class_java_lang_Character;
static jmethodID m_java_lang_Character_toString;
static jclass class_java_lang_Character_Subset;
static jmethodID m_java_lang_Character_Subset_toString;

void init_proxies() {
	JNIEnv *env = go_seq_push_local_frame(6);
	jclass clazz;
	clazz = go_seq_find_class("java/lang/Float");
	if (clazz != NULL) {
		class_java_lang_Float = (*env)->NewGlobalRef(env, clazz);
		m_java_lang_Float_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
	}
	clazz = go_seq_find_class("java/lang/Long");
	if (clazz != NULL) {
		class_java_lang_Long = (*env)->NewGlobalRef(env, clazz);
		m_java_lang_Long_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
	}
	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/lang/Runnable");
	if (clazz != NULL) {
		class_java_lang_Runnable = (*env)->NewGlobalRef(env, clazz);
	}
	clazz = go_seq_find_class("java/lang/Character");
	if (clazz != NULL) {
		class_java_lang_Character = (*env)->NewGlobalRef(env, clazz);
		m_java_lang_Character_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
	}
	clazz = go_seq_find_class("java/lang/Character$Subset");
	if (clazz != NULL) {
		class_java_lang_Character_Subset = (*env)->NewGlobalRef(env, clazz);
		m_java_lang_Character_Subset_toString = go_seq_get_method_id(clazz, "toString", "()Ljava/lang/String;");
	}
	go_seq_pop_local_frame(env);
}

ret_nstring cproxy_java_lang_Float_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_Float_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_Long_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_Long_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_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_lang_Character_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_Character_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_Character_Subset_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_Character_Subset_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 java
//
// 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_F;
jmethodID proxy_class_java_F_cons;
static jmethodID mid_F_ToString;
jclass proxy_class_java_L;
jmethodID proxy_class_java_L_cons;
static jmethodID mid_L_ToString;
jclass proxy_class_java_O;
jmethodID proxy_class_java_O_cons;
static jmethodID mid_O_ToString;
jclass proxy_class_java_R;
jmethodID proxy_class_java_R_cons;
jclass proxy_class_java_S;
jmethodID proxy_class_java_S_cons;
static jmethodID mid_S_ToString;

JNIEXPORT void JNICALL
Java_java_Java__1init(JNIEnv *env, jclass _unused) {
    jclass clazz;
    clazz = (*env)->FindClass(env, "java/Java$proxyF");
    proxy_class_java_F = (*env)->NewGlobalRef(env, clazz);
    proxy_class_java_F_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
    clazz = (*env)->FindClass(env, "java/F");
    mid_F_ToString = (*env)->GetMethodID(env, clazz, "toString", "()Ljava/lang/String;");
    
    clazz = (*env)->FindClass(env, "java/Java$proxyL");
    proxy_class_java_L = (*env)->NewGlobalRef(env, clazz);
    proxy_class_java_L_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
    clazz = (*env)->FindClass(env, "java/L");
    mid_L_ToString = (*env)->GetMethodID(env, clazz, "toString", "()Ljava/lang/String;");
    
    clazz = (*env)->FindClass(env, "java/Java$proxyO");
    proxy_class_java_O = (*env)->NewGlobalRef(env, clazz);
    proxy_class_java_O_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
    clazz = (*env)->FindClass(env, "java/O");
    mid_O_ToString = (*env)->GetMethodID(env, clazz, "toString", "()Ljava/lang/String;");
    
    clazz = (*env)->FindClass(env, "java/Java$proxyR");
    proxy_class_java_R = (*env)->NewGlobalRef(env, clazz);
    proxy_class_java_R_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
    clazz = (*env)->FindClass(env, "java/R");
    
    clazz = (*env)->FindClass(env, "java/Java$proxyS");
    proxy_class_java_S = (*env)->NewGlobalRef(env, clazz);
    proxy_class_java_S_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
    clazz = (*env)->FindClass(env, "java/S");
    mid_S_ToString = (*env)->GetMethodID(env, clazz, "toString", "()Ljava/lang/String;");
    
}

JNIEXPORT jstring JNICALL
Java_java_Java_00024proxyF_toString(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    nstring r0 = proxyjava_F_ToString(o);
    jstring _r0 = go_seq_to_java_string(env, r0);
    return _r0;
}

nstring cproxyjava_F_ToString(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_java_F, proxy_class_java_F_cons);
    jstring res = (*env)->CallObjectMethod(env, o, mid_F_ToString);
    nstring _res = go_seq_from_java_string(env, res);
    go_seq_pop_local_frame(env);
    return _res;
}

JNIEXPORT jstring JNICALL
Java_java_Java_00024proxyL_toString(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    nstring r0 = proxyjava_L_ToString(o);
    jstring _r0 = go_seq_to_java_string(env, r0);
    return _r0;
}

nstring cproxyjava_L_ToString(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_java_L, proxy_class_java_L_cons);
    jstring res = (*env)->CallObjectMethod(env, o, mid_L_ToString);
    nstring _res = go_seq_from_java_string(env, res);
    go_seq_pop_local_frame(env);
    return _res;
}

JNIEXPORT jstring JNICALL
Java_java_Java_00024proxyO_toString(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    nstring r0 = proxyjava_O_ToString(o);
    jstring _r0 = go_seq_to_java_string(env, r0);
    return _r0;
}

nstring cproxyjava_O_ToString(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_java_O, proxy_class_java_O_cons);
    jstring res = (*env)->CallObjectMethod(env, o, mid_O_ToString);
    nstring _res = go_seq_from_java_string(env, res);
    go_seq_pop_local_frame(env);
    return _res;
}

JNIEXPORT jstring JNICALL
Java_java_Java_00024proxyS_toString(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    nstring r0 = proxyjava_S_ToString(o);
    jstring _r0 = go_seq_to_java_string(env, r0);
    return _r0;
}

nstring cproxyjava_S_ToString(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_java_S, proxy_class_java_S_cons);
    jstring res = (*env)->CallObjectMethod(env, o, mid_S_ToString);
    nstring _res = go_seq_from_java_string(env, res);
    go_seq_pop_local_frame(env);
    return _res;
}

