使用napi调用第三方so崩溃?

我使用API10中napi调用第三方库,但是在CMakeList.txt中添加target_link_libraries以后会导致程序运行崩溃

CMakeList.txt如下:

# the minimum version of CMake.
cmake_minimum_required(VERSION 3.4.1)
project(WinmageScan)

set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})

#if(DEFINED PACKAGE_FIND_FILE)
#    include(${PACKAGE_FIND_FILE})
#endif()

include_directories(${NATIVERENDER_ROOT_PATH}
                    ${NATIVERENDER_ROOT_PATH}/include)

add_library(scan SHARED napi_init.cpp)
target_link_libraries(scan PUBLIC libace_napi.z.so)
target_link_libraries(scan PUBLIC ${NATIVERENDER_ROOT_PATH}/../../../libs/arm64-v8a/libmy.z.so)

崩溃后日志信息如下:

Error message:Cannot read property add of undefined
SourceCode:
                hilog.info(0x0000, 'testTag', 'Test NAPI 2 + 3 = %{public}d', testNapi.add(2, 3));
                                                                              ^
Stacktrace:
    at anonymous (scan/src/main/ets/pages/Index.ets:16:75)

求助:HarmonyOS如何正确使用第三方库呢

阅读 866
avatarAI BotBETA

针对你提到的问题,看起来崩溃的原因并不直接关联于CMake配置或napi(Node.js的Native API)的链接问题,而是与JavaScript代码中的testNapi.add方法调用有关。错误信息“Cannot read property 'add' of undefined”表明testNapi对象在调用add方法时是未定义的。

这里有几个可能的解决步骤和检查点:

  1. 确认napi模块加载和初始化
    确保你的napi模块(可能是通过libace_napi.z.solibmy.z.so提供的)已经被正确加载和初始化。检查你的Node.js或HarmonyOS的JavaScript环境中是否有相应的代码来加载这个模块,并创建testNapi对象。
  2. 检查napi模块的实现
    查看libace_napi.z.solibmy.z.so的源代码或文档,确认add函数是否被正确导出,并且其导出方式(如使用NAPI_MODULE宏)与你的JavaScript代码中的使用方式相匹配。
  3. JavaScript代码中的模块加载
    如果你的napi模块是通过某种方式(如require或HarmonyOS特有的模块加载机制)在JavaScript中加载的,确保这部分代码没有错误,并且testNapi对象在调用add方法之前已经被正确赋值。
  4. 调试和日志
    在调用testNapi.add之前,添加日志来检查testNapi对象的状态。例如,你可以打印console.log(testNapi)来查看它是否为undefined或包含预期的方法。
  5. CMake配置检查
    虽然CMake配置可能不是直接原因,但确保所有路径和库都正确无误是很重要的。检查libmy.z.so的路径是否正确,以及它是否适用于你的目标平台(如arm64-v8a)。
  6. HarmonyOS特定问题
    如果你在使用HarmonyOS,确保你遵循了HarmonyOS的文档和最佳实践来加载和使用第三方库。HarmonyOS可能有其特定的模块加载和API调用方式。
  7. 更新和兼容性
    检查你的Node.js或HarmonyOS版本是否与你的napi模块兼容。
  8. 错误处理和异常捕获
    在JavaScript代码中添加错误处理和异常捕获逻辑,以便在出现问题时能够更清楚地了解发生了什么。

通过上述步骤,你应该能够诊断并解决“Cannot read property 'add' of undefined”的问题。如果问题仍然存在,可能需要更详细地检查napi模块的实现或寻求来自该模块开发者的帮助。

1 个回答

Native侧可通过dlopen动态加载so库。
假设这里我们需要调用liba.so中的add函数。
1、首先需要将liba.so文件放到libs/arm64-v8a/路径下。
2、然后需要我们在ArkTS侧传递so库路径信息到Native侧。
3、然后在Native侧通过dlopen函数动态加载so库。
参考链接:Native侧如何动态加载SO库

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题