// 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_interfaces_Interfaces__1init(JNIEnv *env, jclass _unused) {
    jclass clazz;
    clazz = (*env)->FindClass(env, "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, "interfaces/Error");
    mid_Error_Err = (*env)->GetMethodID(env, clazz, "err", "()V");
    
    clazz = (*env)->FindClass(env, "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, "interfaces/I");
    mid_I_Rand = (*env)->GetMethodID(env, clazz, "rand", "()I");
    
    clazz = (*env)->FindClass(env, "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, "interfaces/I1");
    mid_I1_J = (*env)->GetMethodID(env, clazz, "j", "()V");
    
    clazz = (*env)->FindClass(env, "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, "interfaces/I2");
    mid_I2_G = (*env)->GetMethodID(env, clazz, "g", "()V");
    
    clazz = (*env)->FindClass(env, "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, "interfaces/I3");
    mid_I3_F = (*env)->GetMethodID(env, clazz, "f", "()Linterfaces/I1;");
    
    clazz = (*env)->FindClass(env, "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, "interfaces/LargerI");
    mid_LargerI_AnotherFunc = (*env)->GetMethodID(env, clazz, "anotherFunc", "()V");
    mid_LargerI_Rand = (*env)->GetMethodID(env, clazz, "rand", "()I");
    
    clazz = (*env)->FindClass(env, "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, "interfaces/SameI");
    mid_SameI_Rand = (*env)->GetMethodID(env, clazz, "rand", "()I");
    
    clazz = (*env)->FindClass(env, "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, "interfaces/WithParam");
    mid_WithParam_HasParam = (*env)->GetMethodID(env, clazz, "hasParam", "(Z)V");
    
}

JNIEXPORT jint JNICALL
Java_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_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_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_interfaces_Interfaces_00024proxyError_err(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(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(0);
    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_get_exception(env);
    int32_t _exc = go_seq_to_refnum(env, exc);
    go_seq_pop_local_frame(env);
    return _exc;
}

JNIEXPORT jint JNICALL
Java_interfaces_Interfaces_00024proxyI_rand(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(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(0);
    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_interfaces_Interfaces_00024proxyI1_j(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxyinterfaces_I1_J(o);
}

void cproxyinterfaces_I1_J(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    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_interfaces_Interfaces_00024proxyI2_g(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxyinterfaces_I2_G(o);
}

void cproxyinterfaces_I2_G(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    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_interfaces_Interfaces_00024proxyI3_f(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(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(0);
    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_interfaces_Interfaces_00024proxyLargerI_anotherFunc(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(env, __this__);
    proxyinterfaces_LargerI_AnotherFunc(o);
}

void cproxyinterfaces_LargerI_AnotherFunc(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(0);
    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_interfaces_Interfaces_00024proxyLargerI_rand(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(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(0);
    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_interfaces_Interfaces_00024proxySameI_rand(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(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(0);
    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_interfaces_Interfaces_00024proxyWithParam_hasParam(JNIEnv* env, jobject __this__, jboolean p0) {
    int32_t o = go_seq_to_refnum_go(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(1);
    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);
}

