use std::{char, iter, slice};
use jni_sys::*;
use crate::Env;
pub struct StringChars<'env> {
env: Env<'env>,
string: jstring,
chars: *const jchar,
length: jsize, }
impl<'env> StringChars<'env> {
pub unsafe fn from_env_jstring(env: Env<'env>, string: jstring) -> Self {
debug_assert!(!string.is_null());
let chars = env.get_string_chars(string);
let length = env.get_string_length(string);
Self {
env,
string,
chars,
length,
}
}
pub fn chars(&self) -> &[jchar] {
unsafe { slice::from_raw_parts(self.chars, self.length as usize) }
}
pub fn decode(&self) -> char::DecodeUtf16<iter::Cloned<slice::Iter<u16>>> {
char::decode_utf16(self.chars().iter().cloned())
}
pub fn to_string(&self) -> Result<String, char::DecodeUtf16Error> {
self.decode().collect()
}
pub fn to_string_lossy(&self) -> String {
self.decode()
.map(|r| r.unwrap_or(char::REPLACEMENT_CHARACTER))
.collect()
}
}
impl<'env> Drop for StringChars<'env> {
fn drop(&mut self) {
unsafe { self.env.release_string_chars(self.string, self.chars) };
}
}