当前位置: 首页 > 知识库问答 >
问题:

使用Tokio和Reqwest实现Android的Rust JNI异步回调

琴镜
2023-03-14

我正在用JNI异步执行测试Rust。我想在Rust中执行请求,并用回调将结果异步返回到Android。我正在测试代码来执行命令行中的请求,它工作得很好。

这就是它在命令行上的工作方式:

struct Processor {
    pub(crate) callback: Box<dyn FnMut(String)>,
}

impl Processor {

    fn set_callback(&mut self, c: impl FnMut(String) + 'static) {
        self.callback = Box::new(c);
    }

    fn process_events(&mut self, result: String) {
        (self.callback)(result);
    }
}
const DATA_URL: &str = "https://pokeapi.co/api/v2/pokemon/1/";

#[tokio::main]
pub async fn load_swapi_async_with_cb(callback: Box<dyn FnMut(String)>) -> Result<(), Box<dyn std::error::Error>> {
    println!("load_swload_swapi_async_with_cbapi_async started");
    let mut cb = Processor {
        callback: Box::new(callback),
    };
    let body = reqwest::get(DATA_URL)
        .await?
        .json::<HashMap<String, String>>()
        .await?;
    //println!("{:#?}", body);
    let name = match body.get("name") {
        Some(name) => name,
        None => "Failed to parse"
    }.to_string();

    println!("Name is: {} ", name);
    cb.process_events(name);
    Ok(())
}
    #[no_mangle]
    #[allow(non_snake_case)]
    pub extern "C" fn Java_com_omg_app_greetings_MainActivity_callback(env: JNIEnv,
                                                                       _class: JClass,
                                                                       callback: JObject) {

        static callback: dyn FnMut(String) + 'static = |name| {
        let response = env.new_string(&name).expect("Couldn't create java string!");
            env.call_method(callback, "rustCallbackResult", "(Ljava/lang/String;)V",
                        &[JValue::from(JObject::from(response))]).unwrap();
        };

        pokemon_api(callback);
    }
#[no_mangle]
pub extern fn pokemon_api(callback: impl FnMut(String) + 'static) {
    let cb_box = Box::new(callback);
    swapi::load_swapi_async_with_cb(cb_box);
}
    null
let response = env.new_string(&name).expect("Couldn't create java string!");
   |                        ^^^ non-constant value

    null
static callback: dyn FnMut(String) + 'static = |name| {
   |                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time

我正在检查它是如何工作的,但示例似乎已经过时:*https://github.com/mozilla/rust-android-gradle/blob/master/samples/rust/src/lib.rs

共有1个答案

松钊
2023-03-14

我解决了https://github.com/dushistov/rust_swig的用法问题。集成它后,它将自动生成代码,您可以检查它是如何执行的。

 类似资料:
  • 我有以下问题:我试图从函数调用闭包,但是以后必须调用另一个函数。 我无法创建异步闭包,因为它们目前不稳定: 所以我得以某种方式这样做。 我发现了几个与该问题相关的问题,例如,但是当我试图实现它时,我收到了以下错误: 这里是游乐场链接,希望能显示我有什么问题。 我正在使用标题中所述的tokio。

  • 问题内容: 作为开始使用Android的iOS开发人员,我遇到了Retrofit。我了解如何实现同步请求,但是在通过成功/失败回调实现异步请求时遇到了麻烦。具体来说,我不清楚Callback语法,在Retrofit 网站,介绍Retrofit 的Square 博客文章或我所见过的其他地方都没有具体的示例。有人可以在此发布一些示例代码吗?我在改造仓库中提出了一个问题,要求他们使用此信息更新自述文件。

  • 作为一名开始使用Android的iOS开发者,我遇到了改型。我知道如何实现同步请求,但在使用成功/失败回调实现异步请求时遇到了问题。具体来说,回调语法对我来说并不清楚,在改型网站、介绍改型的方形博客帖子或我见过的其他地方,都没有具体的例子来说明如何做到这一点。有人能在这上面贴些示例代码吗?我在翻新回购中提出了一个问题,要求他们用这些信息更新自述文件。

  • 我正在尝试创建一个回调函数: 首先,我创建了一个函数接口,用于定义回调函数的约定 我创建了一个类,该类将定义一个方法来调用我的回调(我通过使用lambda表达式传递了接口的实现作为对此方法的引用) 下面是我的代码: 但当我运行这段代码时,我得到了这样的结果。 有人能告诉我为什么我会有这个例外吗?

  • 本文向大家介绍Android实现异步加载图片,包括了Android实现异步加载图片的使用技巧和注意事项,需要的朋友参考一下 麦洛开通博客以来,有一段时间没有更新博文了.主要是麦洛这段时间因项目开发实在太忙了.今天周六还在公司加班,苦逼程序猿都是这样生活的. 今天在做项目的时候,有一个实现异步加载图片的功能,虽然比较简单但还是记录一下吧.因为麦洛之前实现异步加载图片都是使用了AsynTask这个AP

  • 本文向大家介绍python使用multiprocessing模块实现带回调函数的异步调用方法,包括了python使用multiprocessing模块实现带回调函数的异步调用方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python使用multiprocessing模块实现带回调函数的异步调用方法。分享给大家供大家参考。具体分析如下: multipressing模块是python 2