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

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

jclass proxy_class_interfaces_Error;
jmethodID proxy_class_interfaces_Error_cons;
static jmethodID mid_Error_Err;
jclass proxy_class_interfaces_I;
jmethodID proxy_class_interfaces_I_cons;
static jmethodID mid_I_Rand;
jclass proxy_class_interfaces_I1;
jmethodID proxy_class_interfaces_I1_cons;
static jmethodID mid_I1_J;
jclass proxy_class_interfaces_I2;
jmethodID proxy_class_interfaces_I2_cons;
static jmethodID mid_I2_G;
jclass proxy_class_interfaces_I3;
jmethodID proxy_class_interfaces_I3_cons;
static jmethodID mid_I3_F;
jclass proxy_class_interfaces_LargerI;
jmethodID proxy_class_interfaces_LargerI_cons;
static jmethodID mid_LargerI_AnotherFunc;
static jmethodID mid_LargerI_Rand;
jclass proxy_class_interfaces_SameI;
jmethodID proxy_class_interfaces_SameI_cons;
static jmethodID mid_SameI_Rand;
jclass proxy_class_interfaces_WithParam;
jmethodID proxy_class_interfaces_WithParam_cons;
static jmethodID mid_WithParam_HasParam;

JNIEXPORT void JNICALL
Java_go_interfaces_Interfaces_init(JNIEnv *env, jclass _unused) {
    jclass clazz;
    clazz = (*env)->FindClass(env, "go/interfaces/Interfaces$proxyError");
    proxy_class_interfaces_Error = (*env)->NewGlobalRef(env, clazz);
    proxy_class_interfaces_Error_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
    clazz = (*env)->FindClass(env, "go/interfaces/Interfaces$Error");
    mid_Error_Err = (*env)->GetMethodID(env, clazz, "Err", "()V");
    
    clazz = (*env)->FindClass(env, "go/interfaces/Interfaces$proxyI");
    proxy_class_interfaces_I = (*env)->NewGlobalRef(env, clazz);
    proxy_class_interfaces_I_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
    clazz = (*env)->FindClass(env, "go/interfaces/Interfaces$I");
    mid_I_Rand = (*env)->GetMethodID(env, clazz, "Rand", "()I");
    
    clazz = (*env)->FindClass(env, "go/interfaces/Interfaces$proxyI1");
    proxy_class_interfaces_I1 = (*env)->NewGlobalRef(env, clazz);
    proxy_class_interfaces_I1_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
    clazz = (*env)->FindClass(env, "go/interfaces/Interfaces$I1");
    mid_I1_J = (*env)->GetMethodID(env, clazz, "J", "()V");
    
    clazz = (*env)->FindClass(env, "go/interfaces/Interfaces$proxyI2");
    proxy_class_interfaces_I2 = (*env)->NewGlobalRef(env, clazz);
    proxy_class_interfaces_I2_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
    clazz = (*env)->FindClass(env, "go/interfaces/Interfaces$I2");
    mid_I2_G = (*env)->GetMethodID(env, clazz, "G", "()V");
    
    clazz = (*env)->FindClass(env, "go/interfaces/Interfaces$proxyI3");
    proxy_class_interfaces_I3 = (*env)->NewGlobalRef(env, clazz);
    proxy_class_interfaces_I3_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
    clazz = (*env)->FindClass(env, "go/interfaces/Interfaces$I3");
    mid_I3_F = (*env)->GetMethodID(env, clazz, "F", "()Lgo/interfaces/Interfaces$I1;");
    
    clazz = (*env)->FindClass(env, "go/interfaces/Interfaces$proxyLargerI");
    proxy_class_interfaces_LargerI = (*env)->NewGlobalRef(env, clazz);
    proxy_class_interfaces_LargerI_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
    clazz = (*env)->FindClass(env, "go/interfaces/Interfaces$LargerI");
    mid_LargerI_AnotherFunc = (*env)->GetMethodID(env, clazz, "AnotherFunc", "()V");
    mid_LargerI_Rand = (*env)->GetMethodID(env, clazz, "Rand", "()I");
    
    clazz = (*env)->FindClass(env, "go/interfaces/Interfaces$proxySameI");
    proxy_class_interfaces_SameI = (*env)->NewGlobalRef(env, clazz);
    proxy_class_interfaces_SameI_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
    clazz = (*env)->FindClass(env, "go/interfaces/Interfaces$SameI");
    mid_SameI_Rand = (*env)->GetMethodID(env, clazz, "Rand", "()I");
    
    clazz = (*env)->FindClass(env, "go/interfaces/Interfaces$proxyWithParam");
    proxy_class_interfaces_WithParam = (*env)->NewGlobalRef(env, clazz);
    proxy_class_interfaces_WithParam_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
    clazz = (*env)->FindClass(env, "go/interfaces/Interfaces$WithParam");
    mid_WithParam_HasParam = (*env)->GetMethodID(env, clazz, "HasParam", "(Z)V");
    
}

JNIEXPORT jint JNICALL
Java_go_interfaces_Interfaces_Add3(JNIEnv* env, jclass clazz, jobject r) {
    int32_t _r = go_seq_to_refnum(env, r);
    int32_t r0 = proxyinterfaces__Add3(_r);
    jint _r0 = (jint)r0;
    return _r0;
}

JNIEXPORT void JNICALL
Java_go_interfaces_Interfaces_CallErr(JNIEnv* env, jclass clazz, jobject e) {
    int32_t _e = go_seq_to_refnum(env, e);
    int32_t r0 = proxyinterfaces__CallErr(_e);
    jobject _r0 = go_seq_from_refnum(env, r0, proxy_class__error, proxy_class__error_cons);
    go_seq_maybe_throw_exception(env, _r0);
}

JNIEXPORT jobject JNICALL
Java_go_interfaces_Interfaces_Seven(JNIEnv* env, jclass clazz) {
    int32_t r0 = proxyinterfaces__Seven();
    jobject _r0 = go_seq_from_refnum(env, r0, proxy_class_interfaces_I, proxy_class_interfaces_I_cons);
    return _r0;
}

JNIEXPORT void JNICALL
Java_go_interfaces_Interfaces_00024proxyError_Err(JNIEnv* env, jobject this) {
    int32_t o = go_seq_to_refnum(env, this);
    int32_t r0 = proxyinterfaces_Error_Err(o);
    jobject _r0 = go_seq_from_refnum(env, r0, proxy_class__error, proxy_class__error_cons);
    go_seq_maybe_throw_exception(env, _r0);
}

int32_t cproxyinterfaces_Error_Err(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(10);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_interfaces_Error, proxy_class_interfaces_Error_cons);
    (*env)->CallVoidMethod(env, o, mid_Error_Err);
    jobject exc = go_seq_wrap_exception(env);
    int32_t _exc = go_seq_to_refnum(env, exc);
    go_seq_pop_local_frame(env);
    return _exc;
}

JNIEXPORT jint JNICALL
Java_go_interfaces_Interfaces_00024proxyI_Rand(JNIEnv* env, jobject this) {
    int32_t o = go_seq_to_refnum(env, this);
    int32_t r0 = proxyinterfaces_I_Rand(o);
    jint _r0 = (jint)r0;
    return _r0;
}

int32_t cproxyinterfaces_I_Rand(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(10);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_interfaces_I, proxy_class_interfaces_I_cons);
    jint res = (*env)->CallIntMethod(env, o, mid_I_Rand);
    int32_t _res = (int32_t)res;
    go_seq_pop_local_frame(env);
    return _res;
}

JNIEXPORT void JNICALL
Java_go_interfaces_Interfaces_00024proxyI1_J(JNIEnv* env, jobject this) {
    int32_t o = go_seq_to_refnum(env, this);
    proxyinterfaces_I1_J(o);
}

void cproxyinterfaces_I1_J(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(10);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_interfaces_I1, proxy_class_interfaces_I1_cons);
    (*env)->CallVoidMethod(env, o, mid_I1_J);
    go_seq_pop_local_frame(env);
}

JNIEXPORT void JNICALL
Java_go_interfaces_Interfaces_00024proxyI2_G(JNIEnv* env, jobject this) {
    int32_t o = go_seq_to_refnum(env, this);
    proxyinterfaces_I2_G(o);
}

void cproxyinterfaces_I2_G(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(10);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_interfaces_I2, proxy_class_interfaces_I2_cons);
    (*env)->CallVoidMethod(env, o, mid_I2_G);
    go_seq_pop_local_frame(env);
}

JNIEXPORT jobject JNICALL
Java_go_interfaces_Interfaces_00024proxyI3_F(JNIEnv* env, jobject this) {
    int32_t o = go_seq_to_refnum(env, this);
    int32_t r0 = proxyinterfaces_I3_F(o);
    jobject _r0 = go_seq_from_refnum(env, r0, proxy_class_interfaces_I1, proxy_class_interfaces_I1_cons);
    return _r0;
}

int32_t cproxyinterfaces_I3_F(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(10);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_interfaces_I3, proxy_class_interfaces_I3_cons);
    jobject res = (*env)->CallObjectMethod(env, o, mid_I3_F);
    int32_t _res = go_seq_to_refnum(env, res);
    go_seq_pop_local_frame(env);
    return _res;
}

JNIEXPORT void JNICALL
Java_go_interfaces_Interfaces_00024proxyLargerI_AnotherFunc(JNIEnv* env, jobject this) {
    int32_t o = go_seq_to_refnum(env, this);
    proxyinterfaces_LargerI_AnotherFunc(o);
}

void cproxyinterfaces_LargerI_AnotherFunc(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(10);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_interfaces_LargerI, proxy_class_interfaces_LargerI_cons);
    (*env)->CallVoidMethod(env, o, mid_LargerI_AnotherFunc);
    go_seq_pop_local_frame(env);
}

JNIEXPORT jint JNICALL
Java_go_interfaces_Interfaces_00024proxyLargerI_Rand(JNIEnv* env, jobject this) {
    int32_t o = go_seq_to_refnum(env, this);
    int32_t r0 = proxyinterfaces_LargerI_Rand(o);
    jint _r0 = (jint)r0;
    return _r0;
}

int32_t cproxyinterfaces_LargerI_Rand(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(10);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_interfaces_LargerI, proxy_class_interfaces_LargerI_cons);
    jint res = (*env)->CallIntMethod(env, o, mid_LargerI_Rand);
    int32_t _res = (int32_t)res;
    go_seq_pop_local_frame(env);
    return _res;
}

JNIEXPORT jint JNICALL
Java_go_interfaces_Interfaces_00024proxySameI_Rand(JNIEnv* env, jobject this) {
    int32_t o = go_seq_to_refnum(env, this);
    int32_t r0 = proxyinterfaces_SameI_Rand(o);
    jint _r0 = (jint)r0;
    return _r0;
}

int32_t cproxyinterfaces_SameI_Rand(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(10);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_interfaces_SameI, proxy_class_interfaces_SameI_cons);
    jint res = (*env)->CallIntMethod(env, o, mid_SameI_Rand);
    int32_t _res = (int32_t)res;
    go_seq_pop_local_frame(env);
    return _res;
}

JNIEXPORT void JNICALL
Java_go_interfaces_Interfaces_00024proxyWithParam_HasParam(JNIEnv* env, jobject this, jboolean p0) {
    int32_t o = go_seq_to_refnum(env, this);
    char _p0 = (char)p0;
    proxyinterfaces_WithParam_HasParam(o, _p0);
}

void cproxyinterfaces_WithParam_HasParam(int32_t refnum, char p0) {
    JNIEnv *env = go_seq_push_local_frame(12);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_interfaces_WithParam, proxy_class_interfaces_WithParam_cons);
    jboolean _p0 = p0 ? JNI_TRUE : JNI_FALSE;
    (*env)->CallVoidMethod(env, o, mid_WithParam_HasParam, _p0);
    go_seq_pop_local_frame(env);
}

