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

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

jclass proxy_class_keywords_KeywordCaller;
jmethodID proxy_class_keywords_KeywordCaller_cons;
static jmethodID mid_KeywordCaller_Abstract;
static jmethodID mid_KeywordCaller_Assert;
static jmethodID mid_KeywordCaller_Bool;
static jmethodID mid_KeywordCaller_Boolean;
static jmethodID mid_KeywordCaller_Break;
static jmethodID mid_KeywordCaller_Byte;
static jmethodID mid_KeywordCaller_Case;
static jmethodID mid_KeywordCaller_Catch;
static jmethodID mid_KeywordCaller_Char;
static jmethodID mid_KeywordCaller_Class;
static jmethodID mid_KeywordCaller_Const;
static jmethodID mid_KeywordCaller_Continue;
static jmethodID mid_KeywordCaller_Default;
static jmethodID mid_KeywordCaller_Do;
static jmethodID mid_KeywordCaller_Double;
static jmethodID mid_KeywordCaller_Else;
static jmethodID mid_KeywordCaller_Enum;
static jmethodID mid_KeywordCaller_Extends;
static jmethodID mid_KeywordCaller_False;
static jmethodID mid_KeywordCaller_Final;
static jmethodID mid_KeywordCaller_Finally;
static jmethodID mid_KeywordCaller_Float;
static jmethodID mid_KeywordCaller_For;
static jmethodID mid_KeywordCaller_Goto;
static jmethodID mid_KeywordCaller_If;
static jmethodID mid_KeywordCaller_Implements;
static jmethodID mid_KeywordCaller_Import;
static jmethodID mid_KeywordCaller_Instanceof;
static jmethodID mid_KeywordCaller_Int;
static jmethodID mid_KeywordCaller_Interface;
static jmethodID mid_KeywordCaller_Long;
static jmethodID mid_KeywordCaller_Native;
static jmethodID mid_KeywordCaller_New;
static jmethodID mid_KeywordCaller_Nil;
static jmethodID mid_KeywordCaller_Null;
static jmethodID mid_KeywordCaller_Package;
static jmethodID mid_KeywordCaller_Private;
static jmethodID mid_KeywordCaller_Protected;
static jmethodID mid_KeywordCaller_Public;
static jmethodID mid_KeywordCaller_Return;
static jmethodID mid_KeywordCaller_Short;
static jmethodID mid_KeywordCaller_Static;
static jmethodID mid_KeywordCaller_Strictfp;
static jmethodID mid_KeywordCaller_Super;
static jmethodID mid_KeywordCaller_Switch;
static jmethodID mid_KeywordCaller_Synchronized;
static jmethodID mid_KeywordCaller_This;
static jmethodID mid_KeywordCaller_Throw;
static jmethodID mid_KeywordCaller_Throws;
static jmethodID mid_KeywordCaller_Transient;
static jmethodID mid_KeywordCaller_True;
static jmethodID mid_KeywordCaller_Try;
static jmethodID mid_KeywordCaller_Void;
static jmethodID mid_KeywordCaller_Volatile;
static jmethodID mid_KeywordCaller_While;

JNIEXPORT void JNICALL
Java_keywords_Keywords__1init(JNIEnv *env, jclass _unused) {
    jclass clazz;
    clazz = (*env)->FindClass(env, "keywords/Keywords$proxyKeywordCaller");
    proxy_class_keywords_KeywordCaller = (*env)->NewGlobalRef(env, clazz);
    proxy_class_keywords_KeywordCaller_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
    clazz = (*env)->FindClass(env, "keywords/KeywordCaller");
    mid_KeywordCaller_Abstract = (*env)->GetMethodID(env, clazz, "abstract_", "()V");
    mid_KeywordCaller_Assert = (*env)->GetMethodID(env, clazz, "assert_", "()V");
    mid_KeywordCaller_Bool = (*env)->GetMethodID(env, clazz, "bool", "()V");
    mid_KeywordCaller_Boolean = (*env)->GetMethodID(env, clazz, "boolean_", "()V");
    mid_KeywordCaller_Break = (*env)->GetMethodID(env, clazz, "break_", "()V");
    mid_KeywordCaller_Byte = (*env)->GetMethodID(env, clazz, "byte_", "()V");
    mid_KeywordCaller_Case = (*env)->GetMethodID(env, clazz, "case_", "()V");
    mid_KeywordCaller_Catch = (*env)->GetMethodID(env, clazz, "catch_", "()V");
    mid_KeywordCaller_Char = (*env)->GetMethodID(env, clazz, "char_", "()V");
    mid_KeywordCaller_Class = (*env)->GetMethodID(env, clazz, "class_", "()V");
    mid_KeywordCaller_Const = (*env)->GetMethodID(env, clazz, "const_", "()V");
    mid_KeywordCaller_Continue = (*env)->GetMethodID(env, clazz, "continue_", "()V");
    mid_KeywordCaller_Default = (*env)->GetMethodID(env, clazz, "default_", "()V");
    mid_KeywordCaller_Do = (*env)->GetMethodID(env, clazz, "do_", "()V");
    mid_KeywordCaller_Double = (*env)->GetMethodID(env, clazz, "double_", "()V");
    mid_KeywordCaller_Else = (*env)->GetMethodID(env, clazz, "else_", "()V");
    mid_KeywordCaller_Enum = (*env)->GetMethodID(env, clazz, "enum_", "()V");
    mid_KeywordCaller_Extends = (*env)->GetMethodID(env, clazz, "extends_", "()V");
    mid_KeywordCaller_False = (*env)->GetMethodID(env, clazz, "false_", "()V");
    mid_KeywordCaller_Final = (*env)->GetMethodID(env, clazz, "final_", "()V");
    mid_KeywordCaller_Finally = (*env)->GetMethodID(env, clazz, "finally_", "()V");
    mid_KeywordCaller_Float = (*env)->GetMethodID(env, clazz, "float_", "()V");
    mid_KeywordCaller_For = (*env)->GetMethodID(env, clazz, "for_", "()V");
    mid_KeywordCaller_Goto = (*env)->GetMethodID(env, clazz, "goto_", "()V");
    mid_KeywordCaller_If = (*env)->GetMethodID(env, clazz, "if_", "()V");
    mid_KeywordCaller_Implements = (*env)->GetMethodID(env, clazz, "implements_", "()V");
    mid_KeywordCaller_Import = (*env)->GetMethodID(env, clazz, "import_", "()V");
    mid_KeywordCaller_Instanceof = (*env)->GetMethodID(env, clazz, "instanceof_", "()V");
    mid_KeywordCaller_Int = (*env)->GetMethodID(env, clazz, "int_", "()V");
    mid_KeywordCaller_Interface = (*env)->GetMethodID(env, clazz, "interface_", "()V");
    mid_KeywordCaller_Long = (*env)->GetMethodID(env, clazz, "long_", "()V");
    mid_KeywordCaller_Native = (*env)->GetMethodID(env, clazz, "native_", "()V");
    mid_KeywordCaller_New = (*env)->GetMethodID(env, clazz, "new_", "()V");
    mid_KeywordCaller_Nil = (*env)->GetMethodID(env, clazz, "nil", "()V");
    mid_KeywordCaller_Null = (*env)->GetMethodID(env, clazz, "null_", "()V");
    mid_KeywordCaller_Package = (*env)->GetMethodID(env, clazz, "package_", "()V");
    mid_KeywordCaller_Private = (*env)->GetMethodID(env, clazz, "private_", "()V");
    mid_KeywordCaller_Protected = (*env)->GetMethodID(env, clazz, "protected_", "()V");
    mid_KeywordCaller_Public = (*env)->GetMethodID(env, clazz, "public_", "()V");
    mid_KeywordCaller_Return = (*env)->GetMethodID(env, clazz, "return_", "()V");
    mid_KeywordCaller_Short = (*env)->GetMethodID(env, clazz, "short_", "()V");
    mid_KeywordCaller_Static = (*env)->GetMethodID(env, clazz, "static_", "()V");
    mid_KeywordCaller_Strictfp = (*env)->GetMethodID(env, clazz, "strictfp_", "()V");
    mid_KeywordCaller_Super = (*env)->GetMethodID(env, clazz, "super_", "()V");
    mid_KeywordCaller_Switch = (*env)->GetMethodID(env, clazz, "switch_", "()V");
    mid_KeywordCaller_Synchronized = (*env)->GetMethodID(env, clazz, "synchronized_", "()V");
    mid_KeywordCaller_This = (*env)->GetMethodID(env, clazz, "this_", "()V");
    mid_KeywordCaller_Throw = (*env)->GetMethodID(env, clazz, "throw_", "()V");
    mid_KeywordCaller_Throws = (*env)->GetMethodID(env, clazz, "throws_", "()V");
    mid_KeywordCaller_Transient = (*env)->GetMethodID(env, clazz, "transient_", "()V");
    mid_KeywordCaller_True = (*env)->GetMethodID(env, clazz, "true_", "()V");
    mid_KeywordCaller_Try = (*env)->GetMethodID(env, clazz, "try_", "()V");
    mid_KeywordCaller_Void = (*env)->GetMethodID(env, clazz, "void_", "()V");
    mid_KeywordCaller_Volatile = (*env)->GetMethodID(env, clazz, "volatile_", "()V");
    mid_KeywordCaller_While = (*env)->GetMethodID(env, clazz, "while_", "()V");
    
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_const_1(JNIEnv* env, jclass _clazz, jstring id) {
    nstring _id = go_seq_from_java_string(env, id);
    proxykeywords__Const(_id);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_static_1(JNIEnv* env, jclass _clazz, jstring strictfp_) {
    nstring _strictfp_ = go_seq_from_java_string(env, strictfp_);
    proxykeywords__Static(_strictfp_);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_abstract_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Abstract(o);
}

void cproxykeywords_KeywordCaller_Abstract(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Abstract);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_assert_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Assert(o);
}

void cproxykeywords_KeywordCaller_Assert(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Assert);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_bool(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Bool(o);
}

void cproxykeywords_KeywordCaller_Bool(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Bool);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_boolean_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Boolean(o);
}

void cproxykeywords_KeywordCaller_Boolean(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Boolean);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_break_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Break(o);
}

void cproxykeywords_KeywordCaller_Break(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Break);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_byte_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Byte(o);
}

void cproxykeywords_KeywordCaller_Byte(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Byte);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_case_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Case(o);
}

void cproxykeywords_KeywordCaller_Case(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Case);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_catch_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Catch(o);
}

void cproxykeywords_KeywordCaller_Catch(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Catch);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_char_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Char(o);
}

void cproxykeywords_KeywordCaller_Char(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Char);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_class_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Class(o);
}

void cproxykeywords_KeywordCaller_Class(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Class);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_const_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Const(o);
}

void cproxykeywords_KeywordCaller_Const(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Const);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_continue_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Continue(o);
}

void cproxykeywords_KeywordCaller_Continue(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Continue);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_default_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Default(o);
}

void cproxykeywords_KeywordCaller_Default(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Default);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_do_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Do(o);
}

void cproxykeywords_KeywordCaller_Do(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Do);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_double_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Double(o);
}

void cproxykeywords_KeywordCaller_Double(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Double);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_else_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Else(o);
}

void cproxykeywords_KeywordCaller_Else(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Else);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_enum_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Enum(o);
}

void cproxykeywords_KeywordCaller_Enum(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Enum);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_extends_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Extends(o);
}

void cproxykeywords_KeywordCaller_Extends(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Extends);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_false_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_False(o);
}

void cproxykeywords_KeywordCaller_False(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_False);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_final_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Final(o);
}

void cproxykeywords_KeywordCaller_Final(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Final);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_finally_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Finally(o);
}

void cproxykeywords_KeywordCaller_Finally(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Finally);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_float_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Float(o);
}

void cproxykeywords_KeywordCaller_Float(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Float);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_for_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_For(o);
}

void cproxykeywords_KeywordCaller_For(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_For);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_goto_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Goto(o);
}

void cproxykeywords_KeywordCaller_Goto(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Goto);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_if_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_If(o);
}

void cproxykeywords_KeywordCaller_If(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_If);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_implements_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Implements(o);
}

void cproxykeywords_KeywordCaller_Implements(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Implements);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_import_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Import(o);
}

void cproxykeywords_KeywordCaller_Import(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Import);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_instanceof_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Instanceof(o);
}

void cproxykeywords_KeywordCaller_Instanceof(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Instanceof);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_int_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Int(o);
}

void cproxykeywords_KeywordCaller_Int(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Int);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_interface_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Interface(o);
}

void cproxykeywords_KeywordCaller_Interface(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Interface);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_long_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Long(o);
}

void cproxykeywords_KeywordCaller_Long(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Long);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_native_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Native(o);
}

void cproxykeywords_KeywordCaller_Native(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Native);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_new_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_New(o);
}

void cproxykeywords_KeywordCaller_New(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_New);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_nil(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Nil(o);
}

void cproxykeywords_KeywordCaller_Nil(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Nil);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_null_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Null(o);
}

void cproxykeywords_KeywordCaller_Null(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Null);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_package_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Package(o);
}

void cproxykeywords_KeywordCaller_Package(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Package);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_private_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Private(o);
}

void cproxykeywords_KeywordCaller_Private(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Private);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_protected_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Protected(o);
}

void cproxykeywords_KeywordCaller_Protected(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Protected);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_public_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Public(o);
}

void cproxykeywords_KeywordCaller_Public(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Public);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_return_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Return(o);
}

void cproxykeywords_KeywordCaller_Return(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Return);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_short_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Short(o);
}

void cproxykeywords_KeywordCaller_Short(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Short);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_static_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Static(o);
}

void cproxykeywords_KeywordCaller_Static(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Static);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_strictfp_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Strictfp(o);
}

void cproxykeywords_KeywordCaller_Strictfp(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Strictfp);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_super_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Super(o);
}

void cproxykeywords_KeywordCaller_Super(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Super);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_switch_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Switch(o);
}

void cproxykeywords_KeywordCaller_Switch(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Switch);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_synchronized_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Synchronized(o);
}

void cproxykeywords_KeywordCaller_Synchronized(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Synchronized);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_this_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_This(o);
}

void cproxykeywords_KeywordCaller_This(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_This);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_throw_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Throw(o);
}

void cproxykeywords_KeywordCaller_Throw(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Throw);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_throws_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Throws(o);
}

void cproxykeywords_KeywordCaller_Throws(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Throws);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_transient_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Transient(o);
}

void cproxykeywords_KeywordCaller_Transient(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Transient);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_true_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_True(o);
}

void cproxykeywords_KeywordCaller_True(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_True);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_try_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Try(o);
}

void cproxykeywords_KeywordCaller_Try(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Try);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_void_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Void(o);
}

void cproxykeywords_KeywordCaller_Void(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Void);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_volatile_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_Volatile(o);
}

void cproxykeywords_KeywordCaller_Volatile(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_Volatile);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_keywords_Keywords_00024proxyKeywordCaller_while_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxykeywords_KeywordCaller_While(o);
}

void cproxykeywords_KeywordCaller_While(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_keywords_KeywordCaller, proxy_class_keywords_KeywordCaller_cons);
    (*env)->CallVoidMethod(env, o, mid_KeywordCaller_While);
    go_seq_pop_local_frame(env);
}

