积分1636 / 贡献20

提问18答案被采纳66文章40

[经验分享] OpenHarmony应用开发引入开源C/C++库---之Har包里的NDK 原创

深开鸿_王石 显示全部楼层 发表于 2024-3-27 17:54:01

Har包

HAR(Harmony Archive)是静态共享包,可以包含代码、C++库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP,不能独立安装运行在设备上,只能作为应用模块的依赖项被引用。

  • 使用场景
    • 作为二方库,发布到OHPM私仓,供公司内部其他应用使用。
    • 作为三方库,发布到OHPM中心仓,供其他应用使用。
  • HAR开发约束限制
    • HAR不支持UIAbility、ExtensionAbility组件和pages页面。
    • HAR不支持在build-profile.json5文件的buildOption中配置worker。
    • FA模型与Stage模型的HAR不支持相互引用。
    • Stage模型的HAR,不能引用AppScope内的内容。在编译构建时AppScope中的内容不会打包到HAR中,因此会导致HAR资源引用失败。

开发介绍

  1. 创建一个工程

    image.png

  2. 工程里加模块

    image.png

  3. 选择staticlibrary,就是静态库

    image.png

  4. 打开native的开关就是支持nativec++,也就支持ndk

    image.png

  5. 在主工程里导入library工程

    image.png

  6. 修改代码导出控件,方法

    // library 工程里修改 ------------------------------------------
    // src/main/ets/components/mainpage/MainPage.ets
    export struct AddCom {
    ......
            Text(this.message)
              .fontSize(50)
              .fontWeight(FontWeight.Bold)
              .onClick(() => {
                hilog.info(0x0000, 'testTag', 'Test NAPI 2 + 3 = %{public}d', testNapi.add(this.na, this.nb));
                this.na += 1;
                this.nb += 2;
                this.message = "AddCom = " + testNapi.add(this.na, this.nb);
              })
              
    // src/main/ets/components/mainpage/Caculate.ets
    import hilog from '@ohos.hilog';
    import testNapi from 'liblibrary.so';
    
    export namespace  Caculator {
      export function add(a: number, b: number) {
        hilog.info(0x0000, 'testTag', 'Test NAPI 2 + 3 = %{public}d', testNapi.add(a, b));
        return testNapi.add(a, b);
      }
    }
    
    // Index.ets
    export { AddCom } from './src/main/ets/components/mainpage/MainPage'
    export { Caculator } from './src/main/ets/components/mainpage/Caculate'
    
    // library 工程里修改 ------------------------------------------
    
    // 主项目里导入
    import { AddCom, Caculator } from 'library'
    .....
            Text(this.message)
              .fontSize(50)
              .fontWeight(FontWeight.Bold)
              .onClick(() => {
                hilog.info(0x0000, 'testTag', 'Test Har 2 + 3 = %{public}d', Caculator.add(this.na, this.nb));
                this.na += 10
                this.nb += 10
                this.message = "2+3=" + Caculator.add(this.na, this.nb)
              })
    
  7. 结果

    image.png

总结

可以利用OpenHarmony的hsp和har,包装组件和对应的NDK工程,提供给其他应用进行开发和应用。

©著作权归作者所有,转载或内容合作请联系作者

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部