,那么在编译时也要根据平台选择编译。...有两点需要注意 #include "sleep.h" 这个宏定义是我们自己实现的,代码中 os_usleep() 这个函数是在这个文件中定义的,继续往下看。...= napi_number) { napi_throw_type_error(env, NULL, "microseconds must be a number"); return NULL...init); sleep.h NAPI_STATUS_CALL 这个和之前一样忽略掉,这里重点就是对函数 os_usleep() 的声明,通常在 C/C++ 程序中建议把所有的常量、宏、函数原型写在头文件中...,例如我们使用 node-gyp 工具在 Linux 系统要安装 Python、GCC,Windows 系统同样也要安装相应的构建环境,对于用户来说是一个极大的障碍,总不能要求用户同样也安装这些工具。
return sum;}// napi_addon_register_func//2.指定模块注册对外接口的处理函数,具体扩展的接口在该函数中声明static napi_value registerFunc...desc[0]), desc); return exports; }// 1.先定义napi_module,指定当前NAPI模块对应的模块名//以及模块注册对外接口的处理函数,具体扩展的接口在该函数中声明...//2.指定模块注册对外接口的处理函数,具体扩展的接口在该函数中声明static napi_value registerFunc(napi_env env, napi_value exports){...exports; }// 1.先定义napi_module,指定当前NAPI模块对应的模块名//以及模块注册对外接口的处理函数,具体扩展的接口在该函数中声明// nm_modname: 模块名称,...Javascript值类型,被NAPI框架封装成统一的唯一类型——napi_value类型,为了能够进行计算,我们需要获取其对应在C/C++中的类型的值。
本篇介绍使用 Node-API 为 Node.js 开发基于 C 的 Addons 时,如何接收与处理 Node.js 层传递的参数、Node-API 参数类型如何与 C 的类型互转、使用 CMake.js...方法获取 napi_callback_info 上下文信息,这一块是 Node.js 层调用函数时传入的参数信息,以下是 napi_get_cb_info 方法的定义: napi_status napi_get_cb_info...我们要表示一个整型会用到 Number 类型,那么如果传递到 C 函数中,可以使用 Node-API 提供的函数 napi_get_value_int32() 函数转换为 C 语言中的 int 类型。...模块注册在第一篇中已经讲解过了,与之类似,我们本次注册模块名称为 calculator。...,CMake.js 是基于 CMake 的构建系统,它不需要你必须安装 Python 环境。
源码实现新建完工程后,实现napi接口的hello.cpp源码在工程的entry/src/main/cpp目录下。...注册napi模块先定义一个模块,对应结构体为napi_module,指定当前NAPI模块对应的模块名以及模块注册对外接口的处理函数,具体扩展的接口在该函数中声明,后面说明。...(&demoModule);}接口定义napi_property_descriptor结构体中声明了napi中对应的接口,如下所示,其中Add对应的使Native C++的接口,其应用端的接口对应为add...();而工程创建后,在index.ets文件(在工程的entry/src/main/ets/pages目录下)中系统已经默认生成了一个hello world的文本区域,且通过点击文本区域,可以调用getHelloString...工具上运行按钮进行安装运行应用了 调试应用安装运行后,在板子上我们可以在屏幕的中央看到Hello World的显示,并且我们点击Hello World后可以在DevEco Studio工具的Log窗口查看到对应的调试信息
项目介绍本文档是在eTS项目hap包中实现串口访问的使用说明,通过JS接口开放给上层应用使用。一、开发环境准备安装OpenHarmony SDK1....OpenHarmony SDK选项中选择配备API版本进行安装二、创建eTS项目创建支持Native C++的eTS项目三、NAPI库相关生成串口NAPI库1....根据serialhelper.d.ts文件生成对应的c++源码方式一:手动编写src/main/cpp/serial_helper.cppstruct AsyncCallInfo{ napi_env...复制到entry/libs/armeabi-a7v目录将库的头文件复制到entry/src/main/cpp/include目录继承SerialCallbackBase类,实现串口数据异步回调SerialAsyncCallback...) 在napi函数中调用api函数,使用NAPI框架生成工具生成OpenSerial代码,如下: struct OpenSerial_value_struct { std::string
结构体AKI 提供 JSBIND_CLASS 对 C++ 类/结构体进行绑定,在JSBIND_CLASS作用域下可绑定:类构造函数、类成员函数、类成员属性的类特性。...JSBIND_METHOD(method)AKI 使用 JSBIND_METHOD 对C++ 的3种类成员函数进行绑定:类静态函数、类成员函数、const 类成员函数。...)传递;API参考napi_env 获取static napi_env aki::JSBind::GetScopedEnv();线程安全函数,用于获取当前线程的 napi_env 对象。...示例:// 在 JS 线程执行napi_value obj;napi_env env = aki::JSBind::GetScopedEnv();napi_create_object(env, &obj...如下示例:examples/ohos/4_hybrid_napi/entry/src/main/hello.cppEXTERN_C_STARTstatic napi_value Init(napi_env
int a = 1;void *p = &a;printf("%d", *(int *)p); 那么Node.js中的这个定义有什么用呢?我们看看他的用法。下面以NAPI中创建一个数组的API为例。...::JsValueFromV8LocalValue(v8::Array::New(env->isolate)); return napi_clear_last_error(env);} napi_create_array...), (src), napi_object_expected) 是一个宏,继续展开 #define CHECK_TO_TYPE(env, type, context, result, src, status...return local;} V8LocalValueFromJsValue把napi_value v的值复制到local中,我们看看Local类的定义。...,当我们调用后续接口时只需要传入napi_value,Node.js就会帮我们处理好之后(转换成对应的v8类型)再调用v8的接口,否则用户就需要这样做。
int a = 1;void *p = &a;printf("%d", *(int *)p); 那么Node.js中的这个定义有什么用呢?我们看看他的用法。下面以NAPI中创建一个数组的API为例。...::JsValueFromV8LocalValue(v8::Array::New(env->isolate)); return napi_clear_last_error(env);} napi_create_array...), (src), napi_object_expected) 是一个宏,继续展开 #define CHECK_TO_TYPE(env, type, context, result, src, status...local;} V8LocalValueFromJsValue把napi_value v的值复制到local中,我们看看Local类的定义。...,当我们调用后续接口时只需要传入napi_value,Node.js就会帮我们处理好之后(转换成对应的v8类型)再调用v8的接口,否则用户就需要这样做。
4.1.2 将NapiTest类定义为js类4.1.2.1在定义js类之前,需要先设置js类对外导出的方法 // 在定义js类之前,需要先设置类对外导出的方法 napi_property_descriptor...在JavaScript中,属性被表示为一个键和一个值的元组。...:在Node-API中通过napi_value表示。...在导出C ++ 类对象时,这个函数必须是带有napi_callback签名(Constructor函数有napi_callback签名是指要满足typedef napi_value (*napi_callback...)(napi_env, napi_callback_info);的形式)的静态成员。
在本篇文章中,笔者使用三方库移植之NAPI开发1—Hello OpenHarmony NAPI中一样的hellonapi.cpp和index.ets源码,通过IDE开发一个RAM包的NAPI工程(集成C...++的动态库到开发板的RAM中),直接编译安装hap包到开发板即可。...(), &result); return result;}// napi_addon_register_func//2.指定模块注册对外接口的处理函数,具体扩展的接口在该函数中声明static napi_value...); return exports;}// 1.先定义napi_module,指定当前NAPI模块对应的模块名//以及模块注册对外接口的处理函数,具体扩展的接口在该函数中声明// nm_modname...d.ts声明文件的编写不同开发ROM包的NAPI工程时,笔者编写的@ohos.hellonapi.d.ts内容为开发RAM包的NAPI工程时,笔者编写的@ohos.hellonapi.d.ts内容为:编写
(), &result)); return result;}// 注册对外接口的处理函数napi_addon_register_func// 2.指定NAPI模块注册对外接口的处理函数,具体扩展的接口在该函数中声明...注册NAPI模块、添加接口声明定义的hellonapi模块,其对应结构体为napi_module。指定当前NAPI模块对应的模块名模块注册对外接口的处理函数,具体扩展的接口在该函数中声明。...= { // 声明该napi_module对外具体的提供的API为getHelloString // 在napi_property_descriptor desc[]中需要将编写...); return exports;}// 注册NAPI模块// 1.先定义NAPI模块,指定当前NAPI模块对应的模块名// 以及模块注册对外接口的处理函数,具体扩展的接口在该函数中声明// nm_modname...", #根据增量编译阶段报错添加的头文件目录 "//third_party/node/src" ] #根据增量编译时clang编译器报警,添加的
此外,还可以选择性地提供一个napi_finalize回调,用于在销毁线程安全函数时执行资源清理操作。...调用会被排队,并最终在JavaScript主线程上执行。资源清理: 当线程安全函数不再需要时,应当正确地释放和清理与其关联的资源。...通常开发者会将自定义数据赋值给req->data成员变量以在回调中使用。 work_cb: 执行实际工作的回调函数,一些耗时的操作可以在此执行,该函数在线程池的一个线程上运行。...需要注意的是,尽管uv_queue_work方法本身不直接涉及NAPI(Node-API)接口,但当涉及到与JavaScript线程交互时,特别是从native层向JavaScript层传递数据并触发回调时...// src/main/cpp/hello.cpp // 在子线程中调用线程安全函数 for (int i = 0; i < g_threadNum; i++) { //
,避免了层层嵌套的回调函数,保证了回调是以异步的方式进行调用的;用户在调用这些接口的时候,接口实现将异步执行任务,同时返回一个 Promise 对象,其代表异步操作的结果;在返回的结果的个数超过一个时,...sizeof(desc[0]), desc)); return exports;}// 定义napi_module,指定当前NAPI模块对应的模块名//以及模块注册对外接口的处理函数,具体扩展的接口在该函数中声明...//2.指定模块注册对外接口的处理函数,具体扩展的接口在该函数中声明static napi_value registerFunc(napi_env env, napi_value exports){...(desc[0]), desc); return exports; }// 1.先定义napi_module,指定当前NAPI模块对应的模块名//以及模块注册对外接口的处理函数,具体扩展的接口在该函数中声明...//以及模块注册对外接口的处理函数,具体扩展的接口在该函数中声明// nm_modname: 模块名称,对应eTS代码为import nm_modname from '@ohos.ohos_shared_library_name
js结构体时实际的构建函数 static void Destructor(napi_env env, void *nativeObject, void *finalize); // 释放资源的函数...= napi_ok) { return nullptr; } mConstructor 定义js类时返回的代表类的构造函数的数据 sConstructor_ 生命周期变量 将类导出到...注意:以上实现都是在类的Init方法中,我们只需要在NAPI注册的接口中调用该Init即可。...应用调用NAPI实例导出接口在使用该NAPI的时候,我们需要在ts文件(路径在\entry\src\main\cpp\types\libentry\index.d.ts),声明以下内容:export const...接口中导出的方法和类应用调用新建一个helloworld的ETS工程,该工程中包含一个按键,我们可以通过该按键进行数据的在native c中存储和获取导出napi对应的库(之前NAPI接口生成的库名为libentry.so
) 操作 分布式文件系统 调用 AI 推理引擎(如 MindSpore Lite) 在 OpenHarmony 中,这些能力无法通过标准 Android/iOS 插件复用,必须 重新封装为 OpenHarmony...double y, double z) { napi_env env = ...; // 获取当前 env napi_value jsData; napi_create_object(env..., z)); // 调用 Dart 注册的 EventCallback napi_value undefined; napi_get_undefined(env, &undefined);...七、调试技巧:Native + Dart 联合调试 场景:插件崩溃,日志不清晰 解决方案: 在 C++ 中添加 HiLog 输出: #include "hilog/log.h" OH_LOG_Print...(LOG_APP, LOG_INFO, LOG_DOMAIN, "SensorPlugin", "Start accelerometer"); 在 DevEco Studio 中开启 Native Debug
服务中的 interfaces 内的 napi 接口中实现。...NAPI_ASSERT(env, argc error!"); 5\....NAPI_ASSERT(env, matchFlag, "Type error, should be number type"); 7\....asyncContext->result = ret; 11\. } 在一路调用的的过程中,会调用 CallPolicy 类的 AnswerCallPolicy 函数用来判断对应 callId 的...,这里会从 data 中解析出对应的 callinfo 信息,在函数末尾出调用本文件的 Answer(),并将返回的结果写入 reply 中,这个返回值是函数执行的结果,为 Int32 整形值。
环境搭建 安装 Node.js Node.js 版本至少在 v8.6.0 之上,安装参考 “3N 兄弟” 助您完成 Node.js 环境搭建。...如果是 Mac 电脑,需要 xcode-select --install 命令安装 XCode 命令行工具,或者在应用商店安装 XCode 工具。...src └── hello.c 编写 C 文件 核心是 src 目录下的 hello.c 这个文件,这里也会分步详细讲解其每个实现步骤。...,也要传入本机函数初始化的 napi_env。...为给定的对象定义属性,类似于 JavaScript 中的 Object.defineProperties(),该方法定义如下所示: napi_status napi_define_properties
的回调中调用addUIContext方法必须在UIAbility的onWindowStageCreate中的windowStage.loadContent之后调用setTopAbilityID建议在UIAbility...的onWindowStageDestroy中调用removeUIContext方法实现思路native侧需要主动调用ets侧的代码,需要将ets侧代码注入到native侧,并在注册时创建函数的引用及线程安全函数...(options, thenWrapper, catchWrapper)因为本例中的filepicker是异步的,回调函数需要调用者传入,而napi中若需要将native方法直接封装为ets方法对于函数类型是有要求的...因此这里通过将回调函数封装到对象中,通过对象包装来实现将一般类型的函数封装为ets侧的函数:native侧: // step:类型声明 class DocumentViewPickerSelectThenCbWrapper...windowStage.on("windowStageEvent") 来获取当前活跃窗口对应的UIContext,从理论上来讲,因为事件的处理流程有如下两条并行路径,因此在2in1设备的多实例场景下,直接点击失焦窗口的按钮时
napi_property_attributes 除了 napi_default 之外,还有诸如只读、是否可枚举等属性。 函数声明 还记得之前的两种函数声明吗?第三次再搬过来。...因为在 N-API 里面,声明一个 Echo 是这样的: napi_value Echo(napi_env env, napi_callback_info info) { napi_status...= napi_ok || argc < 1) { napi_throw_type_error(env, "Wrong number of arguments");...又比如 ``napi_property_descriptor_desc结构体中,在utf8name之后还有一个napi_value` 的变量,而文档中却是没有的。...= napi_ok || argc < 1) { napi_throw_type_error(env, "Wrong number of arguments");
); } OH_LOG_ERROR(LOG_APP, "JSVM ReleaseJsCore END"); return nullptr;}JS 中调用的 C++ 代码实现调用的C++方法类似于NAPI...自定义C++代码中的JSVM的常用接口与NAPI的接口类似,可参考文档底部的官方文档。...// 用以在native层中调用TS侧传入的Callback函数static JSVM_Value OnJSResultCallback(JSVM_Env env, JSVM_CallbackInfo...callback = nullptr; // 通过callId获取在创建当前JSVM环境时传入的TS回调方法 napi_get_reference_value(g_napiEnvMap[callId...,这样就不会出现像有的数据成员没有销毁导致内存泄露的问题或者程序直接崩溃 virtual ~Task() = default; // virtual纯虚函数的类是一个抽象类 virtual void