rust-jni 0.1.0

A package for easy Java interop
Documentation
extern crate jni_sys;
extern crate rust_jni;

#[cfg(test)]
mod native_method_env {
    use rust_jni::__generator::*;
    use rust_jni::{self, *};
    use std::mem;
    use std::ptr;

    unsafe fn check_exception_message(env: &JniEnv, message: &str, token: &NoException) {
        let raw_env = env.raw_env();
        let exception_occured_fn = (**raw_env).ExceptionOccurred.unwrap();
        let throwable = exception_occured_fn(raw_env);
        assert_ne!(throwable, ptr::null_mut());

        let exception_clear_fn = (**raw_env).ExceptionClear.unwrap();
        exception_clear_fn(raw_env);

        let throwable = java::lang::Throwable::__from_jni(&env, throwable);
        let actual_message = throwable.get_message(&token).unwrap();
        assert_eq!(actual_message.as_string(&token), message);
        mem::forget(throwable);
    }

    #[test]
    fn test() {
        let init_arguments = InitArguments::get_default(JniVersion::V8).unwrap();
        let vm = JavaVM::create(&init_arguments).unwrap();
        let env = vm.attach(&AttachArguments::new(&init_arguments)).unwrap();
        let token = env.token();

        unsafe {
            // Result in the callback.

            let raw_env = env.raw_env();
            let result = 10;
            let actual_result =
                rust_jni::__generator::native_method_wrapper(raw_env, |native_env, _| {
                    assert_eq!(native_env.raw_jvm(), vm.raw_jvm());
                    assert_eq!(native_env.raw_env(), raw_env);
                    assert_eq!(native_env.version(), init_arguments.version());
                    Ok(result)
                });
            assert_eq!(actual_result, result);

            // Exception in the callback.

            let message = "test-message";
            let actual_result: i32 =
                rust_jni::__generator::native_method_wrapper(raw_env, |native_env, token| {
                    assert_eq!(native_env.raw_jvm(), vm.raw_jvm());
                    assert_eq!(native_env.raw_env(), raw_env);
                    assert_eq!(native_env.version(), init_arguments.version());
                    let message = java::lang::String::new(native_env, message, &token).unwrap();
                    Err(java::lang::Throwable::new(native_env, &message, &token).unwrap())
                });
            assert_eq!(actual_result, i32::default());
            check_exception_message(&env, message, &token);

            // Panic in the callback.

            let actual_result: i32 =
                rust_jni::__generator::native_method_wrapper(raw_env, |native_env, _| {
                    assert_eq!(native_env.raw_jvm(), vm.raw_jvm());
                    assert_eq!(native_env.raw_env(), raw_env);
                    assert_eq!(native_env.version(), init_arguments.version());
                    panic!(message);
                });
            assert_eq!(actual_result, i32::default());
            check_exception_message(&env, &format!("Rust panic: {}", message), &token);
        }
    }
}