// Code 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);
// Code generated by gobind. DO NOT EDIT.

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

#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
