HOME
Shop
  • English
  • 简体中文
HOME
Shop
  • English
  • 简体中文
  • Product Series

    • FPGA+ARM

      • GM-3568JHF

        • 1. Introduction

          • About GM-3568JHF
        • 2. Quick Start

          • 00 Introduction
          • 01 Environment Setup
          • 02 Compilation Instructions
          • 03 Flashing Guide
          • 04 Debug Tools
          • 05 Software Update
          • 06 View Information
          • 07 Test Commands
          • 08 App Compilation
          • 09 Source Code Acquisition
        • 3. Peripherals and Interfaces

          • 01 USB
          • 02 Display and Touch
          • 03 Ethernet
          • 04 WIFI
          • 05 Bluetooth
          • 06 TF-Card
          • 07 Audio
          • 08 Serial Port
          • 09 CAN
          • 10 RTC
        • 4. Application Development

          • 01 UART read and write case
          • 02 Key detection case
          • 03 LED light flashing case
          • 04 MIPI screen detection case
          • 05 Read USB device information example
          • 06 FAN Detection Case
          • 07 FPGA FSPI Communication Case
          • 08 FPGA DMA read and write case
          • 09 GPS debugging case
          • 10 Ethernet Test Cases
          • 11 RS485 reading and writing examples
          • 12 FPGA IIC read and write examples
          • 13 PN532 NFC card reader case
          • 14 TF card reading and writing case
        • 5. QT Development

          • 01 ARM64 cross compiler environment construction
          • 02 QT program added automatic startup service
        • 6. RKNN_NPU Development

          • 01 RK3568 NPU Overview
          • 02 Development Environment Setup
          • Run Official YOLOv5 Example
          • Model Conversion Detailed Explanation
          • Run Custom Model on Board
        • 7. FPGA Development

          • ARM and FPGA Communication
          • /fpga-arm/GM-3568JHF/FPGA/ch02-FPGA-Development-Manual.html
        • 8. Others

          • 01 Modification of the root directory file system
          • 02 System auto-start service
        • 9. Download

          • Download Resources
    • ShimetaPi

      • M4-R1

        • 1. Introduction

          • 1.1 About M4-R1
        • 2. Quick Start

          • 2.1 OpenHarmony Overview
          • 2.2 Image Burning
          • 2.3 Development Environment Preparation
          • 2.4 Hello World Application
        • 3. Application Development

          • 3.1 Getting Started

            • 3.1.1 ArkTS Language Overview
            • 3.1.2 UI Components (Part 1)
            • 3.1.3 UI Components (Part 2)
            • 3.1.4 UI Components (Part 3)
          • 3.2 Advanced

            • 3.2.1 Getting Started Guide
            • 3.2.2 Usage of Third Party Libraries
            • 3.2.3 Deployment of the Application
            • 3.2.4 Factory Reset
            • 3.2.5 System Debug
            • 3.2.6 APP Stability Testing
            • 3.2.7 Application Testing
          • 3.3 Getting Docs

            • 3.3.1 Official Website Information
          • 3.4 Development Instructions

            • 3.4.1 Full SDK
            • 3.4.2 Introduction of Third Party Libraries
            • 3.4.3 Introduction of HDC Tool
            • 3.4.4 Restore Factory Mode
            • 3.4.5 Update System API
          • 3.5 First Application

            • 3.5.1 First ArkTS App
          • 3.6 Application Demo

            • 3.6.1 UART Tool
            • 3.6.2 Graphics Tablet
            • 3.6.3 Digital Clock
            • 3.6.4 WIFI Tool
        • 4. Device Development

          • 4.1 Ubuntu Environment Development

            • 4.1.1 Environment Setup
            • 4.1.2 Download Source Code
            • 4.1.3 Compile Source Code
          • 4.2 Using DevEco Device Tool

            • 4.2.1 Tool Introduction
            • 4.2.2 Environment Construction
            • 4.2.3 Import SDK
            • 4.2.4 Function Introduction
        • 5. Peripherals and Interfaces

          • 5.1 Raspberry Pi Interfaces
          • 5.2 GPIO Interface
          • 5.3 I2C Interface
          • 5.4 SPI Communication
          • 5.5 PWM Control
          • 5.6 Serial Port Communication
          • 5.7 TF Card Slot
          • 5.8 Display Screen
          • 5.9 Touch Screen
          • 5.10 Audio
          • 5.11 RTC
          • 5.12 Ethernet
          • 5.13 M.2
          • 5.14 MINI PCIE
          • 5.15 Camera
          • 5.16 WIFI BT
          • 5.17 HAT
        • 6. FAQ

          • 6.1 Download Link
      • M5-R1

        • 1. Introduction

          • M5-R1 Development Documentation
        • 2. Quick Start

          • OpenHarmony Overview
          • Image Burning
          • Development Environment Preparation
          • Hello World Application and Deployment
        • 3. Peripherals and Interfaces

          • 3.1 Raspberry Pi Interfaces
          • 3.2 GPIO Interface
          • 3.3 I2C Interface
          • 3.4 SPI Communication
          • 3.5 PWM Control
          • 3.6 Serial Port Communication
          • 3.7 TF Card Slot
          • 3.8 Display Screen
          • 3.9 Touch Screen
          • 3.10 Audio
          • 3.11 RTC
          • 3.12 Ethernet
          • 3.13 M.2
          • 3.14 MINI PCIE
          • 3.15 Camera
          • 3.16 WIFI BT
          • 3.17 HAT
        • 4. Application Development

          • 4.1 Getting Started

            • 4.1.1 ArkTS Language Overview
            • 4.1.2 UI Components (Part 1)
            • 4.1.3 UI Components (Part 2)
            • 4.1.4 UI Components (Part 3)
          • 4.2 Advanced

            • 4.2.1 Getting Started Guide
            • 4.2.2 Usage of Third Party Libraries
            • 4.2.3 Deployment of the Application
            • 4.2.4 Factory Reset
            • 4.2.5 System Debug
            • 4.2.6 APP Stability Testing
            • 4.2.7 Application Testing
        • 5. Device Development

          • 5.1 Environment Setup
          • 5.2 Download Source Code
          • 5.3 Compile Source Code
        • 6. Download

          • Data Download
    • OpenHarmony

      • SC-3568HA

        • 1. Introduction

          • 1.1 About SC-3568HA
        • 2. Quick Start

          • 2.1 OpenHarmony Overview
          • 2.2 Image Burning
          • 2.3 Development Environment Preparation
          • 2.4 Hello World Application
        • 3. Application Development

          • 3.1 ArkUI

            • 3.1.1 ArkTS Language Overview
            • 3.1.2 UI Components (Part 1)
            • 3.1.3 UI Components (Part 2)
            • 3.1.4 UI Components (Part 3)
          • 3.2 Advanced

            • 3.2.1 Getting Started Guide
            • 3.2.2 Usage of Third Party Libraries
            • 3.2.3 Deployment of the Application
            • 3.2.4 Factory Reset
            • 3.2.5 System Debug
            • 3.2.6 APP Stability Testing
            • 3.2.7 Application Testing
        • 4. Device Development

          • 4.1 Environment Setup
          • 4.2 Download Source Code
          • 4.3 Compile Source Code
        • 5. Peripherals and Interfaces

          • 5.1 Raspberry Pi Interfaces
          • 5.2 GPIO Interface
          • 5.3 I2C Interface
          • 5.4 SPI Communication
          • 5.5 PWM Control
          • 5.6 Serial Port Communication
          • 5.7 TF Card Slot
          • 5.8 Display Screen
          • 5.9 Touch Screen
          • 5.10 Audio
          • 5.11 RTC
          • 5.12 Ethernet
          • 5.13 M.2
          • 5.14 MINI PCIE
          • 5.15 Camera
          • 5.16 WIFI BT
          • 5.17 HAT
        • 6. FAQ

          • 6.1 Download Link
      • M-K1HSE

        • 1. Introduction

          • 1.1 Product Introduction
        • 2. Quick Start

          • 2.1 Debug Tool Installation
          • 2.2 Development Environment Setup
          • 2.3 Source Code Download
          • 2.4 Build Instructions
          • 2.5 Flashing Guide
          • 2.6 APT Update Sources
          • 2.7 View Board Info
          • 2.8 CLI LED and Key Test
          • 2.9 GCC Build Programs
        • 3. Application Development

          • 3.1 Basic Application Development

            • 3.1.1 Development Environment Preparation
            • 3.1.2 First Application HelloWorld
            • 3.1.3 Develop HAR Package
          • 3.2 Peripheral Application Cases

            • 3.2.1 UART Read/Write
            • 3.2.2 Key Demo
            • 3.2.3 LED Flash
        • 4. Peripherals and Interfaces

          • 4.1 Standard Peripherals

            • 4.1.1 USB
            • 4.1.2 Display and Touch
            • 4.1.3 Ethernet
            • 4.1.4 WIFI
            • 4.1.5 Bluetooth
            • 4.1.6 TF Card
            • 4.1.7 Audio
            • 4.1.8 Serial Port
            • 4.1.9 CAN
            • 4.1.10 RTC
          • 4.2 Interfaces

            • 4.2.1 Audio
            • 4.2.2 RS485
            • 4.2.3 Display
            • 4.2.4 Touch
        • 5. System Customization Development

          • 5.1 System Porting
          • 5.2 System Customization
          • 5.3 Driver Development
          • 5.4 System Debugging
          • 5.5 OTA Upgrade
        • 6. Download

          • 6.1 Download
    • EVS-Camera

      • CF-NRS1

        • 1. Introduction

          • 1.1 About CF-NRS1
          • 1.2 Event-Based Concepts
          • 1.3 Quick Start
          • 1.4 Resources
        • 2. Development

          • 2.1 Development Overview

            • 2.1.1 Shimetapi Hybrid Camera SDK Introduction
          • 2.2 Environment & API

            • 2.2.1 Environment Overview
            • 2.2.2 Development API Overview
          • 2.3 Linux Development

            • 2.3.1 Linux SDK Introduction
            • 2.3.2 Linux SDK API
            • 2.3.3 Linux Algorithm
            • 2.3.4 Linux Algorithm API
          • 2.4 Service & Web

            • 2.4.1 EVS Server
            • 2.4.2 Time Server
            • 2.4.3 EVS Web
        • 3. Download

          • 3.1 Download
        • 4. Common Problems

          • 4.1 Common Problems
      • CF-CRA2

        • 1. Introduction

          • 1.1 About CF-CRA2
        • 2. Download

          • 2.1 Download
      • EVS Module

        • 1. Related Concepts
        • 2. Hardware Preparation and Environment Configuration
        • 3. Example Program User Guide
        • Resources Download
    • AI-model

      • 1684XB-32T

        • 1. Introduction

          • AIBOX-1684XB-32 Introduction
        • 2. Quick Start

          • First time use
          • Network Configuration
          • Disk usage
          • Memory allocation
          • Fan Strategy
          • Firmware Upgrade
          • Cross-Compilation
          • Model Quantization
        • 3. Application Development

          • 3.1 Development Introduction

            • Sophgo SDK Development
            • SOPHON-DEMO Introduction
          • 3.2 Large Language Models

            • Deploying Llama3 Example
            • /ai-model/AIBOX-1684XB-32/application-development/LLM/Sophon_LLM_api_server-Development-AIBOX-1684XB-32.html
            • /ai-model/AIBOX-1684XB-32/application-development/LLM/MiniCPM-V-2_6-AIBOX-1684XB-32.html
            • /ai-model/AIBOX-1684XB-32/application-development/LLM/Qwen-2-5-VL-demo-Development-AIBOX-1684XB-32.html
            • /ai-model/AIBOX-1684XB-32/application-development/LLM/Qwen-3-chat-demo-Development-AIBOX-1684XB-32.html
            • /ai-model/AIBOX-1684XB-32/application-development/LLM/Qwen3-Qwen Agent-MCP.html
            • /ai-model/AIBOX-1684XB-32/application-development/LLM/Qwen3-langchain-AI Agent.html
          • 3.3 Deep Learning

            • ResNet (Image Classification)
            • LPRNet (License Plate Recognition)
            • SAM (Universal Image Segmentation Foundation Model)
            • YOLOv5 (Object Detection)
            • OpenPose (Human Keypoint Detection)
            • PP-OCR (Optical Character Recognition)
        • 4. Download

          • Resource Download
      • 1684X-416T

        • 1. Introduction

          • AIBOX-1684X-416 Introduction
        • 2. Demo Simple Operation Guide

          • Simple instructions for using shimeta smart monitoring demo
      • RDK-X5

        • 1. Introduction

          • RDK-X5 Hardware Introduction
        • 2. Quick Start

          • RDK-X5 Quick Start
        • 3. Application Development

          • 3.1 AI Online Model Development

            • AI Online Development - Experiment01
            • AI Online Development - Experiment02
            • AI Online Development - Experiment03
            • AI Online Development - Experiment04
            • AI Online Development - Experiment05
            • AI Online Development - Experiment06
          • 3.2 Large Language Models (Voice)

            • Voice LLM Application - Experiment01
            • Voice LLM Application - Experiment02
            • Voice LLM Application - Experiment03
            • Voice LLM Application - Experiment04
            • Voice LLM Application - Experiment05
            • Voice LLM Application - Experiment06
          • 3.3 40pin-IO Development

            • 40pin IO Development - Experiment01
            • 40pin IO Development - Experiment02
            • 40pin IO Development - Experiment03
            • 40pin IO Development - Experiment04
            • 40pin IO Development - Experiment05
            • 40pin IO Development - Experiment06
            • 40pin IO Development - Experiment07
          • 3.4 USB Module Development

            • USB Module Usage - Experiment01
            • USB Module Usage - Experiment02
          • 3.5 Machine Vision

            • Machine Vision Technology Development - Experiment01
            • Machine Vision Technology Development - Experiment02
            • Machine Vision Technology Development - Experiment03
            • Machine Vision Technology Development - Experiment04
          • 3.6 ROS2 Base Development

            • ROS2 Basic Development - Experiment01
            • ROS2 Basic Development - Experiment02
            • ROS2 Basic Development - Experiment03
            • ROS2 Basic Development - Experiment04
      • RDK-S100

        • 1. Introduction

          • 1.1 About RDK-S100
        • 2. Quick Start

          • 2.1 First Use
        • 3. Application Development

          • 3.1 AI Online Model Development

            • 3.1.1 Volcano Engine Doubao AI
            • 3.1.2 Image Analysis
            • 3.1.3 Multimodal Visual Analysis
            • 3.1.4 Multimodal Image Comparison
            • 3.1.5 Multimodal Document Analysis
            • 3.1.6 Camera AI Vision Analysis
          • 3.2 Large Language Models

            • 3.2.1 Speech Recognition
            • 3.2.2 Voice Conversation
            • 3.2.3 Multimodal Image Analysis
            • 3.2.4 Multimodal Image Comparison
            • 3.2.5 Multimodal Document Analysis
            • 3.2.6 Multimodal Vision Application
          • 3.3 40pin-IO Development

            • 3.3.1 GPIO Output LED Blink
            • 3.3.2 GPIO Input
            • 3.3.3 Key Control LED
            • 3.3.4 PWM Output
            • 3.3.5 Serial Output
            • 3.3.6 I2C Experiment
          • 3.4 USB Module Development

            • 3.4.1 USB Voice Module
            • 3.4.2 Sound Source Localization
          • 3.5 Machine Vision

            • 3.5.1 USB Camera
            • 3.5.2 Image Processing Basics
            • 3.5.3 Object Detection
            • 3.5.4 Image Segmentation
          • 3.6 ROS2 Base Development

            • 3.6.1 Environment Setup
            • 3.6.2 Create and Build Workspace
            • 3.6.3 ROS2 Topic Communication
            • 3.6.4 ROS2 Camera Application
    • Core-Board

      • C-3568BQ

        • 1. Introduction

          • C-3568BQ Introduction
      • C-3588LQ

        • 1. Introduction

          • C-3588LQ Introduction
      • GC-3568JBAF

        • 1. Introduction

          • GC-3568JBAF Introduction
      • C-K1BA

        • 1. Introduction

          • C-K1BA Introduction

03 NAPI Getting Started

Part 1: NAPI Basic Concept Introduction

NAPI in OpenHarmony (extended from Node.js N-API framework) is part of the ArkUI subsystem under the UI framework. It is used for interaction between code written in JS/ETS language and native code (C/C++). NAPI is suitable for encapsulating IO, CPU-intensive, OS low-level capabilities and exposing JS interfaces. Through NAPI, JS (JavaScript) can access C/C++ code and vice versa.

1 JavaScript, TypeScript and ArkTS

TypeScript is a superset of JavaScript types, supporting ES6 syntax and object-oriented programming concepts such as classes, interfaces, inheritance, and generics. It is a statically typed language that provides type annotations, which can check data type errors at the code compilation stage, while extending JavaScript's syntax. Therefore, any existing JavaScript program can work under TypeScript without modification. To ensure compatibility, TypeScript needs to be compiled into pure JavaScript by a compiler at the compilation stage. TypeScript file extension is .ts (.ts, .tsx, .d.ts), JavaScript file is .js.

ArkTS extends some functionality on the basis of TypeScript, adding some syntax sugar and "annotation"-like features.

2 .ts and .d.ts Files

.ts files contain actual code logic, used to write implementation of TypeScript programs. The files contain definitions and implementations of variables, functions, classes, and other TypeScript code. At compile time, .ts files will be converted to JavaScript files, which can then be executed in browsers or other JavaScript runtime environments; .d.ts files are type declaration files that only contain type code, no specific code implementation. Its file name is generally in the form of [module name].d.ts, where d stands for declaration. It is used to describe type information of JavaScript code in TypeScript. Simply put, .ts files are where we write actual business logic, while .d.ts files are for providing type declarations.

3 Basic Data Types

In the NAPI framework, all parameters, whether the eight data types defined in ECMAScript standard (Boolean, Null, Undefined, Number, BigInt, String, Symbol, Object) or Function type, are uniformly encapsulated into napi_value type. Therefore, Function type parameters can be obtained like parameters of data types.

Basic data types:

  • napi_env corresponds to NativeEngine. In oh, it refers to the relevant context environment of ArkComplier JSNAPI. Any napi data type and js data type conversion require it.
  • napi_value corresponds to NativeValue. In oh, it refers to all js data types recognizable by ArkComplier. It has subclasses such as ArkNativeNumber, ArkNativeString, ArkNativeFunction, corresponding to number, string, function and other data types in js.
  • napi_callback_info corresponds to NativeCallbackInfo. It is a data type used to store js passed parameter information when registering callback handles. It is a struct.
  • napi_property_descriptor is a data type used to store a single property.
  • napi_callback corresponds to NativeCallback, which is the callback handle mentioned earlier. Native code registers it as a callback function for corresponding js interface.

4 NAPI Object Lifecycle

The lifecycle of NAPI objects represents the entire process from object creation to release, as shown in the figure below:

When the ArkTS application starts, the NAPI module is loaded. During the NAPI module loading process, an object A is created for the application to use. Before the application exits or actively releases object A, object A must remain "active". The entire process from object A's creation to release also represents object A's lifecycle.

NAPI Object Lifecycle

When calling Node-API, the underlying virtual machine may return handles to objects on the heap in the form of napi_values. These handles must keep the object "active" until the native code no longer needs them.

5 Synchronous and Asynchronous Interfaces

Synchronous interfaces execute on the main thread and may cause interface freezing; asynchronous interfaces execute on worker threads, avoiding main thread blocking.

ConceptSynchronous InterfaceAsynchronous Interface
Execution ThreadMain ThreadWorker Thread
BlockingWill Block Main ThreadWon't Block Main Thread
Use CaseSimple TasksComplex Tasks, CPU-Intensive Tasks
Implementation ComplexitySimpleComplex

Asynchronous interfaces use napi_create_async_work function to create asynchronous work items, and use napi_queue_async_work function to add them to the scheduling queue. Process asynchronous results in the Complete function, call callback function or update Promise state.

Part 2: Common NAPI Functions

After learning the basic theory of NAPI, this section will introduce several functions frequently used by developers.

1 napi_get_cb_info

Function Description:

napi_get_cb_info is a core function in Node.js N-API, mainly used in native plugins (usually written in C/C++) to obtain parameter information passed when calling JavaScript functions, this object, and other context data. Simply put, it is the core for native code to interact with JavaScript.

Function Prototype:

napi_status napi_get_cb_info(napi_env env,
                             napi_callback_info cbinfo,
                             size_t* argc,
                             napi_value* argv,
                             napi_value* this_arg,
                             void** data)

Parameter Description:

ParameterType (C/C++)Direction (for function)Description
envnapi_envInputN-API environment handle, provides context for function execution.
cbinfonapi_callback_infoInputCallback info handle, usually passed by Node.js when calling native functions.
argcsize_t *Input/OutputInput: number of parameters expected to obtain, Output: actual number of parameters received.
argvnapi_value *OutputArray to store parameters. If nullptr is passed, parameters won't be copied, only count obtained.
this_argnapi_value *OutputUsed to receive JavaScript this object.
datavoid **OutputUsed to receive additional data pointer possibly bound when creating function.

Usage Example:

#include <node_api.h>

// Prepare variables to get parameters and info
size_t argc = 2; // We expect to get 2 parameters
napi_value argv[2]; // Prepare an array to store these two parameters
napi_value this_arg;
void* data;

// Call napi_get_cb_info to get info
status = napi_get_cb_info(env, info, &argc, argv, &this_arg, &data);
if (status != napi_ok) {
  // Handle error...
}

2 napi_get_value_string_utf8

Function Description: Extracts a UTF-8 encoded C string from a JavaScript string value. It converts JavaScript string to a character array in UTF-8 format for C/C++ code processing.

Function Prototype:

napi_status napi_get_value_string_utf8(napi_env env,
                                       napi_value value,
                                       char* buf,
                                       size_t bufsize,
                                       size_t* result);

Parameter Description:

ParameterTypeDirectionDescription
envnapi_envInputN-API environment handle, provides function execution context
valuenapi_valueInputJavaScript string value to convert
bufchar*OutputPointer to buffer for storing result (can be NULL)
bufsizesize_tInputBuffer size (in bytes)
resultsize_t*OutputOptional parameter, receives actual string length (excluding null terminator)

Usage Example:

napi_value js_string;
// ... Get JavaScript string to js_string ...

// First get required buffer size
size_t length;
napi_get_value_string_utf8(env, js_string, NULL, 0, &length);

// Allocate buffer (+1 for null terminator)
char* buffer = (char*)malloc(length + 1);

// Actually get string content
napi_get_value_string_utf8(env, js_string, buffer, length + 1, NULL);

// Use buffer...
free(buffer);

3 napi_create_function

Function Description: Creates a new JavaScript function object that, when called, executes the specified C/C++ callback function.

Function Prototype:

napi_status napi_create_function(napi_env env,
                                 const char* utf8name,
                                 size_t length,
                                 napi_callback cb,
                                 void* data,
                                 napi_value* result);

Parameter Description:

ParameterTypeDirectionDescription
envnapi_envInputN-API environment handle
utf8nameconst char*InputFunction name (UTF-8 encoded)
lengthsize_tInputFunction name length (use NAPI_AUTO_LENGTH for auto calculation)
cbnapi_callbackInputNative callback function to execute when JavaScript function is called
datavoid*InputUser data to pass to callback function
resultnapi_value*OutputNewly created JavaScript function object

Usage Example:

napi_value my_function;
napi_create_function(env, "myFunction", NAPI_AUTO_LENGTH, MyNativeFunction, NULL, &my_function);

4 napi_create_object

Function Description: Creates a new empty JavaScript object.

Function Prototype:

napi_status napi_create_object(napi_env env, napi_value* result);

Parameter Description:

ParameterTypeDirectionDescription
envnapi_envInputN-API environment handle
resultnapi_value*OutputNewly created JavaScript object

Usage Example:

napi_value obj;
napi_create_object(env, &obj);

5 napi_create_string_utf8

Function Description: Creates a JavaScript string from a UTF-8 encoded C string.

Function Prototype:

napi_status napi_create_string_utf8(napi_env env,
                                    const char* str,
                                    size_t length,
                                    napi_value* result);

Parameter Description:

ParameterTypeDirectionDescription
envnapi_envInputN-API environment handle
strconst char*InputUTF-8 encoded C string
lengthsize_tInputString length (use NAPI_AUTO_LENGTH for auto calculation)
resultnapi_value*OutputNewly created JavaScript string

Usage Example:

napi_value js_string;
napi_create_string_utf8(env, "Hello World", NAPI_AUTO_LENGTH, &js_string);

6 napi_set_named_property

Function Description: Sets a named property on a JavaScript object.

Function Prototype:

napi_status napi_set_named_property(napi_env env,
                                    napi_value object,
                                    const char* utf8name,
                                    napi_value value);

Parameter Description:

ParameterTypeDirectionDescription
envnapi_envInputN-API environment handle
objectnapi_valueInputJavaScript object to set property on
utf8nameconst char*InputProperty name (UTF-8 encoded)
valuenapi_valueInputProperty value to set

Usage Example:

napi_value obj, value;
napi_create_object(env, &obj);
napi_create_string_utf8(env, "test", NAPI_AUTO_LENGTH, &value);
napi_set_named_property(env, obj, "propertyName", value);

7 napi_get_value_double

Function Description: Extracts C double precision floating-point value from JavaScript number value.

Function Prototype:

napi_status napi_get_value_double(napi_env env, napi_value value, double* result);

Parameter Description:

ParameterTypeDirectionDescription
envnapi_envInputN-API environment handle
valuenapi_valueInputJavaScript number value
resultdouble*OutputExtracted double precision floating point value

Usage Example:

double number;
napi_get_value_double(env, js_number_value, &number);

8 napi_typeof

Function Description: Determines the type of JavaScript value.

Function Prototype:

napi_status napi_typeof(napi_env env, napi_value value, napi_valuetype* result);

Parameter Description:

ParameterTypeDirectionDescription
envnapi_envInputN-API environment handle
valuenapi_valueInputJavaScript value to check
resultnapi_valuetype*OutputType of value (such as napi_number, napi_string, etc.)

Usage Example:

napi_valuetype type;
napi_typeof(env, js_value, &type);
if (type == napi_number) {
    // Handle number type
}

9 napi_open_handle_scope / napi_close_handle_scope

Function Description: Manages napi_value handle lifecycle to prevent memory leaks.

Function Prototype:

napi_status napi_open_handle_scope(napi_env env, napi_handle_scope* result);
napi_status napi_close_handle_scope(napi_env env, napi_handle_scope scope);

Parameter Description:

ParameterTypeDirectionDescription
envnapi_envInputN-API environment handle
resultnapi_handle_scope*OutputNewly created scope handle
scopenapi_handle_scopeInputScope handle to close

Usage Example:

napi_handle_scope scope;
napi_open_handle_scope(env, &scope);
// Create napi_value within this scope
napi_close_handle_scope(env, scope);

10 napi_throw_error

Function Description: Throws a JavaScript error.

Function Prototype:

napi_status napi_throw_error(napi_env env, const char* code, const char* msg);

Parameter Description:

ParameterTypeDirectionDescription
envnapi_envInputN-API environment handle
codeconst char*InputError code (can be NULL)
msgconst char*InputError message

Usage Example:

napi_throw_error(env, NULL, "Something went wrong");

11 napi_create_int32

Function Description: Creates JavaScript number from C int32_t value.

Function Prototype:

napi_status napi_create_int32(napi_env env, int32_t value, napi_value* result);

Parameter Description:

ParameterTypeDirectionDescription
envnapi_envInputN-API environment handle
valueint32_tInputC integer value
resultnapi_value*OutputNewly created JavaScript number

Usage Example:

napi_value js_number;
napi_create_int32(env, 42, &js_number);

12 napi_call_function

Function Description: Calls JavaScript function.

Function Prototype:

napi_status napi_call_function(napi_env env,
                               napi_value recv,
                               napi_value func,
                               size_t argc,
                               const napi_value* argv,
                               napi_value* result);

Parameter Description:

ParameterTypeDirectionDescription
envnapi_envInputN-API environment handle
recvnapi_valueInputthis object when function is called
funcnapi_valueInputJavaScript function to call
argcsize_tInputNumber of parameters
argvconst napi_value*InputParameter array
resultnapi_value*OutputReturn value of function call (can be NULL)

Usage Example:

napi_value global, func, args[1], result;
napi_get_global(env, &global);
// Assume func is a JavaScript function
napi_call_function(env, global, func, 1, args, &result);

Part 3: NAPI Development Steps

1. Include Header File and Implement C/C++ Function Body

First, include #include "napi/native_api.h" in the C/C++ file, then implement the C/C++ function body according to normal logic.

#include "napi/native_api.h"

2. Define Mapping Between NAPI Interface Functions to Open and Native Functions

Open Native functions or attributes in C/C++ for JavaScript use. This mapping is usually completed in the framework's built-in function static napi_value Init(napi_env env, napi_value exports).

EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports) {
    napi_property_descriptor desc[] = {
        {"Init", nullptr, ObjectDectionInit, nullptr, nullptr, nullptr, napi_default, nullptr},
        {"Process", nullptr, ObjectDectionProcess, nullptr, nullptr, nullptr, napi_default, nullptr},
        {"DeInit", nullptr, ObjectDectionDeInit, nullptr, nullptr, nullptr, napi_default, nullptr}};
    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
    return exports;
}
EXTERN_C_END

Or use macro definitions:

EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports) {
    napi_property_descriptor desc[] = {
        DECLARE_NAPI_FUNCTION("Init", ObjectDectionInit),
        DECLARE_NAPI_FUNCTION("Process", ObjectDectionProcess),
        DECLARE_NAPI_FUNCTION("DeInit", ObjectDectionDeInit)
         };
    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
    return exports;
}
EXTERN_C_END

This completes the mapping relationship.

3. Establish Mapping Between Interface and Module

3.1 Define a napi_module Object

Define a napi_module object, bind the corresponding so to the nm_modname attribute, and bind the module registration entry function.

/*
 * Napi Module define
 */

static napi_module msLiteModule = {
    .nm_version = 1,
    .nm_flags = 0,
    .nm_filename = nullptr,
    .nm_register_func = Init,
    .nm_modname = "mslite_napi",
    .nm_priv = ((void *)0),
    .reserved = {0},
};

After binding, it can be used on ETS side via import mslite_napi from 'libmslite_napi.so'

import mslite_napi from 'libmslite_napi.so'

let resourceManager = context.resourceManager
mslite_napi.Init(resourceManager)
mslite_napi
  .Process(this.modelId, picDesc, buffer)
  .then((value: InferResult) => {
    callback(value.objects)
  })
  .catch((err: BusinessError) => {})
mslite_napi.DeInit()

3.2 Bind napi_module Object to System Function RegisterModule

Then pass the napi_module object to the system function RegisterModule:

/*
 * module register
 */
extern "C" __attribute__((constructor)) void RegisterModule(void) {
  MS_LOG(INFO) << "RegisterModule() is called";
  napi_module_register(&g_module);
}

3.3 Execute Entry Function nm_register_func of napi_module

Generally in OH system, the NAPI registration entry function is automatically executed by the Framework. Therefore, if we develop NAPI ourselves, we need to call and trigger it ourselves.

4. Define ETS Interface Description File .d.ts

export const Init: (path: Object) => number
export const Process: (
  modeid: number,
  picDesc: Object,
  buffer: ArrayBuffer,
) => number
export const DeInit: () => number

5. Implement Receiving and Processing ETS Parameters and Feedback Results on Native Side

Because on ETS side, you can consider data types as weakly typed. The specific type needs to be resolved by the Native side itself.

On Native side, the function parameter list passed from ETS side and return values are all fixed types.

5.1 Develop Synchronous Interface

C developers just need to do data conversion work.

The parameter objects and function objects passed by JavaScript call are provided to C as an abstract type napi_value. Developers need to convert them to C data types for calculation, then convert the calculation results back to napi_value type to return. The NAPI framework provides various API interfaces for users to complete these conversions. These conversions are implemented by relying on the JS engine behind the scenes.

static napi_value GetVisitCountSync(napi_env env, napi_callback_info info) {
  /* Get parameters according to environment variables */
  size_t argc = 2; //Number of parameters
  napi_value argv[2] = { 0 }; //Parameter definition

  /* Get input parameter variables */
  napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
  // Get type of input parameter
  napi_valuetype valueType = napi_undefined;
  napi_typeof(env, argv[0], &valueType);

  // Convert input value to data type that C/C++ can operate
  char value[VALUE_BUFFER_SIZE] = { 0 };
  size_t valueLen = 0;
  napi_get_value_string_utf8(env, argv[0], value, VALUE_BUFFER_SIZE, &valueLen);

  // ...... Omit some business process calculation steps

  /* Convert C/C++ data type to JS data type and return */
  napi_value result = nullptr; // JS string object
  std::string resultStr = "Visit Count = 65535";
  napi_create_string_utf8(env, resultStr.c_str(), resultStr.length(), &result);

  return result; //Return JS object
}
5.1.1 Function Declaration

Every mapped function must have parameters napi_env env, napi_callback_info cbinfo, and return value napi_value. To achieve js or ets call, the NAPI framework needs to solve the following problems: data passing and conversion. The input parameters obtained from js/ets and the returned results need to be converted to data types that C/C++ code can operate on. Therefore, the NAPI framework introduces an intermediate data type to correspond to the types of upper-layer js/ets and C/C++, as well as methods for operating on data types.

5.1.2 Get Input Parameters

The function napi_get_cb_info obtains JavaScript input parameters from the cbinfo parameter.

5.1.3 Convert NAPI Type to C/C++ Recognizable Type
napi_value NapiDemo(napi_env env, napi_callback_info cbinfo)
{
        ...
    char* type = nullptr;
    size_t typeLen = 0;
    napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typeLen);
    NAPI_ASSERT(env, typeLen > 0, "typeLen == 0");
    type = new char[typeLen + 1];
    napi_get_value_string_utf8(env, argv[0], type, typeLen + , &typeLen);
        ...
}
5.1.4 Return Value

When C++ has no return value, NapiDemo returns nullptr. NAPI framework doesn't have nullptr. It converts nullptr to napi_undefined via napi_get_undefined.

napi_value NapiDemo(napi_env env, napi_callback_info cbinfo)
{
...
    napi_value result = nullptr;
    napi_get_undefined(env, &result);
    return result;
}
Edit this page on GitHub
Last Updated:
Contributors: ZSL