// 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_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_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_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_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_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);
}

