【问题标题】:Can you run rust code from a c library being called from rust?您可以从 rust 调用的 c 库中运行 rust 代码吗?
【发布时间】:2014-01-24 21:54:28
【问题描述】:

我查看了rust foreign function interface,并且成功(并且很高兴)可以从我的 rust 代码中调用一个 c 库。

但是,我似乎无法在 c 代码范围内找到有关如何注册回调以调用 rust 代码的任何详细信息。

这可能吗?

作为“你为什么要这样做?”的理由;具体来说,我正在考虑将 lua 或 python 嵌入到 rust 应用程序中,并为在嵌入式运行时上运行的脚本公开一个 scripting-api。

调用这些将类似于以下内容:

  • 主要的 rust 应用程序负载
  • 应用程序使用 ffi 来初始化脚本运行时
  • 应用程序将本地 rust 函数绑定到 C 回调
  • 应用程序调用 ffi 将 C 回调绑定到脚本层
  • 应用程序运行~
  • 定期使用 ffi 触发脚本运行时执行字节码块
  • 脚本代码执行各种琐碎的逻辑并调用绑定句柄
  • 绑定的句柄调用 c 代码
  • 绑定的 c 代码调用本地 rust 代码

除了粗体部分之外的所有这些步骤,我已经设法开始工作,并且我使用调度程序完成了一些琐碎的工作,C 回调将“运行我”命令转储到队列中以及何时控制返回到 rust 作用域,应用程序查询队列并运行其中的命令...

...但是从脚本方面来说有点尴尬,因为它意味着多个嵌套的异步回调,而脚本层的重点是简化需要进入脚本层的代码。

【问题讨论】:

    标签: rust


    【解决方案1】:

    是的,你可以将一个回调函数从 Rust 传递给 C 并在那里调用它。 要知道的主要事情是您必须使用 extern "C" 属性定义函数。

    未经测试的示例(此处没有 Rust 编译器):

    锈面:

    extern "C" fn callback(a:i32) {
        println!("I'm called from C with value {0}", a);
    }
    
    #[link(name = "mylib")]
    extern {
       fn register_callback(cb: extern "C" fn(i32)) -> i32;
    }
    
    fn main() {
        unsafe {
            register_callback(callback);
        }
        ...
    }
    

    C端:

    typedef void (*rust_callback)(int32_t);
    rust_callback cb;
    
    int32_t register_callback(rust_callback callback) {
        cb = callback;
        return 1;
    }
    
    void thread() {
      // do sth
      cb(xyz);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      • 2020-07-16
      • 2010-10-30
      • 2015-09-20
      相关资源
      最近更新 更多