Skip to content

Commit 230c178

Browse files
committed
Add String::getChars
1 parent ad8b477 commit 230c178

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

java_runtime/src/classes/java/lang/string.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ impl String {
4242
JavaMethodProto::new("toString", "()Ljava/lang/String;", Self::to_string, Default::default()),
4343
JavaMethodProto::new("charAt", "(I)C", Self::char_at, Default::default()),
4444
JavaMethodProto::new("getBytes", "()[B", Self::get_bytes, Default::default()),
45+
JavaMethodProto::new("getChars", "(II[CI)V", Self::get_chars, Default::default()),
4546
JavaMethodProto::new("toCharArray", "()[C", Self::to_char_array, Default::default()),
4647
JavaMethodProto::new("toUpperCase", "()Ljava/lang/String;", Self::to_upper_case, Default::default()),
4748
JavaMethodProto::new("length", "()I", Self::length, Default::default()),
@@ -254,6 +255,33 @@ impl String {
254255
Ok(byte_array.into())
255256
}
256257

258+
async fn get_chars(
259+
jvm: &Jvm,
260+
_: &mut RuntimeContext,
261+
this: ClassInstanceRef<Self>,
262+
src_begin: i32,
263+
src_end: i32,
264+
mut dst: ClassInstanceRef<Array<JavaChar>>,
265+
dst_begin: i32,
266+
) -> Result<()> {
267+
tracing::debug!(
268+
"java.lang.String::getChars({:?}, {}, {}, {:?}, {})",
269+
&this,
270+
src_begin,
271+
src_end,
272+
&dst,
273+
dst_begin
274+
);
275+
276+
let value = jvm.get_field(&this, "value", "[C").await?;
277+
278+
let count = src_end - src_begin;
279+
let chars: Vec<JavaChar> = jvm.load_array(&value, src_begin as _, count as _).await?;
280+
jvm.store_array(&mut dst, dst_begin as _, chars).await?;
281+
282+
Ok(())
283+
}
284+
257285
async fn to_char_array(jvm: &Jvm, _: &mut RuntimeContext, this: ClassInstanceRef<Self>) -> Result<ClassInstanceRef<Array<JavaChar>>> {
258286
tracing::debug!("java.lang.String::toCharArray({:?})", &this);
259287

java_runtime/tests/classes/java/lang/test_string.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,3 +148,30 @@ async fn test_last_index_of() -> Result<()> {
148148

149149
Ok(())
150150
}
151+
152+
#[tokio::test]
153+
async fn test_get_chars() -> Result<()> {
154+
let jvm = test_jvm().await?;
155+
156+
let string = JavaLangString::from_rust_string(&jvm, "Hello, 테스트!").await?;
157+
158+
let char_array = jvm.instantiate_array("[C", 11).await?;
159+
160+
let _: () = jvm
161+
.invoke_virtual(&string, "getChars", "(II[CI)V", (0i32, 11i32, char_array.clone(), 0i32))
162+
.await?;
163+
let chars = jvm.load_array::<u16>(&char_array, 0, 11).await?;
164+
let rust_string = String::from_utf16(&chars).unwrap();
165+
assert_eq!(rust_string, "Hello, 테스트!");
166+
167+
let partial_array = jvm.instantiate_array("[C", 4).await?;
168+
169+
let _: () = jvm
170+
.invoke_virtual(&string, "getChars", "(II[CI)V", (7i32, 11i32, partial_array.clone(), 0i32))
171+
.await?;
172+
let chars = jvm.load_array::<u16>(&partial_array, 0, 4).await?;
173+
let rust_string = String::from_utf16(&chars).unwrap();
174+
assert_eq!(rust_string, "테스트!");
175+
176+
Ok(())
177+
}

0 commit comments

Comments
 (0)