库可以通过JavaScript, Python, Lua, Ruby 中的gi模块调用
valac 编译时先生成对应的C文件然后再交给gcc编译
所生成的共享库与C编译生成库一致(C convention function call)
库制作过程中涉及主要文件类型:
.so 共享库
.h 共享库描述文件(C convention)
.vapi Vala使用库描述文件
.gir 供gi 使用的库描述文件的(XML格式)
.typelib 供gi 使用的库描述文件(gtypelib格式,主要为)
调用依赖:
通过其他语言对应的gir调用 ---> typelib ---> *.so
通过vala使用 ---> *.vapi ---> *.h ---> *.so
通过C使用 ---> *.h ---> *.so
例子:
HelloObject.vala
namespace HelloObject{
public string fun() {
return "HelloWorld";
}
}
编译步骤:
1、制作vala动态库,输出相关的.gir,.vapi以及.h
valac -X -fPIC -X -shared --library=HelloObject --gir=HelloObject-0.1.gir -H hellotestlib.h -o libHelloObject.so HelloObject.vala
-X -fPIC 编译为位置无关
-X -shared 编译为共享库
--library vala库文件输出开关,需要同时指定目标vala库的名字,即输出HelloObject.vapi
--gir GI库文件名字
-H 输出目标库的头文件
-o 指定共享库的名字
2、将对应的gir编译为typelib
g-ir-compiler --shared-library=libHelloObject.so --output=HelloObject-0.1.typelib HelloObject-0.1.gir
--shared-library 共享库的名字
--output 输出的typelib名字
Javascript调用测试
hellotest.js
var gir = require("gir");
gir.init();
var HelloObject = gir.load("HelloObject");
console.log(HelloObject.fun());
test
#!/bin/bash
export GI_TYPELIB_PATH=`pwd`
export LD_LIBRARY_PATH=`pwd`
node hellotest.js