sig
  external set_debug : bool -> unit = "camljava_set_debug"
  external set_string_auto_conv : bool -> unit = "camljava_set_strconv"
  type obj
  val null : Jni.obj
  exception Null_pointer
  exception Exception of Jni.obj
  external is_null : Jni.obj -> bool = "camljava_IsNull"
  external is_same_object : Jni.obj -> Jni.obj -> bool
    = "camljava_IsSameObject"
  external string_to_java : string -> Jni.obj = "camljava_MakeJavaString"
  external string_from_java : Jni.obj -> string
    = "camljava_ExtractJavaString"
  val null_string : string
  val is_null_string : string -> bool
  type clazz
  external find_class : string -> Jni.clazz = "camljava_FindClass"
  external get_superclass : Jni.clazz -> Jni.clazz = "camljava_GetSuperclass"
  external is_assignable_from : Jni.clazz -> Jni.clazz -> bool
    = "camljava_IsAssignableFrom"
  external get_object_class : Jni.obj -> Jni.clazz
    = "camljava_GetObjectClass"
  external is_instance_of : Jni.obj -> Jni.clazz -> bool
    = "camljava_IsInstanceOf"
  external alloc_object : Jni.clazz -> Jni.obj = "camljava_AllocObject"
  type fieldID
  type methodID
  external get_fieldID : Jni.clazz -> string -> string -> Jni.fieldID
    = "camljava_GetFieldID"
  external get_static_fieldID : Jni.clazz -> string -> string -> Jni.fieldID
    = "camljava_GetStaticFieldID"
  external get_methodID : Jni.clazz -> string -> string -> Jni.methodID
    = "camljava_GetMethodID"
  external get_static_methodID :
    Jni.clazz -> string -> string -> Jni.methodID
    = "camljava_GetStaticMethodID"
  external get_object_field : Jni.obj -> Jni.fieldID -> Jni.obj
    = "camljava_GetObjectField"
  external get_boolean_field : Jni.obj -> Jni.fieldID -> bool
    = "camljava_GetBooleanField"
  external get_byte_field : Jni.obj -> Jni.fieldID -> int
    = "camljava_GetByteField"
  external get_char_field : Jni.obj -> Jni.fieldID -> int
    = "camljava_GetCharField"
  external get_short_field : Jni.obj -> Jni.fieldID -> int
    = "camljava_GetShortField"
  external get_int_field : Jni.obj -> Jni.fieldID -> int32
    = "camljava_GetIntField"
  external get_camlint_field : Jni.obj -> Jni.fieldID -> int
    = "camljava_GetCamlintField"
  external get_long_field : Jni.obj -> Jni.fieldID -> int64
    = "camljava_GetLongField"
  external get_float_field : Jni.obj -> Jni.fieldID -> float
    = "camljava_GetFloatField"
  external get_double_field : Jni.obj -> Jni.fieldID -> float
    = "camljava_GetFloatField"
  external set_object_field : Jni.obj -> Jni.fieldID -> Jni.obj -> unit
    = "camljava_SetObjectField"
  external set_boolean_field : Jni.obj -> Jni.fieldID -> bool -> unit
    = "camljava_SetBooleanField"
  external set_byte_field : Jni.obj -> Jni.fieldID -> int -> unit
    = "camljava_SetByteField"
  external set_char_field : Jni.obj -> Jni.fieldID -> int -> unit
    = "camljava_SetCharField"
  external set_short_field : Jni.obj -> Jni.fieldID -> int -> unit
    = "camljava_SetShortField"
  external set_int_field : Jni.obj -> Jni.fieldID -> int32 -> unit
    = "camljava_SetIntField"
  external set_camlint_field : Jni.obj -> Jni.fieldID -> int -> unit
    = "camljava_SetCamlintField"
  external set_long_field : Jni.obj -> Jni.fieldID -> int64 -> unit
    = "camljava_SetLongField"
  external set_float_field : Jni.obj -> Jni.fieldID -> float -> unit
    = "camljava_SetFloatField"
  external set_double_field : Jni.obj -> Jni.fieldID -> float -> unit
    = "camljava_SetFloatField"
  external get_static_object_field : Jni.clazz -> Jni.fieldID -> Jni.obj
    = "camljava_GetStaticObjectField"
  external get_static_boolean_field : Jni.clazz -> Jni.fieldID -> bool
    = "camljava_GetStaticBooleanField"
  external get_static_byte_field : Jni.clazz -> Jni.fieldID -> int
    = "camljava_GetStaticByteField"
  external get_static_char_field : Jni.clazz -> Jni.fieldID -> int
    = "camljava_GetStaticCharField"
  external get_static_short_field : Jni.clazz -> Jni.fieldID -> int
    = "camljava_GetStaticShortField"
  external get_static_int_field : Jni.clazz -> Jni.fieldID -> int32
    = "camljava_GetStaticIntField"
  external get_static_camlint_field : Jni.clazz -> Jni.fieldID -> int
    = "camljava_GetStaticCamlintField"
  external get_static_long_field : Jni.clazz -> Jni.fieldID -> int64
    = "camljava_GetStaticLongField"
  external get_static_float_field : Jni.clazz -> Jni.fieldID -> float
    = "camljava_GetStaticFloatField"
  external get_static_double_field : Jni.clazz -> Jni.fieldID -> float
    = "camljava_GetStaticFloatField"
  external set_static_obj_field : Jni.clazz -> Jni.fieldID -> Jni.obj -> unit
    = "camljava_SetStaticObjectField"
  external set_static_boolean_field :
    Jni.clazz -> Jni.fieldID -> bool -> unit
    = "camljava_SetStaticBooleanField"
  external set_static_byte_field : Jni.clazz -> Jni.fieldID -> int -> unit
    = "camljava_SetStaticByteField"
  external set_static_char_field : Jni.clazz -> Jni.fieldID -> int -> unit
    = "camljava_SetStaticCharField"
  external set_static_short_field : Jni.clazz -> Jni.fieldID -> int -> unit
    = "camljava_SetStaticShortField"
  external set_static_int_field : Jni.clazz -> Jni.fieldID -> int32 -> unit
    = "camljava_SetStaticIntField"
  external set_static_camlint_field : Jni.clazz -> Jni.fieldID -> int -> unit
    = "camljava_SetStaticCamlintField"
  external set_static_long_field : Jni.clazz -> Jni.fieldID -> int64 -> unit
    = "camljava_SetStaticLongField"
  external set_static_float_field : Jni.clazz -> Jni.fieldID -> float -> unit
    = "camljava_SetStaticFloatField"
  external set_static_double_field :
    Jni.clazz -> Jni.fieldID -> float -> unit
    = "camljava_SetStaticFloatField"
  type argument =
      Boolean of bool
    | Byte of int
    | Char of int
    | Short of int
    | Camlint of int
    | Int of int32
    | Long of int64
    | Float of float
    | Double of float
    | Obj of Jni.obj
  external call_object_method :
    Jni.obj -> Jni.methodID -> Jni.argument array -> Jni.obj
    = "camljava_CallObjectMethod"
  external call_boolean_method :
    Jni.obj -> Jni.methodID -> Jni.argument array -> bool
    = "camljava_CallBooleanMethod"
  external call_byte_method :
    Jni.obj -> Jni.methodID -> Jni.argument array -> int
    = "camljava_CallByteMethod"
  external call_char_method :
    Jni.obj -> Jni.methodID -> Jni.argument array -> int
    = "camljava_CallCharMethod"
  external call_short_method :
    Jni.obj -> Jni.methodID -> Jni.argument array -> int
    = "camljava_CallShortMethod"
  external call_int_method :
    Jni.obj -> Jni.methodID -> Jni.argument array -> int32
    = "camljava_CallIntMethod"
  external call_camlint_method :
    Jni.obj -> Jni.methodID -> Jni.argument array -> int
    = "camljava_CallCamlintMethod"
  external call_long_method :
    Jni.obj -> Jni.methodID -> Jni.argument array -> int64
    = "camljava_CallLongMethod"
  external call_float_method :
    Jni.obj -> Jni.methodID -> Jni.argument array -> float
    = "camljava_CallFloatMethod"
  external call_double_method :
    Jni.obj -> Jni.methodID -> Jni.argument array -> float
    = "camljava_CallDoubleMethod"
  external call_void_method :
    Jni.obj -> Jni.methodID -> Jni.argument array -> unit
    = "camljava_CallVoidMethod"
  external call_static_object_method :
    Jni.clazz -> Jni.methodID -> Jni.argument array -> Jni.obj
    = "camljava_CallStaticObjectMethod"
  external call_static_boolean_method :
    Jni.clazz -> Jni.methodID -> Jni.argument array -> bool
    = "camljava_CallStaticBooleanMethod"
  external call_static_byte_method :
    Jni.clazz -> Jni.methodID -> Jni.argument array -> int
    = "camljava_CallStaticByteMethod"
  external call_static_char_method :
    Jni.clazz -> Jni.methodID -> Jni.argument array -> int
    = "camljava_CallStaticCharMethod"
  external call_static_short_method :
    Jni.clazz -> Jni.methodID -> Jni.argument array -> int
    = "camljava_CallStaticShortMethod"
  external call_static_int_method :
    Jni.clazz -> Jni.methodID -> Jni.argument array -> int32
    = "camljava_CallStaticIntMethod"
  external call_static_camlint_method :
    Jni.clazz -> Jni.methodID -> Jni.argument array -> int
    = "camljava_CallStaticCamlintMethod"
  external call_static_long_method :
    Jni.clazz -> Jni.methodID -> Jni.argument array -> int64
    = "camljava_CallStaticLongMethod"
  external call_static_float_method :
    Jni.clazz -> Jni.methodID -> Jni.argument array -> float
    = "camljava_CallStaticFloatMethod"
  external call_static_double_method :
    Jni.clazz -> Jni.methodID -> Jni.argument array -> float
    = "camljava_CallStaticDoubleMethod"
  external call_static_void_method :
    Jni.clazz -> Jni.methodID -> Jni.argument array -> unit
    = "camljava_CallStaticVoidMethod"
  external call_nonvirtual_object_method :
    Jni.obj -> Jni.clazz -> Jni.methodID -> Jni.argument array -> Jni.obj
    = "camljava_CallNonvirtualObjectMethod"
  external call_nonvirtual_boolean_method :
    Jni.obj -> Jni.clazz -> Jni.methodID -> Jni.argument array -> bool
    = "camljava_CallNonvirtualBooleanMethod"
  external call_nonvirtual_byte_method :
    Jni.obj -> Jni.clazz -> Jni.methodID -> Jni.argument array -> int
    = "camljava_CallNonvirtualByteMethod"
  external call_nonvirtual_char_method :
    Jni.obj -> Jni.clazz -> Jni.methodID -> Jni.argument array -> int
    = "camljava_CallNonvirtualCharMethod"
  external call_nonvirtual_short_method :
    Jni.obj -> Jni.clazz -> Jni.methodID -> Jni.argument array -> int
    = "camljava_CallNonvirtualShortMethod"
  external call_nonvirtual_int_method :
    Jni.obj -> Jni.clazz -> Jni.methodID -> Jni.argument array -> int32
    = "camljava_CallNonvirtualIntMethod"
  external call_nonvirtual_camlint_method :
    Jni.obj -> Jni.clazz -> Jni.methodID -> Jni.argument array -> int
    = "camljava_CallNonvirtualCamlintMethod"
  external call_nonvirtual_long_method :
    Jni.obj -> Jni.clazz -> Jni.methodID -> Jni.argument array -> int64
    = "camljava_CallNonvirtualLongMethod"
  external call_nonvirtual_float_method :
    Jni.obj -> Jni.clazz -> Jni.methodID -> Jni.argument array -> float
    = "camljava_CallNonvirtualFloatMethod"
  external call_nonvirtual_double_method :
    Jni.obj -> Jni.clazz -> Jni.methodID -> Jni.argument array -> float
    = "camljava_CallNonvirtualDoubleMethod"
  external call_nonvirtual_void_method :
    Jni.obj -> Jni.clazz -> Jni.methodID -> Jni.argument array -> unit
    = "camljava_CallNonvirtualVoidMethod"
  external get_array_length : Jni.obj -> int = "camljava_GetArrayLength"
  external new_object_array : int -> Jni.clazz -> Jni.obj
    = "camljava_NewObjectArray"
  external get_object_array_element : Jni.obj -> int -> Jni.obj
    = "camljava_GetObjectArrayElement"
  external set_object_array_element : Jni.obj -> int -> Jni.obj -> unit
    = "camljava_SetObjectArrayElement"
  external new_boolean_array : int -> Jni.obj = "camljava_NewBooleanArray"
  external get_boolean_array_element : Jni.obj -> int -> bool
    = "camljava_GetBooleanArrayElement"
  external set_boolean_array_element : Jni.obj -> int -> bool -> unit
    = "camljava_SetBooleanArrayElement"
  external new_byte_array : int -> Jni.obj = "camljava_NewByteArray"
  external get_byte_array_element : Jni.obj -> int -> int
    = "camljava_GetByteArrayElement"
  external set_byte_array_element : Jni.obj -> int -> int -> unit
    = "camljava_SetByteArrayElement"
  external get_byte_array_region :
    Jni.obj -> int -> string -> int -> int -> unit
    = "camljava_GetByteArrayRegion"
  external set_byte_array_region :
    string -> int -> Jni.obj -> int -> int -> unit
    = "camljava_SetByteArrayRegion"
  external new_char_array : int -> Jni.obj = "camljava_NewCharArray"
  external get_char_array_element : Jni.obj -> int -> int
    = "camljava_GetCharArrayElement"
  external set_char_array_element : Jni.obj -> int -> int -> unit
    = "camljava_SetCharArrayElement"
  external new_short_array : int -> Jni.obj = "camljava_NewShortArray"
  external get_short_array_element : Jni.obj -> int -> int
    = "camljava_GetShortArrayElement"
  external set_short_array_element : Jni.obj -> int -> int -> unit
    = "camljava_SetShortArrayElement"
  external new_int_array : int -> Jni.obj = "camljava_NewIntArray"
  external get_int_array_element : Jni.obj -> int -> int32
    = "camljava_GetIntArrayElement"
  external set_int_array_element : Jni.obj -> int -> int32 -> unit
    = "camljava_SetIntArrayElement"
  external get_camlint_array_element : Jni.obj -> int -> int
    = "camljava_GetCamlintArrayElement"
  external set_camlint_array_element : Jni.obj -> int -> int -> unit
    = "camljava_SetCamlintArrayElement"
  external new_long_array : int -> Jni.obj = "camljava_NewLongArray"
  external get_long_array_element : Jni.obj -> int -> int64
    = "camljava_GetLongArrayElement"
  external set_long_array_element : Jni.obj -> int -> int64 -> unit
    = "camljava_SetLongArrayElement"
  external new_float_array : int -> Jni.obj = "camljava_NewFloatArray"
  external get_float_array_element : Jni.obj -> int -> float
    = "camljava_GetFloatArrayElement"
  external set_float_array_element : Jni.obj -> int -> float -> unit
    = "camljava_SetFloatArrayElement"
  external new_double_array : int -> Jni.obj = "camljava_NewDoubleArray"
  external get_double_array_element : Jni.obj -> int -> float
    = "camljava_GetDoubleArrayElement"
  external set_double_array_element : Jni.obj -> int -> float -> unit
    = "camljava_SetDoubleArrayElement"
  val wrap_object : < .. > -> Jni.obj
end