您好,欢迎访问沃航(武汉)科技有限公司官方网站
nodejs通过n api开发C语言模块(二)
2019-06-26 01:12:48

上一讲讲了如何通过nodejs搭建编译环境,这一讲我们要说说如何返回特定的nodejs对象作为返回。

从这一讲开始,大家要经常看nodejs的官方文档---传送门。先给大家讲讲如何通过C语言组合成nodejs的对象。

首先从一个简单的对象开始:

{
    ID:1,
    name:'jevian',
    sex:'man'
}

这是一个很简单的属性对象,如果是nodejs,可以说一句话就实现了。但是用C会麻烦很多。

需要下面几个操作。

napi_value ID;
napi_create_int32(env, 1, &ID);
napi_value name;
napi_create_string_utf8(env, "jevian", NAPI_AUTO_LENGTH, &name);
napi_value sex;
napi_create_string_utf8(env, "man", NAPI_AUTO_LENGTH, &sex);
napi_value obj;
napi_create_object (env, &obj);
napi_set_named_property (env, obj, "ID", ID);
napi_set_named_property (env, obj, "name", name);
napi_set_named_property (env, obj, "sex", sex);

可以看见,javascript一句话可以完成的事情,使用C语言要11句话。最后生成的obj对象就是我们想要的。

这个案例很简单,其中的obj是单层的,不是混合模式的。

下面看另一个案例,双层的对象:

{
    ID:1,
    msg: {
        name: 'jevian',
        sex: 'man'
    }
}

实现这个的方式会稍微麻烦一点,方法如下:

napi_value ID;
napi_create_int32(env, 1, &ID);
napi_value name;
napi_create_string_utf8(env, "jevian", NAPI_AUTO_LENGTH, &name);
napi_value sex;
napi_create_string_utf8(env, "man", NAPI_AUTO_LENGTH, &sex);
napi_value msg;
napi_create_object (env, &msg);
napi_set_named_property (env, msg, "name", name);
napi_set_named_property (env, msg, "sex", sex);
napi_value obj;
napi_create_object (env, &obj);
napi_set_named_property (env, obj, "ID", ID);
napi_set_named_property (env, obj, "msg", msg);

大家看见没,需要先建立一个msg变量,然后将name与sex包入,最后将msg包入obj。所以说虽然C语言的性能好,但是开发体验并不好。

下面再介绍大家数组如何实现,数组如下:

['worldflying', 50, 'hello', 1 , {ID: 1, name: 'jevian'}]

这上面的数组元素是一个混合对象,最复杂的对象应该也不过如此吧,实现方式如下:

napi_value ID;
napi_create_int32(env, 1, &ID);
napi_value name;
napi_create_string_utf8(env, "jevian", NAPI_AUTO_LENGTH, &name);
napi_value obj;
napi_create_object (env, &obj);
napi_set_named_property (env, obj, "ID", ID);
napi_set_named_property (env, obj, "name", name);
napi_value arr1;
napi_create_string_utf8(env, "worldflying", NAPI_AUTO_LENGTH, &arr1);
napi_value arr2;
napi_create_int32(env, 50, &arr2);
napi_value arr3;
napi_create_string_utf8(env, "hello", NAPI_AUTO_LENGTH, &arr3);
napi_value arr4;
napi_create_int32(env, 1, &arr4);
napi_value arr;
napi_create_array(env, &arr);
napi_set_element(env, arr, 0, arr1);
napi_set_element(env, arr, 1, arr2);
napi_set_element(env, arr, 2, arr3);
napi_set_element(env, arr, 3, arr4);
napi_set_element(env, arr, 4, obj);

这里我借用下昨天的案例,完整的C语言代码如下:

#include <stdio.h>
#include <node_api.h>

napi_value ShowVersion(napi_env env, napi_callback_info info) {
    napi_value ID;
    napi_create_int32(env, 1, &ID);
    napi_value name;
    napi_create_string_utf8(env, "jevian", NAPI_AUTO_LENGTH, &name);
    napi_value obj;
    napi_create_object (env, &obj);
    napi_set_named_property (env, obj, "ID", ID);
    napi_set_named_property (env, obj, "name", name);
    napi_value arr1;
    napi_create_string_utf8(env, "worldflying", NAPI_AUTO_LENGTH, &arr1);
    napi_value arr2;
    napi_create_int32(env, 50, &arr2);
    napi_value arr3;
    napi_create_string_utf8(env, "hello", NAPI_AUTO_LENGTH, &arr3);
    napi_value arr4;
    napi_create_int32(env, 1, &arr4);
    napi_value arr;
    napi_create_array(env, &arr);
    napi_set_element(env, arr, 0, arr1);
    napi_set_element(env, arr, 1, arr2);
    napi_set_element(env, arr, 2, arr3);
    napi_set_element(env, arr, 3, arr4);
    napi_set_element(env, arr, 4, obj);
    return arr;
}

napi_value Init(napi_env env, napi_value exports) {
    napi_value fn;
    if (napi_create_function(env, NULL, 0, ShowVersion, NULL, &fn) != napi_ok) return NULL;
    if (napi_set_named_property(env, exports, "ShowVersion", fn) != napi_ok) return NULL;
    return exports;
}

NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)

调用的代码如下:

let ts = require('./test.node')
let res = ts.ShowVersion()
console.log (res)

返回的值就可以像一个普通的nodejs代码一样调用了。

调用结果如下:

F:\BaiduYunDownload\nodetest>node test.js

[ 'worldflying', 50, 'hello', 1, { ID: 1, name: 'jevian' } ]


文章作者:沃航科技

联系我们
地址:
武汉市洪山区蓝晶国际7栋903
QQ:
932773931
电话:
027-59761089-806
手机:
13397158231
邮箱:
jevian_ma@worldflying.cn
×
物联网组态平台
试用账号:123456
试用密码:123456
如需测试更多功能或者有疑问可发送邮件至:jevian_ma@worldflying.cn
×
积木编程平台
试用方式:试用手机号码注册即可使用
如需测试更多功能或者有疑问可发送邮件至:jevian_ma@worldflying.cn