// 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;
jclass proxy_class_java_R;
jmethodID proxy_class_java_R_cons;
jclass proxy_class_java_S;
jmethodID proxy_class_java_S_cons;

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

