在实际项目中,业务功能可能由不同“团队/组织”提供,如:团队A开发功能编译生成so库,团队B引用so库进行后续开发。供,如:团队A开发功能编译生成so库,团队B引用so库进行后续开发。
harmonyos
so库可以将项目的不同功能模块化,提升代码的复用性和工程的可维护性。团队开发过程中引用三方so库的场景可分为几种?
您需要先 登录 才能评论/回答
全部评论(1)
三方动态链接库集成
在实际项目中,业务功能可能由不同“团队/组织”提供,如:团队A开发功能编译生成so库,团队B引用so库进行后续开发。so库可以将项目的不同功能模块化,提升代码的复用性和工程的可维护性。团队开发过程中引用三方so库的场景可分为两种:
- 在Native侧引用三方so库。
- 在ArkTS侧引用三方so库。
下面针对这两种场景给出具体的实现方案。
在Native侧引用三方so库
按照实际开发场景可分为两部分:编译生成so库和在Native侧引用so库。
第一部分:开发功能函数,编译生成so库。具体操作可参考:使用命令行CMake构建NDK工程。
第二部分:在Native侧引用so库调用功能函数。可以采用如下两种方案:
- 方案一:通过编译动态链接库的方式引用。
- 方案二:通过调用dlopen的方式引用。
通过编译动态链接库的方式引用
实现原理
将so库加入到工程中,在Native侧使用CMake编译动态链接库,通过include引用头文件调用功能函数。
修改src/main/cpp目录下CMakeLists.txt文件配置,使用target_link_libraries命令将需要预加载的加法so库链接到项目中。
# Compile and link third-party SO libraries
target_link_libraries(entry PUBLIC ${NATIVERENDER_ROOT_PATH}/../../../libs/${OHOS_ARCH}/libnativeAdd.so)
在Native侧通过头文件引用加法so库。
static napi_value NAPI_Global_nativeAdd(napi_env env, napi_callback_info info) {
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 ret;
napi_create_double(env, add(value0, value1), &ret);
return ret;
}
// ...
EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports) {
napi_property_descriptor desc[] = {
{"nativeAdd", nullptr, NAPI_Global_nativeAdd, nullptr, nullptr, nullptr, napi_default, nullptr},
// ...
napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
return exports;
}
EXTERN_C_END
2026-08-23 01:00:08