讨论广场 问答详情
在实际项目中,业务功能可能由不同“团队/组织”提供,如:团队A开发功能编译生成so库,团队B引用so库进行后续开发。供,如:团队A开发功能编译生成so库,团队B引用so库进行后续开发。
aurora6688 2026-08-23 00:59:01
44 评论 分享
harmonyos

so库可以将项目的不同功能模块化,提升代码的复用性和工程的可维护性。团队开发过程中引用三方so库的场景可分为几种?

44 评论 分享
写回答
全部评论(1)

三方动态链接库集成

在实际项目中,业务功能可能由不同“团队/组织”提供,如:团队A开发功能编译生成so库,团队B引用so库进行后续开发。so库可以将项目的不同功能模块化,提升代码的复用性和工程的可维护性。团队开发过程中引用三方so库的场景可分为两种:

  1. 在Native侧引用三方so库。
  2. 在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