ArkTS怎么和C/C++交互?HarmonyOS 鸿蒙Next

ArkTS怎么和C/C++交互?HarmonyOS 鸿蒙Next NDK(Native Development Kit)是HarmonyOS SDK提供的Native API、相应编译脚本和编译工具链的集合,方便开发者使用C或C++语言实现应用的关键功能。NDK只覆盖了HarmonyOS一些基础的底层能力,如C运行时基础库libc、图形库、窗口系统、多媒体、压缩库、面向ArkTS/JS与C跨语言的Node-API等,并没有提供ArkTS/JS API的完整能力。

运行态,开发者可以使用NDK中的Node-API接口,访问、创建、操作JS对象;也允许JS对象使用Native动态库。

前置知识

  • Linux C语言编程知识

    • 内核、libc基础库基于POSIX等标准扩展而来,掌握基本的Linux C编程知识能够更好的帮助理解HarmonyOS NDK开发。
  • CMake使用知识

    • CMake是HarmonyOS默认支持的构建系统。请先通过CMake官方文档了解基础用法。
  • Node Addons开发知识

    • ArkTS采用Node-API作为跨语言调用接口,熟悉基本的Node Addons开发模式,可以更好理解NDK中Node-API的使用。
  • Clang/LLVM编译器使用知识

    • 具备一定的Clang/LLVM编译器基础知识,能够帮助开发者编译出更优的Native动态库。

NDK开发导读-NDK开发 - 华为HarmonyOS开发者


更多关于ArkTS怎么和C/C++交互?HarmonyOS 鸿蒙Next的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

更多关于ArkTS怎么和C/C++交互?HarmonyOS 鸿蒙Next的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在DevEco里创建一个【Native C++】的工程,就容易看出来了

  • src/main/cpp/napi_init.cpp // cpp文件,定义了一下函数
  • src/main/cpp/types/libentry/Index.d.ts // 对外公开的cpp函数
  • src/main/ets/pages/Index.ets // ArkTS 使用cpp

根据 src/main/cpp/napi_init.cpp 编译生成的吧?

在HarmonyOS中,ArkTS与C/C++的交互主要通过Native API(NAPI)实现。NAPI是鸿蒙系统提供的一套机制,允许ArkTS代码调用C/C++编写的本地代码。具体步骤如下:

  1. 创建Native模块:首先,在C/C++中编写需要暴露给ArkTS的函数,并使用NAPI提供的接口将这些函数注册为Native模块。

  2. 编译Native代码:将C/C++代码编译为动态链接库(如.so文件),并确保其在鸿蒙系统中可用。

  3. 在ArkTS中加载Native模块:通过import语句加载编译好的Native模块,并调用其中的函数。

  4. 数据类型转换:NAPI提供了数据类型转换机制,ArkTS中的数据类型(如numberstring)可以转换为C/C++中的对应类型(如intchar*),反之亦然。

  5. 调用Native函数:在ArkTS中直接调用C/C++函数,NAPI会自动处理函数调用和数据转换。

示例代码:

// native_module.c
#include <napi.h>

Napi::Number Add(const Napi::CallbackInfo& info) {
    Napi::Env env = info.Env();
    double arg0 = info[0].As<Napi::Number>().DoubleValue();
    double arg1 = info[1].As<Napi::Number>().DoubleValue();
    return Napi::Number::New(env, arg0 + arg1);
}

Napi::Object Init(Napi::Env env, Napi::Object exports) {
    exports.Set("add", Napi::Function::New(env, Add));
    return exports;
}

NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)
// index.ets
import nativeModule from 'libnative.so';

let result = nativeModule.add(1, 2);
console.log(result); // 输出 3

通过NAPI,ArkTS能够高效地与C/C++代码交互,适用于性能敏感的场景。

回到顶部