迁移指南
1.x to 2.x
API 在 2.x 中进行了一些更改,以减少一些过于“神奇”的行为并减少 C 和类 C 原型之间的语法差异。
如果您使用以下内容,您可能需要更改代码:
回调函数
不透明类型
koffi.introspect()
回调类型改变
在 Koffi 1.x 中,回调的定义方式使它们可以直接用作参数和返回类型,从而掩盖了底层指针。现在,您必须通过指针使用它们:在 Koffi 1.x 中void CallIt(CallbackType func)变为2.0 及更高版本void CallIt(CallbackType *func)。
#include <string.h>
int TransferToJS(const char *name, int age, int (*cb)(const char *str, int age))
{
char buf[64];
snprintf(buf, sizeof(buf), "Hello %s!", str);
return cb(buf, age);
}// Koffi 1.x
const TransferCallback = koffi.proto('int TransferCallback(const char *str, int age)');
const TransferToJS = lib.func('TransferToJS', 'int', ['str', 'int', TransferCallback]);
// Equivalent to: const TransferToJS = lib.func('int TransferToJS(str s, int x, TransferCallback cb)');
let ret = TransferToJS('Niels', 27, (str, age) => {
console.log(str);
console.log('Your age is:', age);
return 42;
});
console.log(ret);Koffi 1.x 仅支持瞬态回调,您必须使用 Koffi 2.x 来注册回调。
不透明类型更改
在 Koffi 1.x 中,不透明句柄的定义方式使它们可以直接用作参数和返回类型,从而掩盖了底层指针。现在,在 Koffi 2.0 中,您必须通过指针使用它们,并使用数组作为输出参数。
除此之外,koffi.handle()在 Koffi 2.1 中已弃用并替换为koffi.opaque(). 它们的工作原理相同,但新代码应该使用koffi.opaque(),前一个最终将在 Koffi 3.0 中删除。
对于返回不透明指针或通过参数传递它们的函数:
对于通过输出参数设置不透明句柄的函数(例如sqlite3_open_v2),您现在必须使用单个元素数组,如下所示:
新 koffi.introspect()
在 Koffi 1.x 中,koffi.introspect()仅适用于结构类型,并返回传递给koffi.struct()初始化类型的对象。现在这个函数适用于所有类型。
您仍然可以获得结构成员列表:
Last updated