Skip to main content
本指南演示如何將在 開發環境 中獨立編譯的 C/C++ 庫集成到 arkffi 項目中,並通過 dlopen 調用其函數。

步驟概覽

  1. 在 開發環境 中創建 C/C++ 庫項目
  2. 使用 HarmonyOS NDK 交叉編譯爲 arm64-v8a 架構
  3. 將編譯產物放入 entry/libs/arm64-v8a/
  4. 在 ArkTS 中通過 dlopen 加載並調用

1. 創建外部庫項目

自行創建 C/C++ 庫項目。 源代碼 library.cpp
extern "C" 防止 C++ 編譯器對函數名進行改編(name mangling),確保 dlsym("hello") 能正確找到符號。如果不加,編譯後的符號名會被改成 _Z5hellov,導致 dlopen 無法識別。
CMakeLists.txt

2. 交叉編譯爲 HarmonyOS

在 開發環境 中使用 HarmonyOS NDK 的交叉編譯器進行編譯:
確保使用 HarmonyOS NDK 的 aarch64-linux-ohos-* 工具鏈,而非 macOS 自帶的 Clang。-fPIC 是編譯共享庫必需的選項。

3. 放置編譯產物

將編譯生成的 libhello.so 放入項目的以下目錄:
如果項目還支持 x86_64 模擬器,需要在 entry/libs/x86_64/ 下也放置對應架構的編譯產物。

4. 配置 abiFilters

確保 library/build-profile.json5abiFilters 包含編譯產物對應的架構:

5. 在 ArkTS 中調用

注意事項

  • 返回 const char* 的函數必須使用 returns: FFIType.int64 而非 returns: FFIType.CString,因爲底層分發器將 's' 編碼視爲參數類型,不處理爲返回類型。
  • 拿到指針後需通過 CString 類讀取實際字符串內容。
  • 確保庫已用 extern "C" 編譯,否則 dlsym 因名字改編而找不到函數。

故障排查