rust - 通过带有 c 绑定的 FFI 公开 Rust 函数
问题描述
我正在创建一个 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
String 应该只是一个字符串化的 json 对象。我想Dart
通过 C 绑定提供给 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
类型转换为 RustString
或&str
. 这样我就可以create_channel
在用 Rust 编写的实际函数中使用它。
作为我应该定义credential
参数的类型以及如何将其转换c_char
为String
或&str?
解决方案
Rust 有方便的CStr
和CString
类型,你可以用它Cstr::from_ptr
来包装原始字符串然后调用to_str
它。当然,对于字符串不是有效的 UTF-8 的情况,您需要在此处进行一些错误处理。
推荐阅读
- python - 表示算术表达式的类的简单继承问题
- functional-programming - 允许 F#(或任何函数式语言)在同一输入上多次应用函数的理论漏洞是什么
- javascript - 减少功能有效,但需要太长时间,vue
- android - 在 Android 上手动启用蓝牙 PAN
- ruby-on-rails - Rubocop 禁用自定义警察的缓存
- visual-studio - 如何让 Visual Studio 中的 Intel Parallel 运行 .f77、.f95 等?
- java - 无法托管 MP4 com.sun HttpServer
- python-3.x - ffmpeg中的自定义颜色空间转换?
- python-3.x - 在 Python 中按色调和类别自定义颜色
- java - 如何使用 maven 和 java 将一个 google .proto 导入另一个