Для библиотек на основе GLib, написанных на C, вы можете попытаться сгенерировать gir-файлы из ваших C-источников: Vala / Bindings .
Делать это вручную тоже не проблема. Предположим, у вас есть библиотека, которая определяет SomelibClass1 в C с помощью метода do_something, который принимает строку.
Название файла заголовка - "somelib.h". Тогда соответствующий vapi так же прост, как показано ниже:
somelib.vapi:
[CCode (cheader_filename="somelib.h")]
namespace Somelib {
public class Class1 {
public void do_something (string str);
}
}
Документация по написанию vapis для библиотек не-GLib можно найти здесь: 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.
В этом вопросе есть еще много всего, но это должно дать вам общий обзор.