HarmonyOS 鸿蒙Next中多模块之间若有 SO 的依赖,需要如何依赖组织

HarmonyOS 鸿蒙Next中多模块之间若有 SO 的依赖,需要如何依赖组织 我们项目中封装了相机 SDK (包括 ets 和 C++ ),滤镜链逻辑现在均由 C++ 进行编写,后续项目需要根据业务编写滤镜节点,然后动态插入到相机 SDK 的滤镜链中。这期间需要继承相机 SDK 的滤镜类和插入到滤镜链的管理中心。所以需要获取到相机 SDK 的 so ,我应该要如何获取和组织这块的关联。

3 回复

在处理多模块之间的SO依赖时,可以通过将隐式依赖转为显式依赖来进行解耦。具体做法是,利用dlopen和dlsym接口进行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; 
} 

// library\src\main\cpp\hello.cpp 
EXTERN_C_START 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; 
} 
EXTERN_C_END

2. 以导出liblibrary.so的加减法接口add和sub为例

// 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目录下。

ohpm install

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%') 
 }
}

更多关于HarmonyOS 鸿蒙Next中多模块之间若有 SO 的依赖,需要如何依赖组织的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,若多模块之间存在SO(共享库)依赖,可以通过以下方式组织依赖:

  1. SO库的声明与引用:在模块的build-profile.json5文件中,声明所需的SO库依赖。使用dependencies字段,明确指定依赖的SO库路径或模块名称。

  2. SO库的打包与部署:确保SO库文件放置在模块的libs目录下,并在build-profile.json5中配置packagingOptions,指定SO库的打包规则,确保其能够正确打包到最终的HAP中。

  3. 模块间的依赖关系:在模块的build-profile.json5中,使用dependencies字段声明对其他模块的依赖。若依赖的模块中包含SO库,需确保这些SO库能够被正确引用和加载。

  4. SO库的加载与使用:在代码中,使用System.loadLibrarySystem.load方法加载SO库。确保SO库的加载路径正确,并且在运行时能够找到对应的SO文件。

  5. SO库的版本管理:若存在多个版本的SO库,需在build-profile.json5中明确指定所需的版本,避免版本冲突。

通过以上方式,可以有效地组织和管理HarmonyOS鸿蒙Next中多模块之间的SO依赖关系。

在HarmonyOS鸿蒙Next中,若多模块之间存在SO(共享对象库)依赖,需通过以下步骤组织依赖:

  1. 模块定义:在build-profile.json5中定义模块,并指定依赖关系。
  2. SO库打包:将SO库放入libs目录,并在build.gradle中声明依赖。
  3. 依赖声明:在oh-package.json5中声明模块依赖,确保SO库被正确引用。
  4. 编译构建:使用Hvigor或Gradle进行编译,确保SO库被正确打包到最终的HAP文件中。
  5. 调试与部署:通过DevEco Studio进行调试和部署,验证SO库的加载和使用。

确保模块间的依赖关系清晰,避免循环依赖。

回到顶部