C で記述された GLib ベースのライブラリの場合、C ソースから gir ファイルを生成することができます: Vala/Bindings。
手動でも問題ありません。文字列を受け取る do_something というメソッドを使用して、C で SomelibClass1 を定義するライブラリがあるとします。ヘッダーファイルの名前は「somelib.h」です。次に、対応する vapi は次のように単純です。
somelib.vapi:
[CCode (cheader_filename="somelib.h")]
namespace Somelib {
public class Class1 {
public void do_something (string str);
}
}
GLib 以外のライブラリ用の vapis を作成するためのドキュメントは、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-construct をバインドすることができます。オブジェクトが逆参照されると、コンパクト クラスの free_method が呼び出されます。
メソッド、クラス、構造体などの CCode(cname) 属性は、C での名前と同じでなければなりません。
このテーマには他にもたくさんありますが、これで一般的な概要がわかります。