extern crate jni_sys;
extern crate rucaja;
use rucaja::{
JNI_FALSE, JNI_TRUE, jvalue_from_jboolean, jvalue_from_jobject, Jvm, JvmAttachment, JvmClass,
JvmMethod, JvmString
};
use std::ptr::null;
fn main() {
let jvm_options = [
];
unsafe {
let jvm = Jvm::new(&jvm_options);
let jvm_attachment = JvmAttachment::new(jvm.jvm());
let class = JvmClass::get_class(&jvm_attachment, "Test").expect("Could not find JVM class");
let println = JvmMethod::get_static_method(
&jvm_attachment,
&class,
"println",
"(Ljava/lang/Object;)V"
).expect("Could not find JVM method");
create_a_java_string(&jvm, &class, &println);
call_static_boolean_method(&jvm, &class);
call_static_object_method(&jvm, &class, &println);
call_static_void_method(&jvm, &class);
}
}
fn call_static_boolean_method(jvm: &Jvm, class: &JvmClass) {
let jvm_method_arguments = [
JNI_FALSE,
JNI_TRUE,
];
unsafe {
let jvm_attachment = JvmAttachment::new(jvm.jvm());
let jvm_method = JvmMethod::get_static_method(
&jvm_attachment,
&class,
"static_method_that_returns_a_boolean",
"(Z)Z"
).expect("Could not find JVM method");
for jvm_method_argument in &jvm_method_arguments {
let args = vec![jvalue_from_jboolean(*jvm_method_argument)];
let result = JvmMethod::call_static_boolean_method(&jvm_attachment, &class, &jvm_method, args.as_ptr());
println!("* `call_static_boolean_method({})`; {:?}", jvm_method_argument, result);
}
}
}
fn call_static_object_method(jvm: &Jvm, class: &JvmClass, println: &JvmMethod) {
let jvm_method_names = [
"static_method_that_returns_a_string",
"static_method_that_returns_an_interned_string"
];
unsafe {
let jvm_attachment = JvmAttachment::new(jvm.jvm());
for jvm_method_name in &jvm_method_names {
let jvm_method = JvmMethod::get_static_method(
&jvm_attachment,
&class,
jvm_method_name,
"()Ljava/lang/String;"
).expect("Could not find JVM method");
let jvm_object = JvmMethod::call_static_object_method(&jvm_attachment, &class, &jvm_method, null()).unwrap();
println!("* `call_static_object_method(): `{}()` returned {:?}`", jvm_method_name, jvm_object.jvm_ptr());
println!("** print the JVM object:");
let args = vec![jvalue_from_jobject(jvm_object.jvm_ptr())];
JvmMethod::call_static_void_method(&jvm_attachment,&class, &println, args.as_ptr());
}
}
}
fn call_static_void_method(jvm: &Jvm, class: &JvmClass) {
unsafe {
let jvm_attachment = JvmAttachment::new(jvm.jvm());
let jvm_method = JvmMethod::get_static_method(
&jvm_attachment,
&class,
"static_void_method",
"()V"
).expect("Could not find JVM method");
JvmMethod::call_static_void_method(&jvm_attachment, &class, &jvm_method, null());
println!("* `call_static_void_method()`");
}
}
fn create_a_java_string(jvm: &Jvm, class: &JvmClass, println: &JvmMethod) {
unsafe {
println!("* `create_a_java_string()`");
let jvm_attachment = JvmAttachment::new(jvm.jvm());
let jvm_string = JvmString::new(&jvm_attachment, "Hello World").expect("Could not create a string");
println!("** print the JVM string:");
let args = vec![jvalue_from_jobject(jvm_string.jvm_ptr())];
JvmMethod::call_static_void_method(&jvm_attachment, &class, &println, args.as_ptr());
}
}