1

通常 C API 指针被转换为Vala 绑定中的一个arrays或参数:out

// C
void get_user_name (char *buffer, int buffer_length);
void get_user_count (int *count_ptr);
// Vala
public static void get_user_name (uint8[] buffer);
public static void get_user_count (out int count);

我现在遇到了一个将指针用作延迟out参数的情况。

// C
void bind_buffer (void *buffer, int buffer_length, int *length);
int fetch (void);

每次fetch ()调用时,数据都会传输到bufferlength

在 Vala 中绑定这样的 API 的最佳方法是什么?

// Vala
public static void bind_buffer (uint8[] buffer, int *length);
public static int fetch ();

我不认为我可以out int length在这里使用?

此外,我必须确保绑定的数据在整个绑定期间都可用。我怎样才能做到这一点?

4

1 回答 1

2

最后一个例子你基本上是对的。CCode 注释有点偏离(array_length 默认为 true,您不需要包含它,并且 array_pos 不存在。有 array_length_pos,但同样,它实际上不是必需的,因为默认值可以正常工作)。在这种情况下,指针实际上是获取长度的唯一方法。

至于确保数据可用,看起来 C API 并没有为您提供执行此操作的方法。通常,这可以通过转移所有权来实现,但这需要 C API 提供一种在不再需要时自动销毁/取消引用数据的方法。您唯一能做的就是尝试确保 VAPI 使用者知道他们要求数据在需要时保持活动状态。

Vala 往往与设计良好的 C API 一起工作得很好,但是当使用设计不佳的 C API 时,并不总是可以创建一个好的 Vala API。您唯一真正的选择是改进 C 库或编写一个包装器库(在 C 或 Vala 中)代理对 C API 的调用,同时提供更健全的 API。

于 2013-10-10T20:43:51.643 回答