跳轉到主要內容
1

前置條件

開始之前,請確保你已準備好:
  • HarmonyOS NEXT(API 21+)設備或模擬器
  • DevEco Studio 和 HarmonyOS SDK
  • 一個 .so 共享庫(預編譯或從源碼編譯)
2

添加 library 模塊

在項目中添加 HAR 模塊:
Project/
└── library/
    ├── src/main/cpp/          # 原生 C++ 代碼
    ├── src/main/ets/          # ArkTS/TS 封裝
    ├── build-profile.json5
    └── oh-package.json5
3

配置原生構建

{
  "buildOption": {
    "externalNativeOptions": {
      "path": "./src/main/cpp/CMakeLists.txt",
      "abiFilters": ["arm64-v8a", "x86_64"]
    }
  }
}
cmake_minimum_required(VERSION 3.5.0)
add_library(library SHARED napi_init.cpp)
target_link_libraries(library PUBLIC libace_napi.z.so)
4

導入並使用

import { dlopen, FFIType, CString, CFunction, JSCallback } from 'arkffi';

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

lib.symbols.calculate(42, 3.14, 'hello');
lib.close();
5

使用原始橋接

需要更底層的控制時,可直接使用 NAPI 函數:
import ffi from 'liblibrary.so';

const handle = ffi.load('libffi_target.so');
ffi.defineFunction(handle, 'add', 'dd', 'd');
const sum = ffi.callBySig(handle, 'add', [2.0, 3.0], []);
ffi.close(handle);
6

操作 C 指針

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

ffi.callPtr(ptr, 'dd', 'd', [2.0, 3.0], []);

const cstr = new CString(ptr);
cstr.toString();
cstr.length;
7

創建回調

const cb = new JSCallback(
  (a: number, b: number): number => a + b,
  { args: [FFIType.int32, FFIType.int32], returns: FFIType.int32 },
);

cb.call(2, 3);   // → 5
cb.ptr;          // → 槽位句柄
cb.close();