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