diff --git a/wie_ktf/src/runtime/java/context.rs b/wie_ktf/src/runtime/java/context.rs index 34865083..837939a1 100644 --- a/wie_ktf/src/runtime/java/context.rs +++ b/wie_ktf/src/runtime/java/context.rs @@ -111,6 +111,10 @@ impl<'a> KtfJavaContext<'a> { } pub async fn register_class(core: &mut ArmCore, class: &JavaClass) -> JavaResult<()> { + if JavaContextData::has_class(core, class)? { + return Ok(()); + } + JavaContextData::register_class(core, class)?; let clinit = class.method(&JavaFullName { diff --git a/wie_ktf/src/runtime/java/context/context_data.rs b/wie_ktf/src/runtime/java/context/context_data.rs index 22fa755a..448c4ec6 100644 --- a/wie_ktf/src/runtime/java/context/context_data.rs +++ b/wie_ktf/src/runtime/java/context/context_data.rs @@ -59,7 +59,7 @@ impl JavaContextData { pub fn register_class(core: &mut ArmCore, class: &JavaClass) -> JavaResult<()> { let context_data = Self::read(core)?; - let ptr_classes: alloc::vec::Vec = read_null_terminated_table(core, context_data.classes_base)?; + let ptr_classes = read_null_terminated_table(core, context_data.classes_base)?; if ptr_classes.contains(&class.ptr_raw) { return Ok(()); } @@ -71,6 +71,13 @@ impl JavaContextData { ) } + pub fn has_class(core: &ArmCore, class: &JavaClass) -> JavaResult { + let context_data = Self::read(core)?; + let ptr_classes = read_null_terminated_table(core, context_data.classes_base)?; + + Ok(ptr_classes.contains(&class.ptr_raw)) + } + pub fn find_class(core: &ArmCore, name: &str) -> JavaResult> { let context_data = Self::read(core)?; let classes = read_null_terminated_table(core, context_data.classes_base)?;