【HarmonyOS NAPI 深度探索12】创建你的第一个 HarmonyOS NAPI 模块

【HarmonyOS NAPI 深度探索12】创建你的第一个 HarmonyOS NAPI 模块

在本篇文章中,我们将一步步走过如何创建一个简单的 HarmonyOS NAPI 模块。通过这个模块,你将能够更好地理解 NAPI 的工作原理,并在你的应用中开始使用 C++ 与 JavaScript 的交互。我们将从头开始创建,帮助你快速入门。

准备工作

首先,确保你已经完成了前面的环境搭建和 DevEco Studio 的安装。如果还没有,可以参考我们之前的教程进行安装,并确保你能够在 DevEco Studio 中正常创建项目。

创建项目
  1. 启动 DevEco Studio
    打开 DevEco Studio,进入主界面后点击 File > New > Project,选择 Native C++
    在这里插入图片描述

在这里插入图片描述

  1. 选择开发平台
    输入项目名称,例如 MyFirstNapiModule,以及包名、项目位置、编译SDK版本模块名称(默认entry)以及设备类型,目前支持:

    • Phone
    • Tablet
    • 2in1
    • Car
      默认已勾选了前三个:
      在这里插入图片描述
  2. 项目结构概览
    项目创建后,在entry下你会看到一个基本的项目结构。关键部分包括:

    • cpp/napi_init.cpp 文件: C++ 代码。
    • cpp/types 文件夹:动态库声明以及接口声明。
    • CMakeList.txt:用于构建C++的配置文件。
      在这里插入图片描述
编写 C++ 模块代码
  1. 编辑 C++ 代码
    napi_init.cpp 文件下,实现了一个简单的加法运算示例,通过TS传入两个数字,C++中相加后返回到TS。代码如下:
    #include "napi/native_api.h"  static napi_value Add(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 sum;  napi_create_double(env, value0 + value1, &sum);  return sum;  }  EXTERN_C_START  static napi_value Init(napi_env env, napi_value exports)  {  napi_property_descriptor desc[] = {  { "add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr }  };  napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);  return exports;  }  EXTERN_C_END  static napi_module demoModule = {  .nm_version = 1,  .nm_flags = 0,  .nm_filename = nullptr,  .nm_register_func = Init,  .nm_modname = "entry",  .nm_priv = ((void*)0),  .reserved = { 0 },  };  extern "C" __attribute__((constructor)) void RegisterEntryModule(void)  {  napi_module_register(&demoModule);  }
这段代码中,我们定义了一个简单的 `Add` 函数,它将最后相加结果返回给 JavaScript 层。
  1. 配置 CMakeLists.txt
    确保你的 CMakeLists.txt 文件包含正确的配置,来编译和链接你的原生模块。一个基本的 CMakeLists.txt 配置如下:
# the minimum version of CMake.  
cmake_minimum_required(VERSION 3.5.0)  
project(nativedemo)  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(entry SHARED napi_init.cpp)  
target_link_libraries(entry PUBLIC libace_napi.z.so)
这个文件告诉 CMake 如何编译 C++ 代码并链接到 Node.js 库。
编写 JavaScript 调用代码
  1. Index.ets文件中调用C++提供的Add方法
    代码如下:
import { hilog } from '@kit.PerformanceAnalysisKit';  
import testNapi from 'libentry.so';  @Entry  
@Component  
struct Index {  @State message: string = 'Hello World';  build() {  Row() {  Column() {  Text(this.message)  .fontSize(50)  .fontWeight(FontWeight.Bold)  .onClick(() => {  hilog.info(0x0000, 'testTag', 'Test NAPI 2 + 3 = %{public}d', testNapi.add(2, 3));  })  }  .width('100%')  }  .height('100%')  }  
}
这里我们通过 `import testNapi from 'libentry.so'` 引入 C++ 模块,并调用 `add()` 方法,输入两个参数,它会输出 C++ 中相加的结果。
构建和调试
  1. 构建项目
    在 DevEco Studio 中,点击 Build > Build Project,DevEco Studio 会使用 CMake 编译 C++ 代码并生成共享库。构建成功后,你会看到 BUILD SUCCESSFUL 的提示。

  2. 调试项目
    在 DevEco Studio 中,你可以设置断点并启动调试器,查看 C++ 代码执行的详细过程。点击 Run > Debug,选择目标设备进行调试。

测试模块
  1. 运行 JavaScript 代码
    运行项目点击Hello Word文字,你应该能看到控制台输出:
Test NAPI 2 + 3 = 5

在这里插入图片描述

  1. 检查输出
    如果一切正常,说明你成功创建了第一个 HarmonyOS NAPI 模块,并且能够从 JavaScript 中调用 C++ 函数。
总结

通过本篇教程,我们已经成功创建了一个简单的 HarmonyOS NAPI 模块,并从 JavaScript 调用它。通过 NAPI,你可以方便地将 C++ 的高效性能与 TS的灵活性结合起来,为你的 HarmonyOS 应用提供更强大的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/893258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV相机标定与3D重建(62)根据两个投影矩阵和对应的图像点来计算3D空间中点的坐标函数triangulatePoints()的使用

加粗样式- 操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 这个函数通过使用立体相机对3维点的观测,重建这些点的三维坐标(以齐次坐标表示)。 cv::triangula…

为AI聊天工具添加一个知识系统 之58 从文字块构造到数据库创建

本文要点 要点 文字块 为了项目(为AI聊天工具的聊天者 开挂知识系统) ,我们探索一下知识的“种子”到底“藏”在哪,知识树又是如何“生根发芽开会结果”的。 看看下面的四组表达(仔细体会理解消化每一个字 以及上下文 和标题):…

【电视盒子】HI3798MV300刷机教程笔记/备份遥控码修复遥控器/ADB/线刷卡刷/电视盒子安装第三方应用软件

心血来潮,看到电视机顶盒满天飞的广告,想改造一下家里的电视盒子,学一下网上的人刷机,但是一切都不知道怎么开始,虽然折腾了一天,以失败告终,还是做点刷机笔记。 0.我的机器 年少不会甄别&…

Python基于OpenCV和PyQt5的人脸识别上课签到系统【附源码】

博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…

【FPGA】MIPS 12条整数指令【1】

目录 修改后的仿真结果 修改后的完整代码 实现bgtz、bltz、jalr 仿真结果(有问题) bltz------并未跳转,jCe? 原因是该条跳转语句判断的寄存器r7,在该时刻并未被赋值 代码(InstMem修改前) i…

uniapp(小程序、app、微信公众号、H5)预览下载文件(pdf)

1. 小程序、app 在uniapp开发小程序环境或者app环境中,都可以使用以下方式预览文件 之前其实写过一篇,就是使用uniapp官网提供文件下载、文件保存、文件打开的API, uniapp文件下载 感兴趣也可以去看下 uni.downloadFile({// baseURL 是

Java面试专题——常见面试题1

引入 本文属于专题中的常见面试题模块,属于面试时经常遇到的,适合需要面试的小伙伴做面试前复习准备用,后续会持续补充 1.面向对象基本特征 面向对象的基本特征是什么?怎么理解? 面向对象的基本特征是封装、继承、…

【博客之星2024】技术洞察:前沿技术趋势与创新实践

前言 随着科技的飞速发展,技术的前沿趋势和跨领域的融合创新已经成为影响现代社会的重要因素。无论是 人工智能 (AI)、区块链 还是 量子计算,这些新兴技术不仅仅改变了行业的运行方式,还深入影响了社会、文化及个人的生活方式。因此&#xf…

VUE实现简单留言板(Timeline+infinite scroll+Springboot+Hibernate)

先贴出效果图: 留言按照倒序排列。在底部的文本框内输入留言后,点击“留言”按钮,留言将保存至数据库中,同时刷新网页,新留言出现在顶部。 当滚动条到底部时,自动调用加载函数,显示更多早期留…

Java基础(3)

Java 数据类型详解 九、运算符 1. 基本运算符 Java 提供了多种运算符来执行不同的操作: 算术运算符:(加)、-(减)、*(乘)、/(除)、%(取模&…

电力场景红外测温图像绝缘套管分割数据集labelme格式2436张1类别

数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):2436 标注数量(json文件个数):2436 标注类别数:1 标注类别名称:["arrester"] 每个类别标注的框数&am…

降维算法:主成分分析

主成分分析 一种常用的数据分析技术,主要用于数据降维,在众多领域如统计学、机器学习、信号处理等都有广泛应用。 主成分分析是一种通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量(即主成分)的方法。这些主…

CTE与临时表:优劣势对比及使用场景分析

在数据库开发中,尤其是在复杂查询和优化中,**公共表表达式(CTE)和临时表(Temporary Table)**是两种常用的工具。尽管它们的功能有些相似,都是为了处理中间结果集,但它们的优劣势和使…

文献综述相关ChatGPT提示词分享

文献综述 ChatGPT 可以帮助提高文献综述的有效性和全面性。ChatGPT可以高效搜索和审查与宝子们课题研究相关的文献资料来源。一些给力的插件工具还可以帮助您总结复杂的研究论文并提取信息以更快更好地消化信息。合理的运用ChatGPT和GPTs可以提高文献综述的清晰度和质量&#…

深入解析 C++17 中的 u8 字符字面量:提升 Unicode 处理能力

在现代软件开发中,处理多语言文本是一个常见需求,特别是在全球化的应用场景下。C17 标准引入的 u8 字符字面量为开发者提供了一个强大的工具,以更有效地处理和表示 UTF-8 编码的字符串。本文将详细探讨 u8 字符字面量的技术细节、实际应用&am…

ElasticSearch索引别名的应用

个人博客:无奈何杨(wnhyang) 个人语雀:wnhyang 共享语雀:在线知识共享 Github:wnhyang - Overview Elasticsearch 索引别名是一种极为灵活且强大的功能,它允许用户为一个或多个索引创建逻辑上…

全局变量声明,自动引入依赖(unplugin-auto-import)( declare global)

declare global 如果,要在全局作用域中声明一个新的变量或函数,供整个项目中的多个模块使用。可以使用 declare global 来实现。 在一个全局声明文件中,如 globals.d.ts declare global {var globalVar: numberfunction globalFunction(): …

Java高频面试之SE-15

hello啊,各位观众姥爷们!!!本牛马baby今天又来了!哈哈哈哈哈嗝🐶 String 怎么转成 Integer 的?它的原理是? 在 Java 中,要将 String 转换为 Integer 类型,可…

2024又是一年的CSDN之旅-总结过去展望未来

一、前言 一年就这样在忙忙碌碌的工作和生活中一晃而过,总结今年在CSDN上发表的博客,也有上百篇之多,首先感谢CSDN这个平台,能让我有一个地方记录工作中的点点滴滴,也在上面学到了不少知识,解决了工作中遇到…

c86机器安装nvaid显卡驱动报错:ERROR:Unable to load the kernel module ‘nvidia.ko‘.

背景: 最近小伙伴要去北京甲方现场搭建我们的AI编码服务,需要使用GPU机器跑大模型,根据现场提供的信息是2台C86的机器,显卡够够的,但是现场是内网环境,因此,需要先准备好需要的安装包&#xff…