HarmonyOS 鸿蒙Next NAPI获取this问题

HarmonyOS 鸿蒙Next NAPI获取this问题

业务流程:js调用native,后native调用js

咨询问题: 如下代码: napi_get_cb_info(env, callbackInfo, 0, nullptr, &thiz, nullptr); 获取this方式是否正确 ?

遇到问题: bool has = false; status = napi_has_named_property(env, thiz, “setPointer”, &has); has一直为false

相关代码:

import LivenessSDK from 'libsdk_liveness.so';

export class LivenessDetector {
  private pointer: number = -1;

  public create() {
    LivenessSDK.createLivenessDetector();
  }

  public getPointer(): number {
    return this.pointer;
  }
}
static napi_value createLivenessDetector(napi_env env, napi_callback_info callbackInfo) {
  napi_value thiz = nullptr;
  napi_status status = napi_get_cb_info(env, callbackInfo, 0, nullptr, &thiz, nullptr);
  napi_value getPointerFunc = nullptr;
  status = napi_get_named_property(env, thiz, "getPointer", &getPointerFunc);
  LOG_INFO("napi_get_named_property:%d", status);
  napi_value result = nullptr;
  // native方法中调用ArkTS function,其返回值保存到result中并返到ArkTS侧。
  status = napi_call_function(env, thiz, getPointerFunc, 0, nullptr, &result);
  int64_t pointer;
  napi_get_value_int64(env, result, &pointer);
  LOG_INFO("napi_get_named_property:pointer::%d", pointer);
  LOG_INFO("napi_call_function:%d", status);
  return result;
}

更多关于HarmonyOS 鸿蒙Next NAPI获取this问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

开发者您好,请按照下述示例进行调整您的代码:

size_t argc = 1;
napi_value thiz = nullptr;
napi_status status = napi_get_cb_info(env, callbackInfo, &argc, &thiz, nullptr, nullptr);

// index.d.ts
export const createLivenessDetector: (value: Object) => void;

// ts层
public create() {
    LivenessSDK.createLivenessDetector(this);
}
ChenL
LivenessSDK.createLivenessDetector(this); 必须有个入参this ?

napi_status napi_get_cb_info(napi_env env,
        napi_callback_info cbinfo,
        size_t * argc,
        napi_value * argv,
        napi_value * thisArg,
        void** data) 拷贝

[in] env: 调用 API 的环境。
[in] cbinfo: 传递给回调函数的回调信息。
[in-out] argc: 指定所提供的 argv 数组的长度并接收参数的实际计数。 argc 可以选择性地通过传递 NULL 来忽略。
[out] argv: 参数将被复制到的 napi_value 的 C 数组。 如果参数数量多于提供的数量,则只复制请求数量的参数。 如果提供的参数比声明的少,则 argv 的其余部分将填充代表 undefined 的 napi_value 值。 argv 可以选择性地通过传递 NULL 来忽略。
[out] thisArg: 接收调用的 JavaScript this 参数。 thisArg 可以选择性地通过传递 NULL 来忽略。
[out] data: 回收回调的数据指针。 data 可以选择性地通过传递 NULL 来忽略。

更多关于HarmonyOS 鸿蒙Next NAPI获取this问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS(鸿蒙)系统中,NAPI(Native API)是用于原生代码开发的一套接口。关于NAPI中获取this指针的问题,通常涉及到C++或者类似面向对象语言的上下文管理,但鸿蒙的NAPI设计更偏向于系统级原生接口,并不直接涉及高级语言的this机制。

在原生开发环境中,this指针主要用于C++类成员函数中指向调用该成员函数的对象实例。然而,在鸿蒙的NAPI或者更底层的系统编程中,通常不会直接处理this指针,因为这些接口设计更多是基于函数指针、回调或者结构体传递上下文信息。

如果你在NAPI环境中遇到了类似需要获取对象实例(类似于this)的情况,可能需要通过以下方式解决:

  1. 使用用户数据(User Data):在注册回调或者创建某些对象时,允许你传递一个自定义的用户数据指针,这个指针可以在回调中被访问,用于指代特定的上下文或对象实例。

  2. 结构体封装:设计一个结构体来封装所有需要的上下文信息,并在需要时传递这个结构体的指针。

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

回到顶部