jni-simple 0.4.0

Simple Rust binding for JNI (Java Native Interface) and JVMTI (JVM Tool Interface)
Documentation
#[cfg(feature = "loadjvm")]
#[cfg(feature = "std")]
#[cfg(not(miri))]
pub mod test {
    use jni_simple::*;
    use std::ptr::null_mut;

    #[test]
    fn test() {
        unsafe {
            load_jvm_from_java_home().expect("failed to load jvm");
            let args: Vec<String> = vec!["-Xcheck:jni".to_string()];
            let (vm, env) = JNI_CreateJavaVM_with_string_args(JNI_VERSION_1_8, &args, false).expect("failed to create java VM");
            let class_blob = include_bytes!("../java_testcode/ThrowNew.class");
            let class_loaded = env.DefineClass_from_slice("ThrowNew", null_mut(), class_blob);
            if class_loaded.is_null() {
                env.ExceptionDescribe();
                env.FatalError("failed to load class");
            }

            env.ThrowNew(class_loaded, "Test Message");
            env.ExceptionClear();

            let field = env.GetStaticFieldID(class_loaded, "message", "Ljava/lang/String;");
            let obj = env.GetStaticObjectField(class_loaded, field);
            assert!(!obj.is_null());
            let str = env.GetStringUTFChars_as_string(obj).unwrap();
            assert_eq!(str.as_str(), "Test Message");
            env.DeleteLocalRef(obj);
            env.DeleteLocalRef(class_loaded);
            vm.DestroyJavaVM();
        }
    }
}