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

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

jclass proxy_class_ignore_I;
jmethodID proxy_class_ignore_I_cons;
// skipped method I.Argument with unsupported parameter or return types

// skipped method I.Result with unsupported parameter or return types

jclass proxy_class_ignore_S;
jmethodID proxy_class_ignore_S_cons;

JNIEXPORT void JNICALL
Java_ignore_Ignore__1init(JNIEnv *env, jclass _unused) {
    jclass clazz;
    clazz = (*env)->FindClass(env, "ignore/S");
    proxy_class_ignore_S = (*env)->NewGlobalRef(env, clazz);
    proxy_class_ignore_S_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
    clazz = (*env)->FindClass(env, "ignore/Ignore$proxyI");
    proxy_class_ignore_I = (*env)->NewGlobalRef(env, clazz);
    proxy_class_ignore_I_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
    clazz = (*env)->FindClass(env, "ignore/I");
    // skipped method I.Argument with unsupported parameter or return types
    
    // skipped method I.Result with unsupported parameter or return types
    
    
}

// skipped function Argument with unsupported parameter or return types

// skipped function Result with unsupported parameter or return types

JNIEXPORT jobject JNICALL
Java_ignore_S__1_1New(JNIEnv *env, jclass clazz) {
    int32_t refnum = new_ignore_S();
    return go_seq_from_refnum(env, refnum, NULL, NULL);
}

// skipped function S.Argument with unsupported parameter or return types

// skipped function S.Result with unsupported parameter or return types

// skipped field S with unsupported type: interface{}

// skipped function I.Argument with unsupported parameter or return types

// skipped method I with unsupported parameter or return types

// skipped function I.Result with unsupported parameter or return types

// skipped method I with unsupported parameter or return types

// skipped variable C128 with unsupported type: complex128

// skipped variable C64 with unsupported type: complex64

// skipped variable Uint with unsupported type: uint

// skipped variable Uint32 with unsupported type: uint32

// skipped variable Uint64 with unsupported type: uint64

// skipped variable V with unsupported type: interface{}

// skipped variable Var with unsupported type: interface{}

