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

news2025/1/21 10:02:02

【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.coloradmin.cn/o/2279766.html

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

相关文章

excel实用工具

持续更新… 文章目录 1. 快捷键1.1 求和 2. 命令2.1 查找 vloopup 1. 快捷键 1.1 求和 windows: alt mac : command shift T 2. 命令 2.1 查找 vloopup vlookup 四个入参数 要查找的内容 (A2 6xx1)查找的备选集 (C2:C19)…

Linux中的基本指令(一)

一、Linux中指令的存在意义 Linux中,通过输入指令来让操作系统执行,以此达到控制操作系统的目的,类似于Windows中的双击,右键新建文件,新建文件夹等 1.补:关于屏幕的几个操作指令 ①清屏指令 clear 回…

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

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

2025年国产化推进.NET跨平台应用框架推荐

2025年国产化推进.NET跨平台应用框架推荐 1. .NET MAUI NET MAUI是一个开源、免费(MIT License)的跨平台框架(支持Android、iOS、macOS 和 Windows多平台运行),是 Xamarin.Forms 的进化版,从移动场景扩展到…

C++和OpenGL实现3D游戏编程【连载21】——父物体和子物体模式实现

欢迎来到zhooyu的专栏。 🔥C和OpenGL实现3D游戏编程【专题总览】 1、本节要实现的内容 上节课我们已经创建了一个基础Object类,以后所有的游戏元素都可以从这个基类中派生出来。同时为了操作方便,我们可以为任意两个Object类(及其…

unity插件Excel转换Proto插件-ExcelToProtobufferTool

unity插件Excel转换Proto插件-ExcelToProtobufferTool **ExcelToProtobufTool 插件文档****1. 插件概述****2. 默认配置类:DefaultIProtoPathConfig****属性说明** **3. 自定义配置类****定义规则****示例代码** **4. 使用方式****4.1 默认路径****4.2 自定义路径**…

【数据结构篇】顺序表 超详细!

目录 一.顺序表的定义 1.顺序表的概念及结构 1.1线性表 2.顺序表的分类 2.1静态顺序表 2.2动态顺序表 二.动态顺序表的实现 1.准备工作和注意事项 2.顺序表的基本接口: 2.0 创建一个顺序表 2.1 顺序表的初始化 2.2 顺序表的销毁 2.3 顺序表的打印 3.顺序…

vulnhub靶场【IA系列】之Tornado

前言 靶机:IA-Tornado,IP地址为192.168.10.11 攻击:kali,IP地址为192.168.10.2 都采用虚拟机,网卡为桥接模式 本文所用靶场、kali镜像以及相关工具,我放置在网盘中,可以复制后面链接查看 htt…

云上贵州多彩宝荣获仓颉社区先锋应用奖 | 助力数字政务新突破

在信息技术应用创新的浪潮中,仓颉社区吸引了众多企业和开发者的积极参与,已有多个应用成功落地,展现出蓬勃的创新活力。仓颉编程语言精心遴选了在社区建设、应用创新、开源共建、技术布道等方面做出突出贡献的优秀项目应用,并颁发…

第十二章:算法与程序设计

文章目录: 一:基本概念 1.算法与程序 1.1 算法 1.2 程序 2.编译预处理 3.面向对象技术 4.程序设计方法 5.SOP标志作业流程 6.工具 6.1 自然语言 6.2 流程图 6.3 N/S图 6.4 伪代码 6.5 计算机语言 二:程序设计 基础 1.常数 …

2025 最新flutter面试总结

目录 1.Dart是值传递还是引用传递? 2.Flutter 是单引擎还是双引擎 3. StatelessWidget 和 StatefulWidget 在 Flutter 中有什么区别? 4.简述Dart语音特性 5. Navigator 是什么?在 Flutter 中 Routes 是什么? 6、Dart 是不是…

BUUCTF_Web([GYCTF2020]Ezsqli)

1.输入1 ,正常回显。 2.输入1 ,报错false,为字符型注入,单引号闭合。 原因: https://mp.csdn.net/mp_blog/creation/editor/145170456 3.尝试查询字段,回显位置,数据库,都是这个。…

HTML学习笔记(4)

目录 一、背景相关样式 二、定位position 三、javascript 1、变量的定义 2、数据类型 3、绑定事件 一、背景相关样式 background-image: url(); // 背景图片 background-repeat: repeat; // 背景图片是否平铺 no-repeat background-size: 200px; // 背景图片尺寸 cover把…

亲测有效!如何快速实现 PostgreSQL 数据迁移到 时序数据库TDengine

小T导读:本篇文章是“2024,我想和 TDengine 谈谈”征文活动的优秀投稿之一,作者从数据库运维的角度出发,分享了利用 TDengine Cloud 提供的迁移工具,从 PostgreSQL 数据库到 TDengine 进行数据迁移的完整实践过程。文章…

Excel 技巧11 - 如何使用Excel作成简单的排班表(★★),weekday 函数,TEXT函数

本文讲了如何在Excel中制作简单的排班表。 1,排班表Layout效果 - B2 单元格找那个输入 日期 - C3 - AG3 输入日,就是该月份的几号,比如1月5号,就输入5 如果是周六周日,背景色显示为绿色 - B4 ~ 输入员工名称 当 B2…

mac m1下载maven安装并配置环境变量

下载地址:Download Apache Maven – Maven 解压到一个没有中文和空格的文件夹 输入pwd查看安装路径 输入cd返回根目录再输入 code .zshrc 若显示 command not found: code你可以通过以下步骤来安装和配置 code 命令: 1. 确保你已经安装了 Visual Studio…

w-form-select.vue(自定义下拉框组件)

文章目录 1、w-form-select.vue 组件中每个属性的含义2、实例3、源代码 1、w-form-select.vue 组件中每个属性的含义 好的,我们来详细解释 w-form-select.vue 组件中每个属性的含义,并用表格列出它们是否与后端字段直接相关: 属性解释表格&…

Flutter项目和鸿蒙平台的通信

Flutter项目和鸿蒙平台的通信 前言Flutter和Harmonyos通信MethodChannelBasicMessageChannelEventChannel 前言 大家在使用Flutter开发项目的时候, Flutter提供了Platfrom Channel API来和个个平台进行交互。 Flutter官方目前提供了一下三种方式来和个个平台交互&…

【KOA框架】koa框架基础入门

koa是express的一层封装,语法比express更加简洁。所以有必要了解下koa的相关开发方法。 代码实现 package.json {"name": "koapp","version": "1.0.0","main": "index.js","scripts": {&…

我的创作纪念日——我与CSDN一起走过的365天

目录 一、机缘:旅程的开始 二、收获:沿路的花朵 三、日常:不断前行中 四、成就:一点小确幸 五、憧憬:梦中的重点 一、机缘:旅程的开始 最开始开始写博客是在今年一二月份的时候,也就是上一…