// File is generated by gobind. Do not edit.

#include <jni.h>
#include "seq.h"

extern void init_proxies();

typedef struct ret_jint {
	jint res;
	jint exc;
} ret_jint;
typedef struct ret_jboolean {
	jboolean res;
	jint exc;
} ret_jboolean;
typedef struct ret_jshort {
	jshort res;
	jint exc;
} ret_jshort;
typedef struct ret_jchar {
	jchar res;
	jint exc;
} ret_jchar;
typedef struct ret_jbyte {
	jbyte res;
	jint exc;
} ret_jbyte;
typedef struct ret_jlong {
	jlong res;
	jint exc;
} ret_jlong;
typedef struct ret_jfloat {
	jfloat res;
	jint exc;
} ret_jfloat;
typedef struct ret_jdouble {
	jdouble res;
	jint exc;
} ret_jdouble;
typedef struct ret_nstring {
	nstring res;
	jint exc;
} ret_nstring;
typedef struct ret_nbyteslice {
	nbyteslice res;
	jint exc;
} ret_nbyteslice;

extern ret_nstring cproxy_java_lang_Float_toString(jint this);
extern ret_nstring cproxy_java_lang_Long_toString(jint this);
extern ret_nstring cproxy_java_lang_Object_toString(jint this);
// JNI function headers for the Go <=> Java bridge.
//   gobind -lang=java java
//
// File is generated by gobind. Do not edit.

#ifndef __Java_H__
#define __Java_H__

#include <jni.h>

extern jclass proxy_class_java_F;
extern jmethodID proxy_class_java_F_cons;

nstring cproxyjava_F_ToString(int32_t refnum);

extern jclass proxy_class_java_L;
extern jmethodID proxy_class_java_L_cons;

nstring cproxyjava_L_ToString(int32_t refnum);

extern jclass proxy_class_java_O;
extern jmethodID proxy_class_java_O_cons;

nstring cproxyjava_O_ToString(int32_t refnum);

extern jclass proxy_class_java_R;
extern jmethodID proxy_class_java_R_cons;

#endif
