// Code generated by gobind. DO NOT EDIT.

// JNI functions for the Go <=> Java bridge.
//
//   autogenerated by gobind -lang=java keywords

#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>", "(I)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);
}

