跳轉到主要內容
原始橋接提供對 liblibrary.so 導出的 NAPI 函數的直接訪問。

導入

import ffi from 'liblibrary.so';

API 參考

load()

function load(libName: string): bigint;
調用 dlopen() 打開庫。返回 bigint 句柄。
const handle = ffi.load('libffi_target.so');

close()

function close(handle: bigint): void;
調用 dlclose() 釋放庫句柄。

defineFunction()

function defineFunction(handle: bigint, funcName: string, argTypes: string, returnType: string): void;
通過 dlsym() 解析函數並註冊類型簽名。
ffi.defineFunction(handle, 'add', 'dd', 'd');

callBySig()

function callBySig(handle: bigint, funcName: string, numArgs: number[], strArgs: string[]): number;
調用之前註冊的函數。
ffi.callBySig(handle, 'add', [2.0, 3.0], []);

callMixed()

function callMixed(handle: bigint, funcName: string, argTypes: string, returnType: string, numArgs: number[], strArgs: string[]): number;
一站式調用——dlsym() 和類型分發合併爲一次調用。
ffi.callMixed(handle, 'compute', 'ids', 'd', [0, 4.0], ['square']);

callString()

function callString(handle: bigint, funcName: string): string;
調用返回 const char* 的 C 函數。
ffi.callString(handle, 'getVersion'); // → "1.0.0"

readCString()

function readCString(ptr: number): string;
從原始指針讀取 null 結尾的 C 字符串。

callPtr()

function callPtr(ptr: number, argTypes: string, returnType: string, numArgs: number[], strArgs: string[]): number;
通過原始函數指針調用,跳過 dlsym()

getSymbolPtr()

function getSymbolPtr(handle: bigint, funcName: string): number;
返回符號的原始函數指針。

createCallback()

function createCallback(callback: Function, argTypes: string, returnType: string, threadsafe?: boolean): number;
將 ArkTS 函數存入回調註冊表。返回槽位句柄。

destroyCallback()

function destroyCallback(handle: number): void;
從註冊表移除回調。

invokeCallback()

function invokeCallback(handle: number, ...args: any[]): any;
通過句柄調用已存儲的回調。

getCallbackThreadsafe()

function getCallbackThreadsafe(handle: number): boolean;
返回回調是否爲線程安全模式。

getCallbackPtr()

function getCallbackPtr(handle: number): number;
返回回調的函數指針。
  • 非線程安全:返回槽位句柄(小整數)
  • 線程安全:返回真實的可執行蹦牀函數地址

callCallbackThreadSafe()

function callCallbackThreadSafe(handle: number, arg: number): void;
通過 TSFN(線程安全函數)路徑調用回調,用於驗證線程安全機制。

ptr()

function ptr(buffer: ArrayBuffer | TypedArray): number;
獲取 ArrayBuffer 或 TypedArray 的底層內存指針。
const buf = new ArrayBuffer(256);
const p = ffi.ptr(buf); // → 內存地址