HarmonyOS 鸿蒙Next 开发Module之间的依赖

HarmonyOS 鸿蒙Next 开发Module之间的依赖
鸿蒙开发一个项目依赖于多个Module,moduleA,moduleB. moduleA和moduleB都是native开发,moduleA的cmakelist的target依赖于moduleB的target生成的so库和moduleB添加的so库,moduleA与moduleB的依赖怎么设置

2 回复

在处理多模块之间的SO依赖时,可以通过将隐式依赖转为显式依赖来进行解耦。具体做法是,利用dlopendlsym接口进行SO的编译依赖解耦。修改代码和CMakeLists.txt文件,并利用Native侧的dlopen方法编译出相应的library。生成的.so文件会在build/default/intermediates/cmake/default/obj目录下,然后将这些文件移动到libs目录下。最后,修改CMakeLists.txt文件以引入这些新的.so文件供项目编译使用。

可以参考下述demo创建HAR模块:

1、添加减法接口sub

// library/src/main/cpp/hello.cpp
static napi_value Sub(napi_env env, napi_callback_info info) {
    size_t requireArgc = 2;
    size_t argc = 2;
    napi_value args[2] = {nullptr};
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
    napi_valuetype valuetype0;
    napi_typeof(env, args[0], &valuetype0);
    napi_valuetype valuetype1;
    napi_typeof(env, args[1], &valuetype1);
    double value0;
    napi_get_value_double(env, args[0], &value0);
    double value1;
    napi_get_value_double(env, args[1], &value1);
    napi_value sum;
    napi_create_double(env, value0 - value1, &sum);
    return sum;
}
static napi_value Init(napi_env env, napi_value exports)
{
    napi_property_descriptor desc[] = {
        {"add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr},
        {"sub", nullptr, Sub, nullptr, nullptr, nullptr, napi_default, nullptr}
    };
    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
    return exports;
}

2、以导出liblibrary.so的加减法接口addsub为例

// library/src/main/ets/utils/nativeTest.ts
import native from 'liblibrary.so'
export function nativeAdd(a: number, b: number) {
  let result: number = native.add(a, b);
  return result;
}
export function nativeSub(a: number, b: number) {
  let result: number = native.sub(a, b);
  return result;
}

3、HAR对外暴露的接口,在Index.ets导出文件中声明如下所示:

// library/Index.ets
export { nativeAdd, nativeSub } from './src/main/ets/utils/nativeTest'

4、引用本地HAR包,有如下两种方式:

方式一:在Terminal窗口中,执行如下命令进行安装,并会在oh-package.json5中自动添加依赖。

ohpm install ./library/build/default/outputs/default/library.har

方式二:在工程的oh-package.json5中设置三方包依赖,配置示例如下:

"dependencies": { "library": "file:../library/build/default/outputs/default/library.har" }

依赖设置完成后,需要执行ohpm install命令安装依赖包,依赖包会存储在工程的oh_modules目录下。

5、通过import引用HAR导出的native方法,示例如下所示:

// entry/src/main/ets/pages/Index.ets
import { nativeAdd, nativeSub } from 'library'
@Entry
@Component
struct Index {
  build() {
    Row() {
      Column() {
        Button('ArkTS call C++')
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO);
            hilog.info(0x0000, 'testTag', 'Test NAPI 2 + 3 = %{public}d', nativeAdd(2, 3));
            hilog.info(0x0000, 'testTag', 'Test NAPI 2 - 3 = %{public}d', nativeSub(2, 3));
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

其实完整的demo实现也有,可以下载下来进行参考学习: 三方so库集成开发实践

开源网站上收录了UI、系统接口、Web、创新特性等场景化鸿蒙示例DEMO,开发中可以参考: https://gitee.com/scenario-samples/demo-index

更多关于HarmonyOS 鸿蒙Next 开发Module之间的依赖的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS(鸿蒙)系统中,开发Module(模块)之间的依赖管理是实现模块化设计和组件化开发的关键部分。鸿蒙系统采用了一套机制来管理这些依赖关系,以确保系统的可维护性、可扩展性和组件间的解耦。

鸿蒙系统中的Module依赖通常通过配置文件或特定的依赖管理工具来声明。这些依赖关系定义了模块之间的调用关系和依赖层次,使得系统在构建和运行时能够正确地加载和初始化所需的组件。

开发者在创建或修改模块时,需要在相应的配置文件中明确指出该模块所依赖的其他模块。这些依赖信息会被系统解析,并在模块加载时自动处理,确保所有必需的组件都被正确加载。

鸿蒙系统还提供了版本管理和兼容性检查的功能,以确保不同版本的模块之间能够正确交互。这有助于在系统升级或模块更新时维护系统的稳定性和兼容性。

在开发过程中,开发者需要注意避免循环依赖和不必要的依赖,以保持系统的清晰和高效。同时,合理的依赖管理也有助于实现代码的复用和模块化开发。

如果开发者在配置模块依赖时遇到问题,可以参考鸿蒙系统的官方文档或开发指南。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部