HarmonyOS 鸿蒙Next中多模块之间若有 SO 的依赖,需要如何依赖组织
HarmonyOS 鸿蒙Next中多模块之间若有 SO 的依赖,需要如何依赖组织 我们项目中封装了相机 SDK (包括 ets 和 C++ ),滤镜链逻辑现在均由 C++ 进行编写,后续项目需要根据业务编写滤镜节点,然后动态插入到相机 SDK 的滤镜链中。这期间需要继承相机 SDK 的滤镜类和插入到滤镜链的管理中心。所以需要获取到相机 SDK 的 so ,我应该要如何获取和组织这块的关联。
在处理多模块之间的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(共享库)依赖,可以通过以下方式组织依赖:
-
SO库的声明与引用:在模块的
build-profile.json5
文件中,声明所需的SO库依赖。使用dependencies
字段,明确指定依赖的SO库路径或模块名称。 -
SO库的打包与部署:确保SO库文件放置在模块的
libs
目录下,并在build-profile.json5
中配置packagingOptions
,指定SO库的打包规则,确保其能够正确打包到最终的HAP中。 -
模块间的依赖关系:在模块的
build-profile.json5
中,使用dependencies
字段声明对其他模块的依赖。若依赖的模块中包含SO库,需确保这些SO库能够被正确引用和加载。 -
SO库的加载与使用:在代码中,使用
System.loadLibrary
或System.load
方法加载SO库。确保SO库的加载路径正确,并且在运行时能够找到对应的SO文件。 -
SO库的版本管理:若存在多个版本的SO库,需在
build-profile.json5
中明确指定所需的版本,避免版本冲突。
通过以上方式,可以有效地组织和管理HarmonyOS鸿蒙Next中多模块之间的SO依赖关系。
在HarmonyOS鸿蒙Next中,若多模块之间存在SO(共享对象库)依赖,需通过以下步骤组织依赖:
- 模块定义:在
build-profile.json5
中定义模块,并指定依赖关系。 - SO库打包:将SO库放入
libs
目录,并在build.gradle
中声明依赖。 - 依赖声明:在
oh-package.json5
中声明模块依赖,确保SO库被正确引用。 - 编译构建:使用Hvigor或Gradle进行编译,确保SO库被正确打包到最终的HAP文件中。
- 调试与部署:通过DevEco Studio进行调试和部署,验证SO库的加载和使用。
确保模块间的依赖关系清晰,避免循环依赖。