使用 C 绑定通过 FFI 公开 Rust 函数
Expose Rust function through FFI with c bindings
我正在创建一个 Rust 库并希望通过 c 绑定公开我的 Rust 函数到 Dart
。这个问题仅与通过 C 绑定实际公开 Rust 函数的设置有关,而不与如何在 Dart
.
中调用它有关
这是我想通过 FFI
:
公开的函数
pub fn create_channel(credential: String) -> Result<String, iota_streams::core::Error> {
let seed = create_seed::new();
// Create the Transport Client
let client = Client::new_from_url(&dotenv::var("URL").unwrap());
let mut author = Author::new(&seed, ChannelType::SingleBranch, client.clone());
// Create the channel with an announcement message. Make sure to save the resulting link somewhere,
let announcement_link = author.send_announce()?;
// This link acts as a root for the channel itself
let ann_link_string = announcement_link.to_string();
// Author will now send signed encrypted messages in a chain
let msg_inputs = vec![credential];
let mut prev_msg_link = announcement_link;
for input in &msg_inputs {
let (msg_link, _seq_link) = author.send_signed_packet(
&prev_msg_link,
&Bytes::default(),
&Bytes(input.as_bytes().to_vec()),
)?;
println!("Sent msg: {}", msg_link);
prev_msg_link = msg_link;
}
Ok(ann_link_string)
}
credential
字符串应该只是一个字符串化的 json 对象。我想通过 C 绑定从 Dart
提供到 Rust,然后在我的 create_channel
函数中使用。但是我不知道如何定义我的 credential
参数的类型,因为它会以 C 类型出现,然后需要转换为 Rust。
#[no_mangle]
pub extern "C" fn create_channel(credential: *const raw::c_char) -> String {
streams::create_channel(credential).unwrap()
}
现在我只是将我的 extern
函数的参数定义为关闭类型 c_char
但我需要将此 C
类型转换为 Rust String
或 &str
。这样我就可以在用 Rust 编写的实际 create_channel
函数中使用它。
我应该将 credential
参数定义为什么类型以及如何将 c_char
转换为 String
或 &str?
Rust 有方便的 CStr
和 CString
类型,你可以在上面使用 Cstr::from_ptr
to wrap the raw string and then call to_str
。当然,对于字符串不是有效 UTF-8 的情况,您需要在此处进行一些错误处理。
我正在创建一个 Rust 库并希望通过 c 绑定公开我的 Rust 函数到 Dart
。这个问题仅与通过 C 绑定实际公开 Rust 函数的设置有关,而不与如何在 Dart
.
中调用它有关
这是我想通过 FFI
:
pub fn create_channel(credential: String) -> Result<String, iota_streams::core::Error> {
let seed = create_seed::new();
// Create the Transport Client
let client = Client::new_from_url(&dotenv::var("URL").unwrap());
let mut author = Author::new(&seed, ChannelType::SingleBranch, client.clone());
// Create the channel with an announcement message. Make sure to save the resulting link somewhere,
let announcement_link = author.send_announce()?;
// This link acts as a root for the channel itself
let ann_link_string = announcement_link.to_string();
// Author will now send signed encrypted messages in a chain
let msg_inputs = vec![credential];
let mut prev_msg_link = announcement_link;
for input in &msg_inputs {
let (msg_link, _seq_link) = author.send_signed_packet(
&prev_msg_link,
&Bytes::default(),
&Bytes(input.as_bytes().to_vec()),
)?;
println!("Sent msg: {}", msg_link);
prev_msg_link = msg_link;
}
Ok(ann_link_string)
}
credential
字符串应该只是一个字符串化的 json 对象。我想通过 C 绑定从 Dart
提供到 Rust,然后在我的 create_channel
函数中使用。但是我不知道如何定义我的 credential
参数的类型,因为它会以 C 类型出现,然后需要转换为 Rust。
#[no_mangle]
pub extern "C" fn create_channel(credential: *const raw::c_char) -> String {
streams::create_channel(credential).unwrap()
}
现在我只是将我的 extern
函数的参数定义为关闭类型 c_char
但我需要将此 C
类型转换为 Rust String
或 &str
。这样我就可以在用 Rust 编写的实际 create_channel
函数中使用它。
我应该将 credential
参数定义为什么类型以及如何将 c_char
转换为 String
或 &str?
Rust 有方便的 CStr
和 CString
类型,你可以在上面使用 Cstr::from_ptr
to wrap the raw string and then call to_str
。当然,对于字符串不是有效 UTF-8 的情况,您需要在此处进行一些错误处理。