首页 > 编程语言 >掌握DevEco Studio这一功能,高效实现ArkTS与C++胶水代码

掌握DevEco Studio这一功能,高效实现ArkTS与C++胶水代码

时间:2024-12-21 20:04:31浏览次数:5  
标签:ArkTS DevEco 代码 C++ Studio value env napi

掌握DevEco Studio这一功能,高效实现ArkTS与C++胶水代码

1、背景介绍

HarmonyOS 主要提供了ArkTS与C++作为开发语言:

  • ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,保持了TS的基本风格,同时通过规范定义强化开发期静态检查和分析,提升程序执行稳定性和性能。ArkTS适合用在高效UI界面开发场景。
  • C++以NDK(Native Development Kit)工具集的方式提供支持,NDK是HarmonyOS SDK提供的Native API、相应编译脚本和编译工具链的集合,方便开发者使用C或C++语言实现应用的关键功能。NDK只覆盖了HarmonyOS一些基础的底层能力,如C运行时基础库libc、图形库、窗口系统、多媒体、压缩库、面向ArkTS/JS与C跨语言的Node-API等,并没有提供ArkTS/JS API的完整能力。C++语言适合下方这些场景:
    • 性能敏感的场景,如游戏、物理模拟等计算密集型场景。
    • 需要复用已有C或C++库的场景。
    • 需要针对CPU特性进行专项定制库的场景,如Neon加速。

有一些能力HarmonyOS只提供了C++接口支持,比如音视频编解码等,而且我们注意到最新发布的HarmonyOS 5.0.1版本,新增的能力主要是C API,所以要挖掘HarmonyOS更多能力成为一个资深HarmonyOS工程师,ArkTS与C++混合开发是必不可少的。

ArkTS调用C++需要经过一系列复杂流程,本文主要介绍DevEco Studio提供的一键生成跨语言“胶水”代码工具帮助大家提升开发效率。

2、ArkTS调用C++方法流程

类似于Android JNI,HarmonyOS 中ArkTS调用C++方法主要是NAPI提供能力。本节以DevEco Studio新建的Native C++工程Demo为例介绍ArkTS调用C++方法流程。下图是创建Native C++工程后的代码结构图:
在这里插入图片描述

主要有三大部分组成:

  • types:
    • Index.d.ts:主要包含对ArkTS暴露的C++接口。
    • oh-package.json5:指定动态库名称和上面Index.d.ts文件路径。
  • CMakeLists.txt:C++代码构建脚本。
  • napi_init.cpp:C++实现代码

开发Native模块一般流程就是要实现上述对应模块。

2.1 Index.d.ts中声明C++接口

声明的函数供C++实现和ArkTS中调用

export const add: (a: number, b: number) => number;
2.2 C++中注册和实现声明方法

首先在NAPI的Init方法中注册Index.d.ts中声明的方法:

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

napi_property_descriptor是一个数组,可以实现多个方法。示例中字符串"add"表示Index.d.ts中声明的add方法,第三个参数Add表示C++中实现的方法名。接下来就需要实现Add方法:

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;  
  
}

NAPI的实现方法结构是固定的,返回值必须是napi_value,参数必须是两个napi_env与napi_callback_info,方法中解析napi_callback_info具体参数信息实现具体功能。

2.3 CMakelist.txt中配置编译的动态库名称与C++源码列表

add_library指定编译输出的库名称和参与编译的C++代码列表:

add_library(entry SHARED napi_init.cpp)

这方面知识可以参考CMake构建工具相关文档:https://cmake.org/

2.4 ArkTS中调用声明的方法

最后,实现好后就可以在ArkTS中调用对应的方法:

//首先导入动态库:
import testNapi from 'libentry.so';
//调用对应add方法
hilog.info(0x0000, 'testTag', 'Test NAPI 2 + 3 = %{public}d', testNapi.add(2, 3));

3、DevEco Studio 快速生成胶水代码

从上面ArkTS调用C++方法流程看流程还是有点繁琐,需要在两个文件三处地方做处理,有没有便捷的方法呢?别着急,接下来介绍今天的重头戏,DevEco Studio IDE 提供的跨语言代码编辑

DevEco Studio IDE提供了两种创建方式:

  1. Index.d.ts中编写函数声明,一键生成C++函数
  2. C++头文件编写C++函数声明,一键生成注册代码

下面分别进行详细介绍。

3.1 Index.d.ts中编写函数声明,一键生成C++函数

在Index.d.ts中声明方法后,IDE会提示错误,鼠标悬停后会有下图提示:
在这里插入图片描述

点击“Generate native implementation”后即可快捷生成C++中的注册代码与实现代码:
在这里插入图片描述

这样三处手动实现变成了一处,功能还是非常实用,提效不止三分之二。

3.2 C++头文件编写C++函数声明,一键生成注册代码

通过C++函数声明一键创建的方式,需要我们先创建一个头文件,然后在头文件中声明方法:
在这里插入图片描述

右键该方法,点击生成:
在这里插入图片描述

继续点击NAPI:
在这里插入图片描述

注册函数中,以及对应NAPI函数实现已经帮助我们完成生成:

在这里插入图片描述

Index.d.ts中的声明方法也已经帮助我们生成:
在这里插入图片描述

通过IDE的版主,跨语言之间的“胶水”代码编写极大的提高了效率,不得不说,DevEco Studio 提供的这块功能还是相当不错的,很为广大程序员考虑。

这里面需要注意的有三点:

  1. 快捷生成代码的头文件支持类型:.hpp,.hxx,.hh,.h;
  2. 声明的快捷生成NAPI的函数当前支持bool,int,string,void,float,double,std::array,std::vector等参数类型;
  3. 如果工程中已经创建napi_init.cpp,则会在文件的Init中追加,如果没有创建,IDE会帮助我们自动创建。

4、借助AI提升C++代码中NAPI类型转换代码书写

有了IDE提供的自动生成跨语言胶水代码已经极大的帮助我们进行Native 代码开发,但是可能还有小伙伴感觉生成的TODO中的代码也很繁琐,很多ArkTS与C++的跨语言转换代码也很模版和繁琐,有没有对应的提效办法呢?
以自动生成的add代码为例:

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;  
  
}

需要从napi_callback_info解析两个int类型参数,完成运算后还要继续生成napi_value返回。

因为这种跨语言数据类型转换时NAPI协议,DevEco CodeGenie插件也提供了不错的支持,可以在DevEco Studio 中安装Genie插件帮助我们生成快速生成C++实现代码:
在这里插入图片描述

这样,几次“TAB”键后就帮我们生成差不多了,再根据我们业务逻辑实现自己代码即可。

5、总结

本文主要介绍了Native C++代码的实现步骤,以及DevEco Studio IDE提供的跨语言代码编辑工具,实现只写函数声明一键帮助我们生成对应初始化注册方法与C++实现方法,希望大家多多体验,通过工具提升我们开发效率。

标签:ArkTS,DevEco,代码,C++,Studio,value,env,napi
From: https://blog.csdn.net/sjw890821sjw/article/details/144513203

相关文章

  • HarmonyOS Next开发工具DevEco Studio介绍:ASan与TSan检测根治你的C++恐惧症
    1、背景介绍很多开发者面对C++都很犯怵,其中主要的一块就是内存操作。不合理的内存操作,比如数组越界、内存泄露、释放已释放的地址,可能会引起程序性能问题:内存消耗大,卡顿,更严重的会导致程序出现崩溃。当应用运行发生错误使应用进程终止时,应用将会抛出错误日志以通知应用崩溃......
  • 详解 C++ 中的无序容器
    在C++中,无序容器(unorderedcontainers)是指基于哈希表实现的容器,主要特点是元素存储顺序无关,强调高效的插入、删除和查找操作。以下是C++标准库中所有无序容器的详解。无序容器分类C++中的无序容器主要包括以下4类:unordered_setunordered_multisetunordered_mapun......
  • 实验六 C++
    任务四:Vector.hpp:#pragmaonce#ifndefVECTOR_HPP#defineVECTOR_HPP#include<iostream>#include<stdexcept>//为异常类提供支持#include<memory>//为std::unique_ptr提供支持template<typenameT>classVector{private:std::uniqu......
  • 【华为OD-E卷-寻找关键钥匙 100分(python、java、c++、js、c)】
    【华为OD-E卷-寻找关键钥匙100分(python、java、c++、js、c)】题目小强正在参加《密室逃生》游戏,当前关卡要求找到符合给定密码K(升序的不重复小写字母组成)的箱子,并给出箱子编号,箱子编号为1~N。每个箱子中都有一个字符串s,字符串由大写字母、小写字母、数字、标点符号......
  • 【华为OD-E卷-最多提取子串数目 100分(python、java、c++、js、c)】
    【华为OD-E卷-最多提取子串数目100分(python、java、c++、js、c)】题目给定[a-z],26个英文字母小写字符串组成的字符串A和B,其中A可能存在重复字母,B不会存在重复字母,现从字符串A中按规则挑选一些字母,可以组成字符串B。挑选规则如下:同一个位置的字母只能挑选一次......
  • c++判断windows进程是否存在
    #include<iostream>#include<cstdio>#include<cstring>boolisProcessRunning(conststd::string&processName){//构建命令来查找指定进程std::stringcommand="tasklist|findstr"+processName;//打开命令管道FILE*pi......
  • C++ 发展历程全解析
    引言C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持面向过程的程序设计,还支持面向对象的程序设计(OOP)和泛型编程的程序设计语言。它由丹麦计算机科学家BjarneStroustrup于1979年在贝尔实验室开始设计开发。C++的发展经历了多个阶段,从最初的实验性扩展到......
  • C vs C++: 一场编程语言的演变与对比
    引言C和C++是两种广泛使用的编程语言,它们有着深厚的渊源和各自独特的特点。C语言是C++的前身,而C++则是在C语言的基础上进行了扩展和改进。本文将从多个角度对这两种语言进行比较,帮助读者更好地理解它们之间的异同。全文将涵盖历史背景、语法与特性、应用场景、性能......
  • 深入理解 C++ 智能指针:现代 C++ 中的资源管理利器
        随着C++的发展,资源管理变得越来越重要。在传统的C++编程中,开发者需要手动管理内存,这容易引发内存泄漏、悬空指针等问题。智能指针是现代C++(C++11及以后)提供的解决方案,通过RAII(资源获取即初始化)理念,实现资源的安全管理。    本文将从以下几个方面深入......
  • C++ 中的多线程编程:从基础到实战
        随着多核处理器的普及,多线程编程成为现代C++开发中的关键技能。C++11引入了强大的线程库,使得多线程编程更安全、更高效。本文将带你深入了解C++中的多线程编程,从基础概念到实际案例,逐步掌握如何用现代C++编写高效的多线程程序。一、多线程的基础概念  ......