如何使用ffi-napi实现从共享对象(.so/.dll)向NodeJS传递变量
解决方法
问题核心
ffi-napi 的 ffi.Library() 第二个参数仅用于声明共享库导出的函数,全局导出变量无法通过这个配置直接读取,需要借助 ref-napi 提供的类型声明和库实例的get()方法读取。
前置依赖
首先安装需要的工具库:
npm install ffi-napi ref-napi
调整后的NodeJS代码
const ffi = require("ffi-napi"); const ref = require("ref-napi"); // 加载共享库时不需要在配置中声明全局变量 const mylibrary = ffi.Library("./mylibrary.so", {}); // 调用get方法读取全局变量,第二个参数指定变量对应的C类型 const exampleValue = mylibrary.get("example", ref.types.int); console.log("Example variable is", exampleValue);
补充说明
- 如果是Windows平台的DLL,注意C代码编译时需要给全局变量添加导出声明,否则DLL不会导出该变量:
// Windows DLL编译时的写法 __declspec(dllexport) int example = 10; - 共享库编译的位数需要和运行的NodeJS进程位数一致(同为32位或同为64位),否则会出现加载失败的问题。
- 如果需要修改共享库的全局变量,可以调用
set()方法:mylibrary.set("example", ref.types.int, 20);
内容的提问来源于stack exchange,提问作者Thor-x86_128
相关产品推荐
相关产品推荐

