• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #![allow(dead_code)]
2 
3 use jni::{
4     errors::*,
5     objects::{GlobalRef, JValue},
6     sys::jint,
7     Executor, JNIEnv,
8 };
9 
10 /// A test example of a native-to-JNI proxy
11 #[derive(Clone)]
12 pub struct AtomicIntegerProxy {
13     exec: Executor,
14     obj: GlobalRef,
15 }
16 
17 impl AtomicIntegerProxy {
18     /// Creates a new instance of `AtomicIntegerProxy`
new(exec: Executor, init_value: jint) -> Result<Self>19     pub fn new(exec: Executor, init_value: jint) -> Result<Self> {
20         let obj = exec.with_attached(|env: &mut JNIEnv| {
21             let i = env.new_object(
22                 "java/util/concurrent/atomic/AtomicInteger",
23                 "(I)V",
24                 &[JValue::from(init_value)],
25             )?;
26             env.new_global_ref(i)
27         })?;
28         Ok(AtomicIntegerProxy { exec, obj })
29     }
30 
31     /// Gets a current value from java object
get(&mut self) -> Result<jint>32     pub fn get(&mut self) -> Result<jint> {
33         self.exec
34             .with_attached(|env| env.call_method(&self.obj, "get", "()I", &[])?.i())
35     }
36 
37     /// Increments a value of java object and then gets it
increment_and_get(&mut self) -> Result<jint>38     pub fn increment_and_get(&mut self) -> Result<jint> {
39         self.exec.with_attached(|env| {
40             env.call_method(&self.obj, "incrementAndGet", "()I", &[])?
41                 .i()
42         })
43     }
44 
45     /// Adds some value to the value of java object and then gets a resulting value
add_and_get(&mut self, delta: jint) -> Result<jint>46     pub fn add_and_get(&mut self, delta: jint) -> Result<jint> {
47         let delta = JValue::from(delta);
48         self.exec.with_attached(|env| {
49             env.call_method(&self.obj, "addAndGet", "(I)I", &[delta])?
50                 .i()
51         })
52     }
53 }
54