天天看點

#夏日挑戰賽# openharmony NAPI之eTS 與C++混合開發模式

本文正在參加星光計劃3.0–夏日挑戰賽

目前的DevEco Studio版本支援C++混合開發模式,本文使用DevEco Studio對NAPI的開發流程進行講解。

1.建立工程

#夏日挑戰賽# openharmony NAPI之eTS 與C++混合開發模式
#夏日挑戰賽# openharmony NAPI之eTS 與C++混合開發模式

2.項目

我們可以看到,建立工程後,NAPI示例的架構,已經生成

#夏日挑戰賽# openharmony NAPI之eTS 與C++混合開發模式

3.應用簽名

#夏日挑戰賽# openharmony NAPI之eTS 與C++混合開發模式

4.安裝運作

可以看到,應用可以正常的運作

#夏日挑戰賽# openharmony NAPI之eTS 與C++混合開發模式

5.建立一個NAPI用例

①.建立一個test.cpp 檔案

代碼:

#include "napi/native_api.h"

static napi_value Add(napi_env env, napi_callback_info info) //加法
{
    size_t requireArgc = 2;
    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;


}

static napi_value Sub(napi_env env, napi_callback_info info)//減法
{
    size_t requireArgc = 2;
    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;


}

static napi_value Mul(napi_env env, napi_callback_info info)//乘法
{
    size_t requireArgc = 2;
    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;


}

static napi_value Div(napi_env env, napi_callback_info info)//除法
{
    size_t requireArgc = 2;
    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 },
        { "sub", nullptr, Sub, nullptr, nullptr, nullptr, napi_default, nullptr },
        { "mul", nullptr, Mul, nullptr, nullptr, nullptr, napi_default, nullptr },
        { "div", nullptr, Div, 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 = "libtest",
.nm_priv = ((void*)0),
.reserved = { 0 },
};

extern "C" __attribute__((constructor)) void RegisterModule(void)
{
napi_module_register(&demoModule);
}
           

②.建立一個命名為libtest的檔案夾

在檔案夾裡面建立index.d.ts檔案

代碼:

export const add: (a: number, b: number) => number;
export const sub: (a: number, b: number) => number;
export const mul: (a: number, b: number) => number;
export const div: (a: number, b: number) => number;
           

在檔案夾裡面建立package.json檔案

代碼:

{  
	"name": "libtest.so",  
	"types": "./index.d.ts"
}
           

③.編輯CMakeLists.txt檔案

加入這兩行代碼:

add_library(test SHARED test.cpp)
target_link_libraries(test PUBLIC libace_napi.z.so libc++.a)
           

6.編寫eTS測試用例

①.導入頭檔案

import testNapi from "libtest.so"
           

②.編寫NAPI測試代碼

@Entry
@Component
struct Index {
  @State message: string = 'NAPItest'

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            this.message="Test NAPI 2 + 3 = " + testNapi.add(2, 3)+
            "\n Test NAPI 2 - 3 = " + testNapi.sub(2, 3)+
            "\n Test NAPI 2 * 3 = " + testNapi.mul(2, 3)+
            "\n Test NAPI 2 / 3 = " + testNapi.div(2, 3)

            console.log("Test NAPI 2 + 3 = " + testNapi.add(2, 3)+
            "\n Test NAPI 2 - 3 = " + testNapi.sub(2, 3)+
            "\n Test NAPI 2 * 3 = " + testNapi.mul(2, 3)+
            "\n Test NAPI 2 / 3 = " + testNapi.div(2, 3));
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}
           

7.安裝測試

#夏日挑戰賽# openharmony NAPI之eTS 與C++混合開發模式
#夏日挑戰賽# openharmony NAPI之eTS 與C++混合開發模式

繼續閱讀