ffi 相关问题

外部函数接口(FFI)是一种语言与用另一种语言编写的软件交互的机制。

使用ImageStream时无法在CameraController中获取bgra8888格式

我正在使用 startImageStream 逐帧获取,但我想避免使用 C++ 代码(使用 ffi)将 YUV420 转换为 RGB,这会增加大量开销。所以我有我们...

回答 1 投票 0

如何在 Rust 中处理指向 C 字符串数组的指针?

我正在尝试在 C++ 库上编写一个 Rust 包装器,其中指向 C 样式字符串数组的指针定义为: 字符 *** 名称; 在 C++ 中,我可以轻松地迭代字符串: for(int i=0;i 我正在尝试在 C++ 库上编写一个 Rust 包装器,其中指向 C 样式字符串数组的指针定义为: char ***name; 在 C++ 中,我可以轻松地迭代字符串: for(int i=0;i<n;++i) std::cout << std::string(*(name[i])) << std::endl; 给出正确的结果。 但是,在 Rust 中我不知道如何正确地做到这一点。 与 C++ 库的绑定由 bindgen 正确生成,并且 name 显示为 pub name: *mut *mut *mut ::std::os::raw::c_char 所以,我正在尝试以下方法: // Get a slice of pointers to strings of size n, n is known and is correct // The type of names is &[*mut i8] let names = unsafe{ std::slice::from_raw_parts(*(name), n) }; // Iterates over a slice. ptr: &*mut i8 for ptr in names.iter() { // Constructs a c-string from *mut i8 let cs = unsafe{ CStr::from_ptr(*ptr) }; // Shoud print a string, but gives rubbish instead println!("{:?}",cs); } 但是这会打印垃圾,所有输出行都相同且大小为 2,而字符串不同且长度不同: "\x90\"" "\x90\"" "\x90\"" "\x90\"" "\x90\"" "\x90\"" 我肯定遗漏了一些明显的东西,但找不到任何错误。如有任何帮助,我们将不胜感激! 您的 Rust 代码似乎是正确的。 这是对情况的模拟,内存布局与您的描述相符。 也许C端的实际布局并不完全是你描述的那样。 在我看来,第一级参考(指针)是不需要的,但我不知道您的用例的实际需要。 use std::ffi::{c_char, CStr}; fn prepare_name_vec() -> Vec<*const c_char> { ["one\0", "two\0", "three\0", "four\0"] // static nul-terminated strings .iter() .map(|s| s.as_ptr() as *const _) // u8 ptr to u8 ptr .collect() } fn read_names_from_c( names: *const *const *const c_char, n: usize, ) { /* names *names c_str char *** •~~> char ** •~~> [char * •~~> ['o', 'n', 'e', '\0'] ,char * •~~> ['t', 'w', 'o', '\0'] ,char * •~~> ['t', 'h', 'r', 'e', 'e', '\0'] char * ] •~~> ['f', 'o', 'o', 'r', '\0'] */ let name_slice = unsafe { std::slice::from_raw_parts(*names, n) }; for c_ptr in name_slice.iter() { let c_str = unsafe { CStr::from_ptr(*c_ptr) }; println!("{:?}", c_str); } } fn main() { let name_vec = prepare_name_vec(); let names: *const *const *const c_char = &name_vec.as_ptr() as *const _; let n = name_vec.len(); read_names_from_c(names, n); }

回答 1 投票 0

Java 巴拿马 FFI,从 SDL_Vulkan_GetInstanceExtensions 读取 (char **)

这是我尝试运行的示例代码,SDL.h 和 SDL_Vulkan.h 都是用 JExtract 提取的 我遇到的问题是获取声明为 char** 的 pName,我对 java 的理解...

回答 1 投票 0

使用luajit和fii库遇到问题

在LuaJIT中,so是通过fii库加载的,并调用so中的函数,但是在加载的so中,一些方法使用的变量是通过extern定义的。例如,空调...

回答 1 投票 0

原始表示中的 Rust 枚举

我最近通读了《类型布局》,对枚举上原始表示的描述感到惊讶。 请参阅带有字段的枚举的原始表示和组合

回答 2 投票 0

FFI:如何将C中的指针传递给C函数?

我很难理解如何正确使用libffi(函数外部接口库)。我有以下程序,它使用 libffi 动态调用函数 my_func: #包括 我很难理解如何正确使用libffi(函数外部接口库)。我有以下程序,它使用 my_func 动态调用函数 libffi: #include <stdio.h> #include <stdlib.h> #include <ffi.h> unsigned my_func(double a, double b, double *res) { res[0] = a + b; res[1] = a - b; return 0; } int main(int argc, char *argv[]) { ffi_cif cif; ffi_type *arg_types[3] = { &ffi_type_double, &ffi_type_double, &ffi_type_pointer }; ffi_type *rettype = &ffi_type_uint; if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, rettype, arg_types) != FFI_OK) { fprintf(stderr, "ffi_prep_cif is not successful\n"); exit(EXIT_FAILURE); } double a = 3.0; double b = 2.0; double res[2] = {99.0, 15.0}; void *arg_values[3] = { &a, &b, res }; unsigned status; ffi_call(&cif, FFI_FN(my_func), &status, arg_values); printf("Function return status code %u\n", status); printf("Values in res array: \n"); printf("[0] = %f\n", res[0]); printf("[1] = %f\n", res[1]); return 0; } 当我调试程序时,似乎所有arg_values都设置正确: (gdb) p ((double *) arg_values[2])[0] $1 = 99 (gdb) p ((double *) arg_values[2])[1] $2 = 15 您可以在上面看到,arg_values第三个值已正确设置为res数组。 但是,当我在函数 my_func 内部时,第三个参数(res数组)变为NULL: Breakpoint 2, my_func (a=3, b=2, res=0x0) at test_ffi.c:6 6 res[0] = a + b; 我真的不明白这里出了什么问题。有人可以向我解释一下为什么会发生这种情况以及如何解决它吗?谢谢! 这不应该吗: if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, rettype, arg_types) != FFI_OK) 是这样的: if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, rettype, arg_types) != FFI_OK) 毕竟,arg_values 是 3 项,而不是 2 项。

回答 1 投票 0

即使 gem install ffi 成功,由于 ff1 gem,捆绑包安装也会失败

我所做的步骤 安装 rbenv - 安装成功 rbenv安装3.1.2 安装捆绑器 gem - 成功 gem 安装捆绑器 运行捆绑安装命令 - 失败 捆绑安装 输出:

回答 1 投票 0

如何使用 JNR-FFI 在 Rust 和 Java 之间传递数组?

大多数在 Java 和 Rust 之间传递数组(例如 byte[])的示例都涉及使用 jbyteArray,但需要 JNI 环境。使用 JNR-FFI 时(大概不需要写

回答 0 投票 0

使用本机扩展安装 ffi 1.15.5 构建本机扩展

使用本机扩展安装 ffi 1.15.5 构建本机扩展 使用本机扩展安装 ffi 1.15.5 构建本机扩展:'--enable-system-libffi' 这可能需要一段时间...

回答 2 投票 0

electron中如何防止回调函数StackOverflow

我对回调函数有疑问。 当我刚开始运行electron的时候,会有正常的回调输出。但是过了一段时间(这段时间发生了touch事件),就报错了...

回答 0 投票 0

将 &str 复制到 Rust 中的数组指针中

我有一个 FFI 函数,它分配并返回一个指向已知长度数组的 *mut ::std::os::raw::c_char。我还有一个 s: &str ,它是一个 Rust 字符串。我只是想复制

回答 2 投票 0

来自 C++ 的函数没有接收到在 Rust 中调用的正确参数

我正在尝试将 *.cc 链接到 rust。 构建.rs: fn 主(){ 抄送::建立::新() .file("src/bindings.cc") .cargo_metadata(真) .cpp(真) .compile("bindi...

回答 0 投票 0

bundle 安装不成功无法安装 ffi 1.9.9 osx 10.9

捆绑安装 从 https://rubygems.org/ 获取 gem 元数据...................... 从 https://rubygems.org/ 获取 gem 元数据.. 解决依赖... 输入您的密码以安装bu ...

回答 7 投票 0

如何调用从 csharp 获取结构指针参数的 c lib fn

从c头中提取: 结构 ArgvArgcResult { 字符*缓冲区; 字符** argv; 单位argc; }; bool get_argv_and_argc_of_pid(pid_t pid, struct ArgvArgcResult* 结果); 值得注意的是 c"string...

回答 1 投票 0

如何将 rust 字符串转换为 i8(c_char) 数组?

我在用rust调用c++,有bindgen和cc生成的struct。结构字段类型类似于 [i8;11] 或 [i8;n]。我想设置这些字段。 如何编写一个通用函数来转换...

回答 0 投票 0

如何将 C++ 枚举转换为 Rust 枚举?

我正在处理 rust-c++ ffi,我有一个像这样的 C++ 枚举: 枚举类代码:int { 成功 = 0, 失败的, 全= 10000, 未找到, } 我想在生锈中使用这个枚举,这样任何修改...

回答 0 投票 0

访问 flutter asset 到本地共享库

我在用 flutter 开发的项目中使用本机代码 (c++11)。但我需要访问本机代码中的资产。该文件是经过训练的数据模型,扩展名为 .bin 。你能帮助我吗? ...

回答 0 投票 0

从 rust 到 go 的回调函数

我正在尝试创造从 Go 调用 Rust 函数的可能性,然后说 rust 函数将函数回调回 Go。我使用 CGO 作为 Go 和 Rust 之间的 FFI 接口。 以下...

回答 0 投票 0

将原始可变指针传递给 C FFI 后出现意外值

我正在尝试为 C 函数创建一个 FFI,该函数采用指向结构的指针并对其进行修改。我已经测试了 C 代码并获得了我期望的值,但是当我尝试打印这些值时......

回答 1 投票 0

如何使用 Guile Scheme 加载国外库?

我想使用我用 C 编写并使用 gcc -shared -o libsum.so sum.c 编译成库的函数,但我不知道如何加载库并从方案

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.