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 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 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 let string = CStr::from_ptr(char_buffer).to_str().unwrap().to_string();
46
47 (**self.jvm_attachment.jni_environment()).ReleaseStringUTFChars.unwrap()(
49 self.jvm_attachment.jni_environment(),
50 self.jvm_ptr,
51 char_buffer
52 );
53
54 string
56 }
57
58 }
59}