diff --git a/macros/src/java.rs b/macros/src/java.rs index b73911d..d6e2f68 100644 --- a/macros/src/java.rs +++ b/macros/src/java.rs @@ -238,9 +238,9 @@ 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! {Self::CLASS} + quote! {droid_wrap_utils::load_class(Self::CLASS)?} }; let ret_form = get_type_form(&ret_type, &None); 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(); } 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