// 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_issue12403_Issue12403__1init(JNIEnv *env, jclass _unused) {
    jclass clazz;
    clazz = (*env)->FindClass(env, "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, "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_issue12403_Issue12403_00024proxyParsable_fromJSON(JNIEnv* env, jobject __this__, jstring jstr) {
    int32_t o = go_seq_to_refnum_go(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(1);
    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_issue12403_Issue12403_00024proxyParsable_toJSON(JNIEnv* env, jobject __this__) {
    int32_t o = go_seq_to_refnum_go(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(0);
    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);
    jobject exc = go_seq_get_exception(env);
    int32_t _exc = go_seq_to_refnum(env, exc);
    if (exc != NULL) {
        res = NULL;
    }
    nstring _res = go_seq_from_java_string(env, res);
    cproxyissue12403_Parsable_ToJSON_return sres = {
    	_res, _exc
    };
    go_seq_pop_local_frame(env);
    return sres;
}

