gpt4 book ai didi

rust - 如何从C++填充Rust函数指针

转载 作者:行者123 更新时间:2023-12-03 11:44:26 26 4
gpt4 key购买 nike

我想从Rust调用C++。然后,C++分配并填充缓冲区,然后Rust使用它并取消分配。但是,我想返回函数指针以取消分配数据。这是我尝试的:
在Rust中:

extern "C" {
pub fn openvpn_receive(
instance: *mut OpenVpnInstance,
size: *mut size_t,
deallocate: extern "C" fn(*mut u8),
) -> *mut u8;
}

fn main() {
let size: *mut size_t;
let deallocate = extern "C" fn(*mut u8);
let data: *mut u8 = openvpn_receive(self.instance, size, deallocate);
//use data
deallocate(data);
}
在C++中:
uint8_t* openvpn_receive(size_t *size, void (*deallocate_function)(uint8_t *))
{
deallocate_function = &cpp_deallocate_u8;
uint8*t data = receive_data(size);
}
但是Rust代码无效。我该如何使这种事情发生?

最佳答案

也许会对您有帮助。
https://doc.rust-lang.org/std/keyword.extern.html
https://rust-embedded.github.io/book/interoperability/rust-with-c.html
C++-> C-> rust

use libc::{size_t, c_void};

#[repr(C)]
pub struct OpenVpnInstance();

//#[link(name = "your_c_library")]
extern "C" {
pub fn openvpn_receive(
instance: *mut OpenVpnInstance,
size: *mut size_t,
deallocate: *mut c_void,
) -> *mut u8;
}

pub fn my_callback(arg: *mut u8)
{
println!("CB!");
}

fn main()
{
let size: size_t = 42;
let instance = OpenVpnInstance{};

let dummy_arg: u8 = 42;

unsafe {
let cb = my_callback as *mut c_void;
let instance_ptr = &instance as *const _ as *mut OpenVpnInstance;
let arg_ptr = &dummy_arg as *const _ as *mut u8;
openvpn_receive(instance_ptr, size as *mut size_t, cb);
my_callback(arg_ptr)
}
}

关于rust - 如何从C++填充Rust函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64762818/

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