如何绑定延迟输出参数?

时间:2013-10-10 20:21:37

标签: vala vapi

通常,C API指针会在Vala绑定中转换为arraysout个参数:

// 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吗?

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

1 个答案:

答案 0 :(得分:2)

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

至于确保数据可用,它看起来不像C API为您提供了一种方法。通常,这可以通过转移所有权来实现,但这需要C API提供一种在不再需要时自动销毁/取消数据的方法。您唯一能做的就是尽量确保VAPI消费者知道在需要时保持数据存活的要求。

Vala往往与精心设计的C API协同工作,但在使用设计不佳的C API时,并不总是能够创建一个好的Vala API。您唯一真正的选择是改进C库或编写一个包装库(在C或Vala中),它代理调用C API,同时提供更合理的API。