• Lv1
    粉丝0

积分0 / 贡献0

提问1答案被采纳0文章0

作者动态

    Hypium测试框架是否支持 “Native侧集成C/C++三方库SO” 的测试?

    wangyihao1 显示全部楼层 发表于 2025-3-11 23:23:47
    【问题描述】
    问题现象和发生的背景:

    之前尝试将自定义三方库sub编译出SO,并写出对应napi接口文件,通过JS代码最终调用C/C++三方库,编出hap包后在模拟器上测试成功(方法一)。
    现在想通过使用Hypium 测试框架测试(方法二),遇到问题。

    首先描述我在Native C++工程中使用NAPI调用C/C++三方库SO中的方法 的过程(方法一):
    ①自定义一个sub三方库,实现减法功能。sub.h sub.cpp 源码如下:
    1. / sub.h
    2. #ifndef SUB206_SUB_H
    3. #define SUB206_SUB_H
    4. extern "C" {
    5. double sub(double a, double b);
    6. }
    7. #endif //SUB206_SUB_H
    8. // sub.cpp
    9. #include <iostream>
    10. #include "sub.h"
    11. double sub(double a, double b)
    12. {
    13.     return a - b;
    14. }
    复制代码
    ②编出arm64x86架构的SO如图:
    [attachimg]5339[/attachimg]
    ③新建名为:subDemoTestOne Native C++工程 ,实现在Native侧集成该三方库。(此步骤完成了在Native侧集成三方SO库,并在模拟器上测试成功)
    具体步骤:
    1)将上步生成的so库置于entry/libs对应架构的目录下
    [attachimg]5340[/attachimg]
    2)将其对应的sub.h头文件放置到cpp/thirdparty/sub/include目录下
    3)修改CMakeLists.txt,将so库加入到工程中编译引用:
    1. # the minimum version of CMake.
    2. cmake_minimum_required(VERSION 3.5.0)
    3. project(subDemoTestOne)

    4. set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})

    5. if(DEFINED PACKAGE_FIND_FILE)
    6.     include(${PACKAGE_FIND_FILE})
    7. endif()
    8. include_directories(${NATIVERENDER_ROOT_PATH}
    9.                     ${NATIVERENDER_ROOT_PATH}/include)

    10. add_library(entry SHARED napi_init.cpp)
    11. target_link_libraries(entry PUBLIC libace_napi.z.so libhilog_ndk.z.so)
    12. target_link_libraries(entry PUBLIC ${NATIVERENDER_ROOT_PATH}/../../../libs/${OHOS_ARCH}/libnativesub.so)
    13. #target_include_directories(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/sub/include)
    复制代码
    4)在napi_init.cpp文件中实现NAPI接口功能:
    1. #include "napi/native_api.h"
    2. #include "thirdparty/sub/include/sub.h"
    3. static napi_value Sub(napi_env env, napi_callback_info info)
    4. {
    5.     size_t argc = 2;
    6.     napi_value args[2] = {nullptr};
    7.     napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);
    8.     napi_valuetype valuetype0;
    9.     napi_typeof(env, args[0], &valuetype0);
    10.     napi_valuetype valuetype1;
    11.     napi_typeof(env, args[1], &valuetype1);
    12.     double value0;
    13.     napi_get_value_double(env, args[0], &value0);
    14.     double value1;
    15.     napi_get_value_double(env, args[1], &value1);
    16.     napi_value sum;
    17.     napi_create_double(env, sub(value0 , value1), &sum);
    18.     return sum;
    19. }
    20. EXTERN_C_START
    21. static napi_value Init(napi_env env, napi_value exports)
    22. {
    23.     napi_property_descriptor desc[] = {
    24.         { "sub", nullptr, Sub, nullptr, nullptr, nullptr, napi_default, nullptr }
    25.     };
    26.     napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
    27.     return exports;
    28. }
    29. EXTERN_C_END
    30. static napi_module demoModule = {
    31.     .nm_version = 1,
    32.     .nm_flags = 0,
    33.     .nm_filename = nullptr,
    34.     .nm_register_func = Init,
    35.     .nm_modname = "entry",
    36.     .nm_priv = ((void*)0),
    37.     .reserved = { 0 },
    38. };
    39. extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
    40. {
    41.     napi_module_register(&demoModule);
    42. }
    复制代码
    5)在Index.d.ts中声明导出的NAPI方法:
    1. export const sub: (a: number, b: number) => number;
    复制代码
    6)在build-profile.json5中添加架构如图:
    [attachimg]5341[/attachimg]
    7)编写Index.ets功能代码:
    1. import { hilog } from '@kit.PerformanceAnalysisKit';
    2. import testNapi from 'libentry.so';

    3. @Entry
    4. @Component
    5. struct Index {
    6.   @State message: string = 'Hello World';

    7.   build() {
    8.     Row() {
    9.       Column() {
    10.         Text(this.message)
    11.           .fontSize(50)
    12.           .fontWeight(FontWeight.Bold)
    13.           .onClick(() => {
    14.             hilog.info(0x0000, 'testTag', 'Test NAPI 3 - 2 = %{public}d', testNapi.sub(3,2));
    15.           })
    16.       }
    17.       .width('100%')
    18.     }
    19.     .height('100%')
    20.   }
    21. }
    复制代码
    8build Hap后,在模拟器上测试成功。
    日志输出如下:
    [attachimg]5342[/attachimg]
    以上步骤完成了在Native侧集成三方SO库,并在模拟器上测试成功)

    现在想通过使用Hypium 测试框架测试(方法二),遇到问题。

    在同一工程下继续进行以下操作:
    List.test.ets文件内容如下:
    [attachimg]5336[/attachimg]
    1. import sub from './LocalUnit.test';

    2. export default function testsuite() {
    3.   sub();
    4. }
    复制代码
    LocalUnit.test.ets文件内容如下:
    [attachimg]5337[/attachimg]
    1. import hilog from '@ohos.hilog';
    2. import testNapi from 'libentry.so';
    3. import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium';
    4. export default function sub() {
    5.   describe('sub', () => {
    6.     beforeAll(() => {
    7.     })
    8.     beforeEach(() => {
    9.     })
    10.     afterEach(() => {
    11.     })
    12.     afterAll(() => {
    13.     })
    14.     it('sub', 0, () => {
    15.       hilog.info(0x0000, 'testTag', '%{public}s', 'it sub begin');
    16.       let a = 2.5
    17.       let b = 2.5
    18.       console.info("testNapi:", testNapi);
    19.       console.info("testNapi.sub:", testNapi.sub);
    20.       console.info("typeof testNapi.sub:", typeof testNapi.sub);
    21.       let result: number = testNapi.sub(a, b)
    22.       hilog.info(0x0000, "testTag", "Test NAPI sub: ", JSON.stringify(result));
    23.       console.info("testTag", "Test NAPI sub: ", JSON.stringify(result));

    24.     })
    25.   })
    26. }
    复制代码
    ③右键LocalUnit.test.ets运行,控制台报错:
    [attachimg]5343[/attachimg]
    1. Running all tests
    2. Testing started at 21:48 ...

    3. Error in sub, is not callable

    4.     at anonymous (entry/src/test/LocalUnit.test.ets:21:28)
    5.     at anonymous (oh_modules/.ohpm/@ohos+hypium@1.0.19/oh_modules/@ohos/hypium/src/main/service.js:38:19)
    6.     at getFuncWithArgsZero (oh_modules/.ohpm/@ohos+hypium@1.0.19/oh_modules/@ohos/hypium/src/main/service.js:30:12)
    7.     at processedFunc (oh_modules/.ohpm/@ohos+hypium@1.0.19/oh_modules/@ohos/hypium/src/main/service.js:109:24)
    8.     at asyncRun (oh_modules/.ohpm/@ohos+hypium@1.0.19/oh_modules/@ohos/hypium/src/main/service.js:932:19)
    9.     at asyncRunSpecs (oh_modules/.ohpm/@ohos+hypium@1.0.19/oh_modules/@ohos/hypium/src/main/service.js:634:23)


    10. testNapi: [object Object]
    11. testNapi.sub: undefined
    12. typeof testNapi.sub: undefined
    13. Tests Run Finish.
    复制代码
    从输出中可以看到:
    · 1testNapi 是一个对象([object Object]),说明模块 'libentry.so' 加载成功。
    · 2typeof testNapi.sub 的结果是 undefined,说明 testNapi 对象中没有 sub 属性。
    · 3、在执行 testNapi.sub(a, b) 时,报错 Error in sub, is not callable,因为试图调用一个 undefined 的值。

    请问是否与模块加载机制的差异有关,或者我没有正确使用Hypium测试框架?
    (方法一)模拟器运行:成功
    (方法二)测试框架(Hypium):失败


    【运行环境】
    硬件:Windows11
    DevEvoStudio版本:5.0.1
    SDK版本:5.0.0
    fakename.png
    fakename.png
    fakename.png
    fakename.png
    fakename.png
    fakename.png
    fakename.png
    fakename.png

    您尚未登录,无法参与评论,登录后可以:
    参与开源共建问题交流
    认同或收藏高质量问答
    获取积分成为开源共建先驱

    Copyright   ©2025  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

    返回顶部