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

devtools/2025/1/22 17:37:39/

【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.ppmy.cn/devtools/152648.html

相关文章

Elixir语言的语法

Elixir 语言简介与实践 1. 引言 在现代软件开发中,选择合适的编程语言对于项目的成功至关重要。Elixir作为一种功能强大的并发编程语言,近年来逐渐走入开发者的视野。本文将通过Elixir的基本语法、特性和实践案例,帮助读者深入了解这种语言…

MySQL篇之对MySQL进行参数优化,提高MySQL性能

1. MySQL参数优化说明 MySQL 参数调优是提高数据库性能的重要手段之一。通过调整 MySQL 的配置参数,可以优化查询速度、提升并发处理能力、减少资源消耗等。 MySQL 的性能优化涉及到多个方面,包括内存管理、磁盘 I/O、查询优化、连接管理、复制配置等。…

2.6 聚焦:Word Embedding

聚焦:Word Embedding Word Embedding(词嵌入) 是一种将词语转化为低维向量表示的技术,使得词语在数学空间中具有语义上的相似性。它是自然语言处理(NLP)中不可或缺的一部分,为文本数据提供了强大的表示能力。与传统的基于词频的词袋模型(Bag-of-Words)相比,Word Emb…

Java面试专题——面向对象

面向过程和面向对象的区别 面向过程:当事件比较简单的时候,利用面向过程,注重的是事件的具体的步骤/过程,注重的是过程中的具体的行为,以函数为最小单位,考虑怎么做。 面向对象:注重找“参与者…

leetcode215.数组中的第K个最大元素

标签:计数排序 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输…

【个人学习记录】软件开发生命周期(SDLC)是什么?

软件开发生命周期(Software Development Life Cycle,SDLC)是一个用于规划、创建、测试和部署信息系统的结构化过程。它包含以下主要阶段: 需求分析(Requirements Analysis) 收集并分析用户需求定义系统目标…

【大模型系列篇】Vanna-ai基于检索增强(RAG)的sql生成框架

简介 Vanna是基于检索增强(RAG)的sql生成框架 Vanna 使用一种称为 LLM(大型语言模型)的生成式人工智能。简而言之,这些模型是在大量数据(包括一堆在线可用的 SQL 查询)上进行训练的,并通过预测响应提示中…

18.Elasticsearch 7.15 Query DSL 之 bool查询

bool查询简介 布尔查询允许使用布尔逻辑(AND, OR, NOT)将多个查询子句组合成复杂查询,是Elasticsearch查询DSL的一部分。bool 查询映射到 Lucene BooleanQuery。它使用一个或多个布尔子句构建,这些布尔子句包括: 布尔…