跳轉到主要內容
C 函數經常接受不同類型的參數。arkffi 通過將數值和字符串參數分開爲兩個數組來處理。

簽名編碼

編碼C 類型
iint32_t, int, bool, char
lint64_t, uint64_t, void*
ddouble, float
sconst char*
對於如下函數:
double compute(int mode, double value, const char* name);
類型字符串爲 "ids",返回類型爲 "d"

使用 callMixed

const h = ffi.load('libffi_target.so');

const result = ffi.callMixed(
  h, 'compute',
  'ids',       // 參數類型:int32, double, CString
  'd',         // 返回類型:double
  [0, 4.0],    // 數值參數
  ['square'],  // 字符串參數
);

ffi.close(h);

使用 dlopen

const lib = dlopen('libffi_target.so', {
  compute: {
    args: [FFIType.int32, FFIType.double, FFIType.CString],
    returns: FFIType.double,
  },
});

lib.symbols.compute(0, 4.0, 'square');

支持的簽名

簽名C 函數
iddouble fn(int32_t, double)
didouble fn(double, int32_t)
idsdouble fn(int32_t, double, const char*)
siddouble fn(const char*, int32_t, double)
isddouble fn(int32_t, const char*, double)
iiddouble fn(int32_t, int32_t, double)
ididouble fn(int32_t, double, int32_t)
ididdouble fn(int32_t, double, int32_t, double)
ssint32_t fn(const char*, const char*)
sdouble fn(const char*)