blob: cea7f2a79ad50dec876de8278c92558d9547169e [file] [log] [blame]
#![allow(dead_code)]
use jni::{
errors::*,
objects::{GlobalRef, JValue},
sys::jint,
Executor, JNIEnv,
};
/// A test example of a native-to-JNI proxy
#[derive(Clone)]
pub struct AtomicIntegerProxy {
exec: Executor,
obj: GlobalRef,
}
impl AtomicIntegerProxy {
/// Creates a new instance of `AtomicIntegerProxy`
pub fn new(exec: Executor, init_value: jint) -> Result<Self> {
let obj = exec.with_attached(|env: &mut JNIEnv| {
let i = env.new_object(
"java/util/concurrent/atomic/AtomicInteger",
"(I)V",
&[JValue::from(init_value)],
)?;
env.new_global_ref(i)
})?;
Ok(AtomicIntegerProxy { exec, obj })
}
/// Gets a current value from java object
pub fn get(&mut self) -> Result<jint> {
self.exec
.with_attached(|env| env.call_method(&self.obj, "get", "()I", &[])?.i())
}
/// Increments a value of java object and then gets it
pub fn increment_and_get(&mut self) -> Result<jint> {
self.exec.with_attached(|env| {
env.call_method(&self.obj, "incrementAndGet", "()I", &[])?
.i()
})
}
/// Adds some value to the value of java object and then gets a resulting value
pub fn add_and_get(&mut self, delta: jint) -> Result<jint> {
let delta = JValue::from(delta);
self.exec.with_attached(|env| {
env.call_method(&self.obj, "addAndGet", "(I)I", &[delta])?
.i()
})
}
}