HarmonyOS鸿蒙Next中hap包如何引用har包的so文件

HarmonyOS鸿蒙Next中hap包如何引用har包的so文件 最好给个demo,实在是看不懂C++代码,求大神解答

3 回复

更多关于HarmonyOS鸿蒙Next中hap包如何引用har包的so文件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,HAP包引用HAR包的SO文件,需在HAR的build-profile.json5中配置externalNativeOptions,将SO文件打包到HAR中。然后在HAP的build-profile.json5buildOption中配置externalNativeOptions,指定依赖的HAR模块。HAP的module.json5deviceTypes需包含与HAR相同的支持类型。

在HarmonyOS Next中,若要在hap包中引用har包内的C++共享库(.so文件),关键在于正确的模块配置与动态加载。由于har包是静态共享包,其so文件不会自动打包到最终hap中,需要手动处理依赖和加载路径。

核心步骤如下:

  1. 配置har包的build-profile.json5: 在har模块中,需在buildOptions中配置externalNativeOptions,将so文件标记为需要导出。

    {
      "apiType": "stageMode",
      "buildOption": {
        "externalNativeOptions": {
          "path": "./src/main/cpp/CMakeLists.txt",
          "exportSo": true  // 关键:允许导出so文件
        }
      }
    }
    
  2. 配置hap包的build-profile.json5: 在依赖该har的hap模块中,需声明对har中native库的依赖。

    {
      "app": {
        "dependencies": [
          {
            "bundleName": "你的har包名",
            "moduleName": "你的har模块名",
            "sharedLibs": true  // 关键:声明依赖har中的共享库
          }
        ]
      }
    }
    
  3. 在hap中加载so文件: 在hap的C++代码或ArkTS/JS中通过System.loaddlopen加载时,需使用har包提供的特定路径。HarmonyOS Next为har中的so提供了固定的加载路径模板:

    /system/lib/module/你的har模块名/.../xxx.so
    

    或通过AbilityContext获取更精确的路径。在ArkTS中,可借助importnative能力获取模块路径后拼接。

简化示例(ArkTS侧加载):

假设har模块名为mynativehar,其中有一个libnative.so

在hap的ArkTS代码中:

import mynativehar from '@ohos/mynativehar'; // 导入har模块
import abilityAccessCtrl from '@ohos.abilityAccessCtrl';

// 通过context获取模块路径(在EntryAbility中)
let context = ...; // 获取AbilityContext
let modulePath = context.moduleInfo?.nativeLibraryPath; // 此路径指向hap自身的native库目录

// 但har的so通常需要明确路径,一种可行方式是通过资源路径推断
// 更直接的方式是在har中暴露一个获取so路径的方法(需har提供)
// 例如,har的index.ets可导出:
// export function getNativeLibPath(): string {
//   return "你的so在har中的相对路径";
// }

// 然后hap中:
import { getNativeLibPath } from '@ohos/mynativehar';
let soPath = getNativeLibPath(); // 假设返回 "libnative.so"

// 使用System.load加载(需确保路径正确)
try {
  System.load(soPath); // 注意:此路径需为绝对路径或系统能识别的路径
} catch (error) {
  console.error(`Failed to load native library: ${error.message}`);
}

重要提醒

  • 确保har和hap的module.json5nativeLibraryPath配置正确,指向各自so的输出目录。
  • so文件的ABI(arm64-v8a等)需与目标设备匹配。
  • 由于har的so不直接打包到hap,需确保目标设备上已安装包含该har的包,且hap正确声明了依赖。

若遇到路径问题,可检查设备上/system/lib/module/目录下har模块的so是否实际存在。

回到顶部