From 22482c2b107536fcfeeabfb32193454d9b9d8479 Mon Sep 17 00:00:00 2001 From: yehun Date: Fri, 24 Oct 2025 04:48:41 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=96=B0=E5=A2=9Eload=5Fclass=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/src/lib.rs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/utils/src/lib.rs b/utils/src/lib.rs index 5613ae4..fef20ed 100644 --- a/utils/src/lib.rs +++ b/utils/src/lib.rs @@ -350,6 +350,29 @@ pub fn android_context<'a>() -> JObject<'a> { unsafe { JObject::from_raw(ctx.context().cast()) } } + +/** +加载一个java类。 +*/ +pub fn load_class<'a>(class_name: &str) -> Result> { + let mut env = vm_attach()?; + let activity = android_context(); + let class_loader = env.call_method( + activity, + "getClassLoader", + "()Ljava/lang/ClassLoader;", + &[], + )?; + let cls_name = env.new_string(class_name)?; + let loaded_class = env.call_method( + class_loader.l()?, + "loadClass", + "(Ljava/lang/String;)Ljava/lang/Class;", + &[(&cls_name).into()], + )?; + Ok(loaded_class.l()?.into()) +} + /// 创建一个java动态代理,用于在rust层实现java接口的方法。 /// /// # Arguments From c1f797eeb977568a23340cc81454a955db9bbb5a Mon Sep 17 00:00:00 2001 From: yehun Date: Fri, 24 Oct 2025 04:50:26 +0800 Subject: [PATCH 2/4] =?UTF-8?q?java=5Fmethod=E5=AE=8F=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E6=97=B6=E9=80=9A=E8=BF=87load=5Fclass=E8=8E=B7=E5=8F=96class?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- macros/src/java.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/macros/src/java.rs b/macros/src/java.rs index b73911d..5d959db 100644 --- a/macros/src/java.rs +++ b/macros/src/java.rs @@ -240,7 +240,7 @@ pub(super) fn java_method(attrs: TokenStream, input: TokenStream) -> TokenStream let tt = it.1.clone(); quote! {::CLASS} } else { - quote! {Self::CLASS} + quote! {droid_wrap_utils::load_class(Self::CLASS)?} }; let ret_form = get_type_form(&ret_type, &None); From e7398ac3b58923e6a9b4c0a5faabd0664074709f Mon Sep 17 00:00:00 2001 From: yehun Date: Fri, 24 Oct 2025 05:00:18 +0800 Subject: [PATCH 3/4] =?UTF-8?q?java=5Fmethod=E5=AE=8F=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E6=97=B6=E9=80=9A=E8=BF=87load=5Fclass=E8=8E=B7=E5=8F=96class?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- macros/src/java.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/macros/src/java.rs b/macros/src/java.rs index 5d959db..d6e2f68 100644 --- a/macros/src/java.rs +++ b/macros/src/java.rs @@ -238,7 +238,7 @@ pub(super) fn java_method(attrs: TokenStream, input: TokenStream) -> TokenStream let class_token = if let Some(it) = type_bounds.iter().find(|i| i.0.to_string() == "Self") { let tt = it.1.clone(); - quote! {::CLASS} + quote! {droid_wrap_utils::load_class(::CLASS)?} } else { quote! {droid_wrap_utils::load_class(Self::CLASS)?} }; From e61bc136348773d16a0205e675921e93c4e7142b Mon Sep 17 00:00:00 2001 From: yehun Date: Fri, 24 Oct 2025 23:49:11 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=8A=A5=E9=94=99mismatched=20types?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/java/lang.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/java/lang.rs b/src/java/lang.rs index e69981c..39b20f8 100644 --- a/src/java/lang.rs +++ b/src/java/lang.rs @@ -389,7 +389,10 @@ pub fn test() { System::gc(); let cl = ClassLoader::null().unwrap(); assert_eq!(cl, ClassLoader::null().unwrap()); - let func = RunnableImpl::from_fn(move || println!("Runnable is running.")); + let func = RunnableImpl::from_fn(move || { + println!("Runnable is running."); + Ok(()) + }); let _ = dbg!(func); // System::exit(0).unwrap(); }