我想调用一个c lib,像这样的.h文件:
typedef void (*ConnectEventCallBack)(int iBaseID, int iMode, const char* sInfo);
extern "C" __declspec(dllexport) void SetConnectEventCallBack(ConnectEventCallBack cb);
在node-ffi中,如何定义函数并使用它?
答案 0 :(得分:1)
你可以这样做:
var ffi = require('ffi');
// Interface into the native lib
var libname = ffi.Library('./libname', {
'SetConnectEventCallBack': ['void', ['pointer']]
});
// Callback from the native lib back into js
var callback = ffi.Callback('void', ['int', 'int', 'string'],
function(iBaseId, iMode, sInfo) {
console.log("iBaseId: ", iBaseId);
console.log("iMode: ", iMode);
console.log("sInfo: ", sInfo);
});
console.log("registering the callback");
libname.SetConnectEventCallBack(callback);
console.log('Done');
// Make an extra reference to the callback pointer to avoid GC
process.on('exit', function() {
callback
});
C库可以使用另一个线程调用此回调。这很安全。在这种情况下,回调的javascript函数将在主事件循环中触发,调用者线程将等待调用返回。返回值也传递给调用者线程。
请注意,您需要以某种方式保留对ffi.Callback
返回的回调指针的引用,以避免垃圾回收。