jni-bind 0.1.6

Made importing classes from java easy
Documentation

use jni::sys::*;
use jni::objects::JValue;
use jni::JNIEnv;

use crate::{
    IsA,
    JReturnType,
    JBindingType
};


unsafe impl JBindingType for jboolean {
    const SIGNATURE: &'static str = "Z";
    const NAME: &'static str = "boolean";

    unsafe fn to_jvalue(&self) -> jvalue {
        jvalue { z: *self }
    }
    unsafe fn to_jvalue_ref<'obj_ref>(&'obj_ref self) -> JValue<'_, 'obj_ref> {
        JValue::Bool(*self)
    }
}

unsafe impl IsA<jboolean> for jboolean{
    unsafe fn as_ref(&self) -> &jboolean {
        self
    }
}

unsafe impl JReturnType for jboolean {
    const SIGNATURE: &'static str = <Self as JBindingType>::SIGNATURE;
    const NAME: &'static str = <Self as JBindingType>::NAME;
    const JNI_RETURN_TY: jni::signature::ReturnType =
        jni::signature::ReturnType::Primitive(jni::signature::Primitive::Boolean);

    unsafe fn from_jvalue(_env: &mut JNIEnv, value: jvalue) -> Self {
        value.z
    }
}

unsafe impl JBindingType for jbyte {
    const SIGNATURE: &'static str = "B";
    const NAME: &'static str = "byte";

    unsafe fn to_jvalue(&self) -> jvalue {
        jvalue { b: *self }
    }

    unsafe fn to_jvalue_ref<'obj_ref>(&'obj_ref self) -> JValue<'_, 'obj_ref> {
        JValue::Byte(*self)
    }
}

unsafe impl IsA<Self> for jbyte{
    unsafe fn as_ref(&self) -> &Self {
        self
    }
}

unsafe impl JReturnType for jbyte {
    const SIGNATURE: &'static str = <Self as JBindingType>::SIGNATURE;
    const NAME: &'static str = <Self as JBindingType>::NAME;
    const JNI_RETURN_TY: jni::signature::ReturnType =
        jni::signature::ReturnType::Primitive(jni::signature::Primitive::Byte);

    unsafe fn from_jvalue(_env: &mut JNIEnv, value: jvalue) -> Self {
        value.b
    }
}

unsafe impl JBindingType for jchar {
    const SIGNATURE: &'static str = "C";
    const NAME: &'static str = "char";

    unsafe fn to_jvalue(&self) -> jvalue {
        jvalue { c: *self }
    }

    unsafe fn to_jvalue_ref<'obj_ref>(&'obj_ref self) -> JValue<'_, 'obj_ref> {
        JValue::Char(*self)
    }
}

unsafe impl IsA<Self> for jchar{
    unsafe fn as_ref(&self) -> &Self {
        self
    }
}

unsafe impl JReturnType for jchar {
    const SIGNATURE: &'static str = <Self as JBindingType>::SIGNATURE;
    const NAME: &'static str = <Self as JBindingType>::NAME;
    const JNI_RETURN_TY: jni::signature::ReturnType =
        jni::signature::ReturnType::Primitive(jni::signature::Primitive::Char);

    unsafe fn from_jvalue(_env: &mut JNIEnv, value: jvalue) -> Self {
        value.c
    }
}

unsafe impl JBindingType for jshort {
    const SIGNATURE: &'static str = "S";
    const NAME: &'static str = "short";

    unsafe fn to_jvalue(&self) -> jvalue {
        jvalue { s: *self }
    }

    unsafe fn to_jvalue_ref<'obj_ref>(&'obj_ref self) -> JValue<'_, 'obj_ref> {
        JValue::Short(*self)
    }
}

unsafe impl IsA<Self> for jshort{
    unsafe fn as_ref(&self) -> &Self {
        self
    }
}

unsafe impl JReturnType for jshort {
    const SIGNATURE: &'static str = <Self as JBindingType>::SIGNATURE;
    const NAME: &'static str = <Self as JBindingType>::NAME;
    const JNI_RETURN_TY: jni::signature::ReturnType =
        jni::signature::ReturnType::Primitive(jni::signature::Primitive::Short);

    unsafe fn from_jvalue(_env: &mut JNIEnv, value: jvalue) -> Self {
        value.s
    }
}

unsafe impl JBindingType for jint {
    const SIGNATURE: &'static str = "I";
    const NAME: &'static str = "int";

    unsafe fn to_jvalue(&self) -> jvalue {
        jvalue { i: *self }
    }

    unsafe fn to_jvalue_ref<'obj_ref>(&'obj_ref self) -> JValue<'_, 'obj_ref> {
        JValue::Int(*self)
    }
}

unsafe impl IsA<Self> for jint{
    unsafe fn as_ref(&self) -> &Self {
        self
    }
}

unsafe impl JReturnType for jint {
    const SIGNATURE: &'static str = <Self as JBindingType>::SIGNATURE;
    const NAME: &'static str = <Self as JBindingType>::NAME;
    const JNI_RETURN_TY: jni::signature::ReturnType =
        jni::signature::ReturnType::Primitive(jni::signature::Primitive::Int);

    unsafe fn from_jvalue(_env: &mut JNIEnv, value: jvalue) -> Self {
        value.i
    }
}

unsafe impl JBindingType for jlong {
    const SIGNATURE: &'static str = "J";
    const NAME: &'static str = "long";

    unsafe fn to_jvalue(&self) -> jvalue {
        jvalue { j: *self }
    }

    unsafe fn to_jvalue_ref<'obj_ref>(&'obj_ref self) -> JValue<'_, 'obj_ref> {
        JValue::Long(*self)
    }
}

unsafe impl IsA<Self> for jlong{
    unsafe fn as_ref(&self) -> &Self {
        self
    }
}

unsafe impl JReturnType for jlong {
    const SIGNATURE: &'static str = <Self as JBindingType>::SIGNATURE;
    const NAME: &'static str = <Self as JBindingType>::NAME;
    const JNI_RETURN_TY: jni::signature::ReturnType =
        jni::signature::ReturnType::Primitive(jni::signature::Primitive::Long);

    unsafe fn from_jvalue(_env: &mut JNIEnv, value: jvalue) -> Self {
        value.j
    }
}

unsafe impl JBindingType for jfloat {
    const SIGNATURE: &'static str = "F";
    const NAME: &'static str = "float";

    unsafe fn to_jvalue(&self) -> jvalue {
        jvalue { f: *self }
    }

    unsafe fn to_jvalue_ref<'obj_ref>(&'obj_ref self) -> JValue<'_, 'obj_ref> {
        JValue::Float(*self)
    }
}

unsafe impl IsA<Self> for jfloat{
    unsafe fn as_ref(&self) -> &Self {
        self
    }
}

unsafe impl JReturnType for jfloat {
    const SIGNATURE: &'static str = <Self as JBindingType>::SIGNATURE;
    const NAME: &'static str = <Self as JBindingType>::NAME;
    const JNI_RETURN_TY: jni::signature::ReturnType =
        jni::signature::ReturnType::Primitive(jni::signature::Primitive::Float);

    unsafe fn from_jvalue(_env: &mut JNIEnv, value: jvalue) -> Self {
        value.f
    }
}

unsafe impl JBindingType for jdouble {
    const SIGNATURE: &'static str = "D";
    const NAME: &'static str = "double";

    unsafe fn to_jvalue(&self) -> jvalue {
        jvalue { d: *self }
    }

    unsafe fn to_jvalue_ref<'obj_ref>(&'obj_ref self) -> JValue<'_, 'obj_ref> {
        JValue::Double(*self)
    }
}

unsafe impl IsA<Self> for jdouble{
    unsafe fn as_ref(&self) -> &Self {
        self
    }
}

unsafe impl JReturnType for jdouble {
    const SIGNATURE: &'static str = <Self as JBindingType>::SIGNATURE;
    const NAME: &'static str = <Self as JBindingType>::NAME;
    const JNI_RETURN_TY: jni::signature::ReturnType =
        jni::signature::ReturnType::Primitive(jni::signature::Primitive::Double);

    unsafe fn from_jvalue(_env: &mut JNIEnv, value: jvalue) -> Self {
        value.d
    }
}

pub struct JByteArray {
    _obj: jni::objects::GlobalRef,
}

unsafe impl JBindingType for JByteArray {
    const SIGNATURE: &'static str = "[B";
    const NAME: &'static str = "byte[]";

    unsafe fn to_jvalue(&self) -> jvalue {
        jvalue {
            l: self._obj.as_raw(),
        }
    }

    unsafe fn to_jvalue_ref<'obj_ref>(&'obj_ref self) -> JValue<'_, 'obj_ref> {
        JValue::Object(&self._obj)
    }
}

unsafe impl JReturnType for JByteArray {
    const SIGNATURE: &'static str = <Self as JBindingType>::SIGNATURE;
    const NAME: &'static str = <Self as JBindingType>::NAME;
    const JNI_RETURN_TY: jni::signature::ReturnType = jni::signature::ReturnType::Array;

    unsafe fn from_jvalue(env: &mut JNIEnv, value: jvalue) -> Self {
        let o = jni::objects::JByteArray::from_raw(value.l);
        let r = env.new_global_ref(o).expect("failed to create global ref");

        JByteArray {
            _obj: r,
        }
    }
}