gpt4 book ai didi

rust - 你能从被 rust 调用的 c 库中运行 rust 代码吗?

转载 作者:行者123 更新时间:2023-11-29 07:43:18 30 4
gpt4 key购买 nike

我查看了 rust foreign function interface ,并成功(并且愉快地)可以从我的 Rust 代码中调用一个 C 库。

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

这可能吗?

作为“你为什么要这么做?”的理由;具体来说,我正在研究将 lua 或 python 嵌入到 Rust 应用程序中,并为在嵌入式运行时上运行的脚本公开脚本 API。

调用这些将按照以下方式进行:

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

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

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

最佳答案

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

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

使用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);
}

关于rust - 你能从被 rust 调用的 c 库中运行 rust 代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20967855/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com