鸿蒙Next如何制作har模块包并调用c++ so库

在鸿蒙Next开发中,如何正确制作HAR模块包并调用其中的C++ SO库?我按照官方文档创建了HAR模块,但打包后始终无法加载SO库中的Native函数,报错显示"undefined symbol"。具体环境:DevEco Studio 3.1,SDK版本API 9。尝试过以下步骤:

  1. 在CMakeLists.txt中声明了SHARED库
  2. 配置了ohos.build的externalNativeOptions
  3. 确保SO文件与HAR同时打包 请问完整的HAR模块配置流程是什么?是否需要特别处理NDK路径或ABI过滤?如何验证SO库是否被正确打包到HAR中?
2 回复

鸿蒙Next里,先写个C++库,编译成.so文件。然后在DevEco Studio里新建个har项目,把.so塞进libs目录。配置build.gradle,确保native依赖正确。最后在Java或ArkTS里用System.loadLibrary加载,就能愉快调用了。简单说:塞库、配依赖、加载、开调!

更多关于鸿蒙Next如何制作har模块包并调用c++ so库的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙Next中制作HAR模块包并调用C++ SO库的步骤如下:

1. 创建HAR模块

  • 新建模块:在DevEco Studio中选择File > New > Module,选择Static Library模板创建HAR模块。
  • 配置build-profile.json5
    {
      "apiType": 'har',
      "buildOption": {
        "externalNativeOptions": {
          "path": "./src/main/cpp/CMakeLists.txt"
        }
      }
    }
    

2. 添加C++代码和SO库

  • 目录结构
    src/main/
    ├── cpp/
    │   ├── CMakeLists.txt
    │   ├── native.cpp
    │   └── libs/
    │       └── arm64-v8a/
    │           └── libexample.so
    
  • CMakeLists.txt配置
    cmake_minimum_required(VERSION 3.4.1)
    project("native")
    
    # 添加SO库
    add_library(example SHARED IMPORTED)
    set_target_properties(example PROPERTIES IMPORTED_LOCATION
        ${CMAKE_CURRENT_SOURCE_DIR}/libs/${OHOS_ARCH}/libexample.so)
    
    # 生成原生库
    add_library(native SHARED native.cpp)
    target_link_libraries(native PUBLIC example)
    

3. 实现C++接口封装

  • native.cpp
    #include <string>
    extern "C" {
      // 声明SO库函数
      int example_add(int a, int b);
    }
    
    extern "C" int OH_Example_Add(int a, int b) {
      return example_add(a, b);
    }
    

4. 配置NAPI接口(可选)

  • 若需JS调用,在cpp/types目录添加.d.ts声明文件:
    export const ohExampleAdd: (a: number, b: number) => number;
    

5. 构建与使用

  • 编译HAR:运行Build > Make Module '模块名'生成HAR包。
  • 调用方配置: 在调用方的build-profile.json5中添加依赖:
    "dependencies": {
      "har": "file:../module.har"
    }
    
  • JS/TS调用示例
    import { ohExampleAdd } from 'module';
    
    let result = ohExampleAdd(3, 5); // 调用SO库函数
    

关键注意事项:

  1. ABI兼容:确保SO库与目标设备架构(arm64-v8a/armeabi-v7a)匹配。
  2. 符号导出:SO库需暴露C风格函数(使用extern "C")。
  3. NDK版本:保持HAR模块与主工程NDK版本一致。

通过以上步骤即可实现HAR模块封装C++ SO库,并在鸿蒙应用中进行跨语言调用。

回到顶部