目录

使用Node-API实现跨语言交互开发流程

使用Node-API实现跨语言交互,首先需要按照Node-API的机制实现模块的注册和加载等相关动作。

此处以在ArkTS/JS侧调用callNative()接口、在Native侧实现加法操作的CallNative()接口,从而实现跨语言交互为例,呈现使用Node-API进行跨语言交互的流程。

创建Native C++工程

Native侧方法的实现

注:以上代码无须复制,创建Native C++工程以后在napi_init.cpp代码中已配置好。

ArkTS侧调用C/C++方法实现

ArkTS侧通过import引入Native侧包含处理逻辑的so来使用C/C++的方法。

// entry/src/main/ets/pages/Index.ets
// 通过import的方式,引入Native能力。
import nativeModule from 'libentry.so'

@Entry
@Component
struct Index {
  @State message: string = 'Test Node-API callNative result: ';
  @State message2: string = 'Test Node-API nativeCallArkTS result: ';
  build() {
    Row() {
      Column() {
        // 第一个按钮,调用callNative方法,对应到Native侧的CallNative方法,进行两数相加。
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            this.message += nativeModule.callNative(2, 3);
            })
        // 第二个按钮,调用nativeCallArkTS方法,对应到Native的NativeCallArkTS,在Native调用ArkTS function。
        Text(this.message2)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            this.message2 += nativeModule.nativeCallArkTS((a: number)=> {
                return a * 2;
            });
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

Node-API的约束限制

[h2]SO命名规则

导入使用的模块名和注册时的模块名大小写保持一致,如模块名为entry,则so的名字为libentry.so,napi_module中nm_modname字段应为entry,ArkTS侧使用时写作:import xxx from 'libentry.so'。

[h2]注册建议

[h2]多线程限制

每个引擎实例对应一个ArkTS线程,实例上的对象不能跨线程操作,否则会引起应用crash。使用时需要遵循如下原则:

[h2]代码调试设备选择

建议开发者优先使用真机进行代码调试,若无真机或者真机无权限则可使用模拟器进行调试,模拟器调试中遇到的问题详见bm工具

开发者不要使用预览器进行功能调试,预览器的主要功能是调试界面组件,若用于功能调试可能会出现如下报错:

部分常见错误用法已增加维测手段覆盖,详见使用Node-API接口产生的异常日志/崩溃分析。