use crate::sys::{jbyte, JNI_ABORT};
use log::debug;
use crate::{errors::*, objects::JObject, JNIEnv};
use std::ptr::NonNull;
#[derive(Clone, Copy)]
#[repr(i32)]
pub enum ReleaseMode {
CopyBack = 0,
NoCopyBack = JNI_ABORT,
}
pub struct AutoByteArray<'a: 'b, 'b> {
obj: JObject<'a>,
ptr: NonNull<jbyte>,
mode: ReleaseMode,
is_copy: bool,
env: &'b JNIEnv<'a>,
}
impl<'a, 'b> AutoByteArray<'a, 'b> {
pub fn new(
env: &'b JNIEnv<'a>,
obj: JObject<'a>,
ptr: *mut jbyte,
mode: ReleaseMode,
is_copy: bool,
) -> Result<Self> {
Ok(AutoByteArray {
obj,
ptr: NonNull::new(ptr).ok_or_else(|| ErrorKind::NullPtr("Non-null ptr expected"))?,
mode,
is_copy,
env,
})
}
pub fn as_ptr(&self) -> *mut jbyte {
self.ptr.as_ptr()
}
pub fn commit(&mut self) {
let res = self
.env
.commit_byte_array_elements(*self.obj, unsafe { self.ptr.as_mut() });
match res {
Ok(()) => {}
Err(e) => debug!("error committing byte array: {:#?}", e),
}
}
pub fn is_copy(&self) -> bool {
self.is_copy
}
}
impl<'a, 'b> Drop for AutoByteArray<'a, 'b> {
fn drop(&mut self) {
let res = self.env.release_byte_array_elements(
*self.obj,
unsafe { self.ptr.as_mut() },
self.mode,
);
match res {
Ok(()) => {}
Err(e) => debug!("error releasing byte array: {:#?}", e),
}
}
}
impl<'a> From<&'a AutoByteArray<'a, '_>> for *mut jbyte {
fn from(other: &'a AutoByteArray) -> *mut jbyte {
other.as_ptr()
}
}