rucaja/
jvm_string.rs

1use jni_sys::jstring;
2use jvm_attachment::JvmAttachment;
3use std::ffi::CStr;
4use std::ffi::CString;
5use std::os::raw::c_char;
6use std::ptr;
7
8
9jvm_wrapper!(JvmString, jstring);
10
11
12impl<'a>  JvmString<'a>  {
13
14    /// Creates and returns a JVM string.
15    pub fn new(jvm_attachment: &'a JvmAttachment, string: &str) -> Option<JvmString<'a>> {
16
17        let string_as_cstring = CString::new(string).unwrap();
18
19        let jvm_string_ptr = unsafe {
20            (**jvm_attachment.jni_environment()).NewStringUTF.unwrap()(
21                jvm_attachment.jni_environment(),
22                string_as_cstring.as_ptr()
23            )
24        };
25
26        JvmString::from_jvm_ptr(jvm_attachment, jvm_string_ptr)
27    }
28}
29
30impl<'a> ToString for JvmString<'a> {
31
32    fn to_string(&self) -> String {
33
34        return unsafe {
35
36            // Allocate a char buffer for the `jstring` in the JVM.
37            let char_buffer: *const c_char =
38                (**self.jvm_attachment.jni_environment()).GetStringUTFChars.unwrap()(
39                    self.jvm_attachment.jni_environment(),
40                    self.jvm_ptr,
41                    ptr::null_mut()
42                );
43
44            // Construct a `String` from that char buffer.
45            let string = CStr::from_ptr(char_buffer).to_str().unwrap().to_string();
46
47            // Deallocate the char buffer.
48            (**self.jvm_attachment.jni_environment()).ReleaseStringUTFChars.unwrap()(
49                self.jvm_attachment.jni_environment(),
50                self.jvm_ptr,
51                char_buffer
52            );
53
54            // Return that `String`.
55            string
56        }
57
58    }
59}