对于用 C 编写的基于 GLib 的库,您可以尝试从 C 源代码生成 gir 文件:Vala/Bindings。
手动操作也没问题。假设您有一个库,该库在 C 中定义 SomelibClass1,其中包含一个名为 do_something 的方法,该方法接受一个字符串。头文件的名称是“somelib.h”。那么对应的vapi就简单如下:
一些lib.vapi:
[CCode (cheader_filename="somelib.h")]
namespace Somelib {
public class Class1 {
public void do_something (string str);
}
}
可以在此处找到为非 GLib 库编写 vapi 的文档:Vala/LegacyBindings
这实际上很容易。让我们从 posix.vapi 中摘录:
[Compact]
[CCode (cname = "FILE", free_function = "fclose", cheader_filename = "stdio.h")]
public class FILE {
[CCode (cname = "fopen")]
public static FILE? open (string path, string mode);
[CCode (cname = "fgets", instance_pos = -1)]
public unowned string? gets (char[] s);
}
这实现了以下 C 函数:
FILE *fopen (const char *path, const char *mode);
char *fgets (char *s, int size, FILE *stream);
丢弃 instance_pos 属性时,vala 假定对象是方法的第一个参数。这样就可以绑定大致面向对象的 c 结构。当对象被取消引用时,紧凑类的 free_method 被调用。
方法、类、结构等的 CCode(cname) 属性必须是它的名称,就像它在 C 中一样。
这个主题还有很多内容,但这应该会给你一个大致的概述。