天天看点

#夏日挑战赛# 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++混合开发模式

继续阅读