跳转到主要内容
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*)