// 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);
    nstring r0 = proxyinterfaces__CallErr(_e);
    jstring _r0 = go_seq_to_java_string(env, r0);
    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);
    nstring r0 = proxyinterfaces_Error_Err(o);
    jstring _r0 = go_seq_to_java_string(env, r0);
    go_seq_maybe_throw_exception(env, _r0);
}

nstring 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);
    jstring exc = go_seq_get_exception_message(env);
    nstring _exc = go_seq_from_java_string(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);
}

