#夏日挑战赛# OpenHarmony NAPI之eTS 与C+ 原创 精华

yukoyu
发布于 2022-7-20 12:19
浏览
3收藏

本文正在参加星光计划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);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.

②.新建一个命名为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;
  • 1.
  • 2.
  • 3.
  • 4.

在文件夹里面新建package.json文件

代码:

{  
	"name": "libtest.so",  
	"types": "./index.d.ts"
}
  • 1.
  • 2.
  • 3.
  • 4.

③.编辑CMakeLists.txt文件

加入这两行代码:

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

6.编写eTS测试用例

①.导入头文件

import testNapi from "libtest.so"
  • 1.

②.编写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%')
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.

7.安装测试

#夏日挑战赛#  OpenHarmony NAPI之eTS 与C+-鸿蒙开发者社区
#夏日挑战赛#  OpenHarmony NAPI之eTS 与C+-鸿蒙开发者社区

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2022-11-17 14:42:34修改
7
收藏 3
回复
举报
7
2
3
2条回复
按时间正序
/
按时间倒序
lxj29
lxj29

写的不错!

回复
2022-7-20 17:56:47
阿毛0920
阿毛0920

nice

回复
2022-7-20 18:01:44


回复
    相关推荐