// 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_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_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_go_keywords_Keywords__1init(JNIEnv *env, jclass _unused) {
    jclass clazz;
    clazz = (*env)->FindClass(env, "go/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, "go/keywords/KeywordCaller");
    mid_KeywordCaller_Abstract = (*env)->GetMethodID(env, clazz, "abstract_", "()V");
    mid_KeywordCaller_Assert = (*env)->GetMethodID(env, clazz, "assert_", "()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_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_go_keywords_Keywords_00024proxyKeywordCaller_abstract_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_assert_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_boolean_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_break_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_byte_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_case_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_catch_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_char_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_class_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_const_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_continue_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_default_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_do_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_double_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_else_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_enum_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_extends_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_false_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_final_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_finally_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_float_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_for_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_goto_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_if_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_implements_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_import_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_instanceof_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_int_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_interface_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_long_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_native_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_new_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_null_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_package_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_private_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_protected_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_public_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_return_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_short_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_static_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_strictfp_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_super_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_switch_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_synchronized_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_this_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_throw_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_throws_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_transient_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_true_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_try_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_void_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_volatile_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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_go_keywords_Keywords_00024proxyKeywordCaller_while_1(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum(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);
}

