// Code generated by gobind. DO NOT EDIT.

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

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

jclass proxy_class_issue12328_T;
jmethodID proxy_class_issue12328_T_cons;

JNIEXPORT void JNICALL
Java_issue12328_Issue12328__1init(JNIEnv *env, jclass _unused) {
    jclass clazz;
    clazz = (*env)->FindClass(env, "issue12328/T");
    proxy_class_issue12328_T = (*env)->NewGlobalRef(env, clazz);
    proxy_class_issue12328_T_cons = (*env)->GetMethodID(env, clazz, "<init>", "(I)V");
}

JNIEXPORT jint JNICALL
Java_issue12328_T__1_1New(JNIEnv *env, jclass clazz) {
    return new_issue12328_T();
}

JNIEXPORT void JNICALL
Java_issue12328_T_setErr(JNIEnv *env, jobject this, jobject v) {
    int32_t o = go_seq_to_refnum_go(env, this);
    int32_t _v = go_seq_to_refnum(env, v);
    proxyissue12328_T_Err_Set(o, _v);
}

JNIEXPORT jobject JNICALL
Java_issue12328_T_getErr(JNIEnv *env, jobject this) {
    int32_t o = go_seq_to_refnum_go(env, this);
    int32_t r0 = proxyissue12328_T_Err_Get(o);
    jobject _r0 = go_seq_from_refnum(env, r0, proxy_class__error, proxy_class__error_cons);
    return _r0;
}

