跳轉到主要內容
CFunction 將原始 C 函數指針包裝爲可調用的 ArkTS 函數。

示例

import ffi from 'liblibrary.so';
import { CFunction, FFIType } from 'arkffi';

const handle = ffi.load('libffi_target.so');
const ptr = ffi.getSymbolPtr(handle, 'add');

const add = CFunction({
  args: [FFIType.double, FFIType.double],
  returns: FFIType.double,
  ptr: ptr,
});

add(2.0, 3.0); // → 5.0
add.close();
ffi.close(handle);

語法

function CFunction(def: {
  args: string[];
  returns: string;
  ptr: number;
}): {
  (...args: any[]): number;
  close(): void;
};

參數

參數類型說明
def.argsstring[]C 函數參數類型編碼,支持 FFIType.callback(調用時自動從 JSCallback 中提取 .ptr
def.returnsstringC 函數返回類型編碼
def.ptrnumber原始函數指針地址

回調類型參數

當參數類型爲 FFIType.callback'k')時,傳入的 JSCallback 會被自動提取其 .ptr
let fn = CFunction({
  args: [FFIType.callback, FFIType.int32],
  returns: FFIType.int32,
  ptr: applyPtr,
});
fn(cb, 21); // cb.ptr 自動作爲第一個參數傳入

獲取指針

使用 ffi.getSymbolPtr(handle, name)
import { CFunction, FFIType } from 'arkffi';
import ffi from 'liblibrary.so';

const handle = ffi.load('lib.so');
const ptr = ffi.getSymbolPtr(handle, 'calculate');
const fn = CFunction({ args: [FFIType.int32, FFIType.double], returns: FFIType.double, ptr });
fn(42, 3.14);
fn.close();
ffi.close(handle);