HarmonyOS 鸿蒙Next Natvie侧主动调用ArkTs侧函数

发布于 1周前 作者 bupafengyu 来自 鸿蒙OS

HarmonyOS 鸿蒙Next Natvie侧主动调用ArkTs侧函数 Natvie侧如何主动调用ArkTs侧函数?lib库 如何主动 获取到napi_env?

目前项目中遇到 Native调用其它lib,例如libA (其在原来libA中,会根据JavaVM获取 JNIEnv对象通过反射调用Java层代码)。 在鸿蒙NDK开发过程中,目前看到上下文为napi_env

napi_env与JS线程绑定,JS线程退出后,napi_env将失效

禁止缓存napi_env,禁止在不同Worker中传递napi_env

lib库如何获取napi_env?

2 回复

可参考以下方案:

  1. Native如何调ArkTS的方法: 1). 在index.d.ts文件中,提供ArkTS侧的接口方法:
export const nativeCallArkTS: (a: number) => number;

2). 实现Native侧的NativeCallArkTS接口,具体代码如下:

static napi_value NativeCallArkTS(napi_env env, napi_callback_info info)
{
  size_t argc = 1;
  // 声明参数数组
  napi_value args[1] = { nullptr };
  // 获取传入的参数并依次放入参数数组中
  napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);
  // 创建一个int,作为ArkTS的入参
  napi_value argv = nullptr;
  napi_create_int32(env, 2, &argv );
  // 调用传入的callback,并将其结果返回
  napi_value result = nullptr;
  napi_call_function(env, nullptr, args[0], 1, &argv, &result);
  return result;
}

3). 在ArkTS侧,通过nativeModule.nativeCallArkTS()方法传入方法。

// entry/src/main/ets/pages/Index.ets
// 通过import的方式,引入Native能力。
import nativeModule from 'libentry.so'
@Entry
@Component
struct Index {
  @State message: string = 'Test Node-API nativeCallArkTS result: ';
  build() {
    Row() {
      Column() {
        // 调用nativeCallArkTS方法,对应到Native的NativeCallArkTS,在Native调用ArkTS function。
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            this.message += nativeModule.nativeCallArkTS((a: number)=>{
              return a * 2;
            });
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}
  1. lib库主动获取到napi_env :

可以在注册JS回调时保存env。在callback中从env中获取对应的JS线程的loop,再调用libuv接口抛JS任务到loop中执行。

更多关于HarmonyOS 鸿蒙Next Natvie侧主动调用ArkTs侧函数的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS(鸿蒙)系统中,Next Native侧主动调用ArkTS侧函数通常涉及到跨语言模块调用的机制。HarmonyOS提供了一种机制,使得Native代码(如C++或Rust)能够调用用ArkTS(TS即TypeScript的扩展,用于鸿蒙开发)编写的组件或函数。

为了实现这一调用,你需要确保以下几点:

  1. ArkTS函数导出:在ArkTS代码中,使用特定的装饰器或注解将需要被调用的函数导出,使其对Native侧可见。

  2. 接口定义:在Native代码中,通过定义与ArkTS函数对应的接口,确保调用时参数和返回值的类型匹配。

  3. 跨语言调用框架:利用HarmonyOS提供的跨语言调用框架(如JSI或类似的机制),在Native代码中发起对ArkTS函数的调用。这通常涉及到获取ArkTS模块的引用,并通过该引用调用具体的函数。

  4. 错误处理:确保调用过程中有适当的错误处理机制,以应对可能的调用失败或异常情况。

请注意,具体的实现细节可能依赖于HarmonyOS的版本和具体的开发环境。如果上述信息不足以解决你的问题,可能是由于特定的版本差异或配置问题。此时,建议直接参考HarmonyOS的官方文档或示例代码,以获取更详细的指导。

如果问题依旧没法解决请联系官网客服, 官网地址是 https://www.itying.com/category-93-b0.html

回到顶部