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

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

jclass proxy_class_issue12403_Parsable;
jmethodID proxy_class_issue12403_Parsable_cons;
static jmethodID mid_Parsable_FromJSON;
static jmethodID mid_Parsable_ToJSON;

JNIEXPORT void JNICALL
Java_go_issue12403_Issue12403_init(JNIEnv *env, jclass _unused) {
    jclass clazz;
    clazz = (*env)->FindClass(env, "go/issue12403/Issue12403$proxyParsable");
    proxy_class_issue12403_Parsable = (*env)->NewGlobalRef(env, clazz);
    proxy_class_issue12403_Parsable_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
    clazz = (*env)->FindClass(env, "go/issue12403/Issue12403$Parsable");
    mid_Parsable_FromJSON = (*env)->GetMethodID(env, clazz, "FromJSON", "(Ljava/lang/String;)Ljava/lang/String;");
    mid_Parsable_ToJSON = (*env)->GetMethodID(env, clazz, "ToJSON", "()Ljava/lang/String;");
    
}

JNIEXPORT jstring JNICALL
Java_go_issue12403_Issue12403_00024proxyParsable_FromJSON(JNIEnv* env, jobject this, jstring jstr) {
    int32_t o = go_seq_to_refnum(env, this);
    nstring _jstr = go_seq_from_java_string(env, jstr);
    nstring r0 = proxyissue12403_Parsable_FromJSON(o, _jstr);
    jstring _r0 = go_seq_to_java_string(env, r0);
    return _r0;
}

nstring cproxyissue12403_Parsable_FromJSON(int32_t refnum, nstring jstr) {
    JNIEnv *env = go_seq_push_local_frame(12);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_issue12403_Parsable, proxy_class_issue12403_Parsable_cons);
    jstring _jstr = go_seq_to_java_string(env, jstr);
    jstring res = (*env)->CallObjectMethod(env, o, mid_Parsable_FromJSON, _jstr);
    nstring _res = go_seq_from_java_string(env, res);
    go_seq_pop_local_frame(env);
    return _res;
}

JNIEXPORT jstring JNICALL
Java_go_issue12403_Issue12403_00024proxyParsable_ToJSON(JNIEnv* env, jobject this) {
    int32_t o = go_seq_to_refnum(env, this);
    struct proxyissue12403_Parsable_ToJSON_return res = proxyissue12403_Parsable_ToJSON(o);
    jstring _r0 = go_seq_to_java_string(env, res.r0);
    jobject _r1 = go_seq_from_refnum(env, res.r1, proxy_class__error, proxy_class__error_cons);
    go_seq_maybe_throw_exception(env, _r1);
    return _r0;
}

struct cproxyissue12403_Parsable_ToJSON_return cproxyissue12403_Parsable_ToJSON(int32_t refnum) {
    JNIEnv *env = go_seq_push_local_frame(10);
    jobject o = go_seq_from_refnum(env, refnum, proxy_class_issue12403_Parsable, proxy_class_issue12403_Parsable_cons);
    jstring res = (*env)->CallObjectMethod(env, o, mid_Parsable_ToJSON);
    nstring _res = go_seq_from_java_string(env, res);
    jobject exc = go_seq_wrap_exception(env);
    int32_t _exc = go_seq_to_refnum(env, exc);
    cproxyissue12403_Parsable_ToJSON_return sres = {
    	_res, _exc
    };
    go_seq_pop_local_frame(env);
    return sres;
}

