【HarmonyOS NAPI 深度探索6】使用 N-API 创建第一个 Hello World 原生模块
【HarmonyOS NAPI 深度探索6】使用 N-API 创建第一个 Hello World 原生模块
开发一个 N-API 模块听起来可能有点技术感十足,但实际上入门并不复杂。今天,我们就来一步步实现一个简单的 Hello World 原生模块,感受一下 N-API 开发的魅力。
环境准备
在开始之前,请确保你已经安装了以下工具:
- Node.js:运行时环境,建议安装 LTS 版本。
- C++ 编译器:根据你的操作系统安装合适的编译器(如 Visual Studio Build Tools、Xcode 或 GCC)。
- node-gyp:通过 npm 安装,运行
npm install -g node-gyp即可。
确保这些工具都已配置完成,你就可以着手开发了。
创建项目
- 创建一个新的项目文件夹:
mkdir napi-hello-world cd napi-hello-world - 初始化 Node.js 项目:
这会生成一个默认的npm init -ypackage.json文件。 - 安装必要的依赖:
npm install --save nan
配置构建工具
N-API 使用 node-gyp 来编译原生代码,因此需要创建一个 binding.gyp 文件。
- 在项目根目录下创建
binding.gyp文件:
这里的{"targets": [{"target_name": "hello","sources": ["hello.cc"]}] }target_name是模块的名字,sources指定了 C++ 源文件。
编写 C++ 源代码
接下来,我们需要创建一个简单的 C++ 文件 hello.cc,实现 Hello World 功能。
-
创建
hello.cc文件:#include <napi.h>Napi::String HelloWorld(const Napi::CallbackInfo& info) {return Napi::String::New(info.Env(), "Hello, HarmonyOS N-API!"); }Napi::Object Init(Napi::Env env, Napi::Object exports) {exports.Set("hello", Napi::Function::New(env, HelloWorld));return exports; }NODE_API_MODULE(hello, Init)这段代码的核心逻辑是定义了一个返回字符串的函数
HelloWorld,并将其暴露给 Node.js 使用。
编译模块
使用 node-gyp 将上述代码编译成可运行的模块:
- 运行以下命令生成构建文件:
node-gyp configure - 执行编译:
如果一切正常,你将在项目目录下看到一个node-gyp buildbuild/Release文件夹,里面包含了编译生成的模块文件(如hello.node)。
测试模块
我们可以通过一个简单的 JavaScript 文件测试刚刚创建的模块。
-
在项目根目录下创建
test.js文件:const hello = require('./build/Release/hello'); console.log(hello.hello()); -
运行测试文件:
node test.js如果输出
Hello, HarmonyOS N-API!,恭喜你,原生模块开发成功了!
解析代码
让我们简单回顾一下代码的关键部分:
- Napi::String::New
这是 N-API 提供的 API,用于创建一个 JavaScript 字符串对象。 - Napi::Object::Set
用来将函数绑定到模块的导出对象中,以便在 JavaScript 中调用。 - NODE_API_MODULE
宏定义模块的入口函数,告诉 Node.js 这个模块应该如何初始化。
扩展与提升
这个 Hello World 模块只是 N-API 的基础入门,接下来你可以尝试添加更多功能,比如:
- 接受参数并进行简单计算。
- 与操作系统进行交互(如文件系统、网络请求)。
- 集成现有的 C++ 库,扩展模块的功能。
通过这些实践,你会更深入地理解 N-API 的强大之处,也为后续的 HarmonyOS 开发打下坚实基础。
相关文章:
【HarmonyOS NAPI 深度探索6】使用 N-API 创建第一个 Hello World 原生模块
【HarmonyOS NAPI 深度探索6】使用 N-API 创建第一个 Hello World 原生模块 开发一个 N-API 模块听起来可能有点技术感十足,但实际上入门并不复杂。今天,我们就来一步步实现一个简单的 Hello World 原生模块,感受一下 N-API 开发的魅力。 环…...
Java语言的软件工程
Java语言的软件工程 引言 在当今信息技术飞速发展的时代,软件工程作为一门应用广泛的学科,承担着开发高质量软件系统的重要责任。Java语言以其跨平台特性、安全性和强大的库支持,已经成为软件工程领域中最流行的编程语言之一。本文将深入探…...
【Mysql进阶知识】Mysql 程序的介绍、选项在命令行配置文件的使用、选项在配置文件中的语法
目录 一、程序介绍 二、mysqld--mysql服务器介绍 三、mysql - MySQL 命令行客户端 3.1 客户端介绍 3.2 mysql 客户端选项 指定选项的方式 mysql 客户端命令常用选项 在命令行中使用选项 选项(配置)文件 使用方法 选项文件位置及加载顺序 选项文件语法 使用举例&am…...
wireshark抓路由器上的包 抓包路由器数据
文字目录 抓包流程概述设置抓包配置选项 设置信道设置无线数据包加密信息设置MAC地址过滤器 抓取联网过程 抓包流程概述 使用Omnipeek软件分析网络数据包的流程大概可以分为以下几个步骤: 扫描路由器信息,确定抓包信道;设置连接路由器的…...
玩转大语言模型——使用graphRAG+Ollama构建知识图谱
系列文章目录 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 文章目录 系列文章目录前言下载和安装用下载项目的方式下载并安装用pip方式下载并安装 生成知识图谱初始化文件夹修改模型配置修改知识库生成配置创…...
python flask简单实践
项目结构 project/ │ ├── app.py ├── instance/ │ └── database.db ├── templates/ │ └── index.html ├── static/ │ └── style.css │ └── favicon.ico └── database.db首先创建目录,static 存放一些页面的样式或图标文件…...
JAVA实现五子棋小游戏(附源码)
文章目录 一、设计来源捡金币闯关小游戏讲解1.1 主界面1.2 黑棋胜利界面1.3 白棋胜利界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载更多优质源码分享 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/145161039 JA…...
kotlin的dagger hilt依赖注入
依赖注入(dependency injection, di)是设计模式的一种,它的实际作用是给对象赋予实例变量。 基础认识 class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceSta…...
速通Docker === 常用命令
目录 Docker命令 镜像操作 容器操作 基础操作 启动参数 容器内部操作 打包成指定文件 发布镜像 总结 镜像操作 容器操作 启动容器参数 容器内部操作 打包镜像 启动指定镜像的容器 发布镜像 Docker命令 启动一个nginx,并将它的首页改为自己的页面,发布…...
【redis】键的全局命令
Redis提供了一系列用于管理和操作键的全局命令。这些命令允许你查看、删除、迁移键,以及执行其他与键相关的操作。 有关全局通用类型的命令可以通过help generic命令来查看。有关命令的使用可以通过help 命令来查看,例如help keys。 KEYS keys&#x…...
深度学习-卷积神经网络实战文档注释
1、call 方法 是一个特殊的方法,它允许类的实例表现得像函数一样。也就是说,你可以使用圆括号 () 来调用一个实例,就像调用普通函数一样。 当你调用 model(input_data) 时,实际上是调用了模型的 __ call __ 方法,其会自…...
GR2103高压半桥栅极驱动芯片
产品简介 GR2103封装和丝印 GR2103是一款高性价比的高压半桥栅极驱动专用芯片,设计用于高压、高速驱动N型大功率 MOS管、IGBT管。内置欠压(UVLO)保护功能,防止功率管在过低的电压下工作,提高效率。内置防止直通功能…...
学习threejs,使用OrbitControls相机控制器
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.OrbitControls 相机控…...
说说Babylon.js中scene.deltaTime的大坑
诡异的问题 下面是给一个材质设置发光颜色周期变化和纹理偏移的代码,你能感觉到这里面可能出现的问题吗? var passTime 0;var uOffset 0;var deltaTime 0;function SetEmissiveColor() {passTime scene.deltaTime * 0.05;if(passTime > 6.2…...
【React】win系统环境搭建
动图更精彩 方案如下 在Visual Studio Code(VSCode)中搭建React开发环境是一个相对简单但非常重要的步骤,可以帮助你更高效地进行前端开发。以下是详细的步骤和配置指南: 一、准备工作 安装Visual Studio Code (VSCode)&#x…...
ThinkPHP 8的一对一关联
【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…...
Linux 下配置 Golang 环境
go sdk 下载环境:https://golang.google.cn/dl/选择对应的版本: 使用 wget 直接拉包下载到服务器中 wget https://golang.google.cn/dl/go1.23.4.linux-amd64.tar.gz如果找不到 wget 命令,yum 下载 wget yum -y install wget配置 go 的环境…...
爬虫后的数据处理与使用(使用篇--实现分类预测)
()紧接上文,在完成基本的数据处理后,接下来就是正常的使用了。当然怎么用,确实需要好好思考一下~ 上文:爬虫后的数据处理与使用(处理篇) 前言: 一般来说,我…...
arcgis提取不规则栅格数据的矢量边界
效果 1、准备数据 栅格数据:dem或者dsm 2、栅格重分类 分成两类即可 3、新建线面图层 在目录下选择预先准备好的文件夹,点击右键,选择“新建”→“Shapefile”,新建一个Shapefile文件。 在弹出的“新建Shapefile”对话框内“名称”命名为“折线”,“要素类型”选…...
python milvus 如何检查有多少个collection 以及多少个index,多少个database
在 Milvus 中,可以通过 Python 客户端(`pymilvus`)来检查当前有多少个集合(Collection)、索引(Index)和数据库(Database)。以下是具体的方法: --- ### 1. 检查有多少个集合(Collection) 使用 `list_collections()` 方法可以列出当前连接的所有集合。 ```python…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
