OpenHarmony开发者论坛

标题: Hypium测试框架是否支持 “Native侧集成C/C++三方库SO” 的测试? [打印本页]

作者: wangyihao1    时间: 2025-3-11 23:23
标题: Hypium测试框架是否支持 “Native侧集成C/C++三方库SO” 的测试?
【问题描述】
问题现象和发生的背景:

之前尝试将自定义三方库sub编译出SO,并写出对应napi接口文件,通过JS代码最终调用C/C++三方库,编出hap包后在模拟器上测试成功(方法一)。
参考:在Native侧如何集成三方SO库-NDK开发-NDK开发-应用框架开发-开发 - 华为HarmonyOS开发者

现在想通过使用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





欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5