我們先前有產生出讀取環控晶片的動態連結函庫,但是在Electron應用程式中並不能像Windows console application一樣直接引入使用。要在Electron應用程式使用外部動態連結函庫或應用程式的話可以用node-ffi-napi
、Node-API
或是Child Process
這三種方式:
node-ffi-napi
Node-API
Child Process
node-ffi-napi
較為符合需求,因為我們先前有編寫了動態連結函庫,可以使用node-ffi-napi
來連結動態連結函庫,讓Electron應用程式可以呼叫動態連結函庫中的函式。全名為Node.js Foreign Function Interface for N-API,使用純JavaScript載入及使用動態連結函庫,而不用任何C++程式碼。下面是官方教學中提到的一個簡單的範例:
var ffi = require('ffi-napi');
var libm = ffi.Library('libm', {
'ceil': [ 'double', [ 'double' ] ]
});
libm.ceil(1.5); // 2
ffi-api
模組。ffi.Library
連結libm
這個函式庫。libm
連結了libm
庫。並返回其中的ceil
,向上取整數函式。libm.ceil
就可以使用libm
庫中的ceil
函式。node-ffi-napi
的核心為ref,ref
拓展了node內建的Buffer類別,並讓它們的行為更像指標,ref
本身有支援以下常見的C類型:
而其他較為複雜的類型如結構或陣列,就需要使用ref-struct-napi
或ref-array-napi
,以下例子由官方文件所提供:
ref-struct-napi
truct timeval {
time_t tv_sec; /* seconds since Jan. 1, 1970 */
suseconds_t tv_usec; /* and microseconds */
;
``
`` javascript
ar ref = require('ref-napi')
ar StructType = require('ref-struct-napi')
/ define the time types
ar time_t = ref.types.long
ar suseconds_t = ref.types.long
/ define the "timeval" struct type
ar timeval = StructType({
v_sec: time_t,
v_usec: suseconds_t
)
/ now we can create instances of it
ar tv = new timeval
``
ref-array-napi
ar ref = require('ref-napi')
ar ArrayType = require('ref-array-napi')
/ typedef
ar int = ref.types.int
/ define the "int[]" type
ar IntArray = ArrayType(int)
/ now we can create array instances; the constructor takes the same arguments
/ the native JS Array class
ar a = new IntArray(5) // by length
.length // 5
[0] = 0
[1] = 1
[2] = -1
[3] = 2
[4] = -2
ar b = new IntArray([1, 2, 3, 4, 5]) // with an existing Array
.length // 5
[0] // 1
[1] // 2
[2] // 3
[3] // 4
[4] // 5
``
node-ffi-napi
最主要的API為Library,用來連結指定的函式庫及其中所提供的函式,變數使用ffi.Library
連結函式庫並返回了函式庫內函式的宣告,這個變數就可以呼叫函式庫內的函式做使用,下面是ffi.Library
的使用方式:
ffi.Library(libraryFile, { functionSymbol: [ returnType, [ arg1Type, arg2Type, ... ], ... ]);
libraryFile
functionSymbol
returnType
arg1Type, arg2Type, ...
今天簡單介紹了node-ffi-napi
的基本概念及用法,其餘更詳細的內容可以參考node-ffi-napi
的官方教學及ref
的完整API文件。
node-ffi-napi/node-ffi-napi: A foreign function interface (FFI) for Node.js, N-API style (github.com)
Node-API | Node.js v20.8.0 Documentation (nodejs.org)
Child process | Node.js v20.8.0 Documentation (nodejs.org)