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

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

static jclass class_java_lang_Float;
static jclass class_java_lang_Object;
static jclass class_java_lang_Runnable;
static jclass class_java_lang_Character;
static jclass class_java_lang_Character_Subset;

void init_proxies() {
	JNIEnv *env = go_seq_push_local_frame(5);
	jclass clazz;
	clazz = (*env)->FindClass(env, "java/lang/Float");
	class_java_lang_Float = (*env)->NewGlobalRef(env, clazz);
	clazz = (*env)->FindClass(env, "java/lang/Object");
	class_java_lang_Object = (*env)->NewGlobalRef(env, clazz);
	clazz = (*env)->FindClass(env, "java/lang/Runnable");
	class_java_lang_Runnable = (*env)->NewGlobalRef(env, clazz);
	clazz = (*env)->FindClass(env, "java/lang/Character");
	class_java_lang_Character = (*env)->NewGlobalRef(env, clazz);
	clazz = (*env)->FindClass(env, "java/lang/Character$Subset");
	class_java_lang_Character_Subset = (*env)->NewGlobalRef(env, clazz);
	go_seq_pop_local_frame(env);
}

// 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;
jclass proxy_class_java_O;
jmethodID proxy_class_java_O_cons;
// skipped method O.Super with unsupported parameter or return types

jclass proxy_class_java_R;
jmethodID proxy_class_java_R_cons;
jclass proxy_class_java_S;
jmethodID proxy_class_java_S_cons;
// skipped method S.Super with unsupported parameter or return types


JNIEXPORT void JNICALL
Java_go_java_Java__1init(JNIEnv *env, jclass _unused) {
    jclass clazz;
    clazz = (*env)->FindClass(env, "go/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, "go/java/F");
    
    clazz = (*env)->FindClass(env, "go/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, "go/java/O");
    // skipped method O.Super with unsupported parameter or return types
    
    
    clazz = (*env)->FindClass(env, "go/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, "go/java/R");
    
    clazz = (*env)->FindClass(env, "go/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, "go/java/S");
    // skipped method S.Super with unsupported parameter or return types
    
    
}

// skipped function O.Super with unsupported parameter or return types

// skipped method O with unsupported parameter or return types

// skipped function S.Super with unsupported parameter or return types

// skipped method S with unsupported parameter or return types

