#鸿蒙通关秘籍#如何在鸿蒙中通过napi_wrap绑定ArkTS对象与C++对象?

HarmonyOS
2024-12-20 10:04:07
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
SOAP寒潭映月

在鸿蒙开发中,通过napi_wrap可以实现ArkTS对象与Native C++对象的绑定。具体步骤如下:

  1. 定义ArkTS的类及其接口,在index.d.ts文件中定义类,并声明相关方法和属性。

    typescript // index.d.ts export class MyObject { constructor(arg: number); plusOne: () => number;

    public get value(); public set value(newVal: number); }

  2. 在CMakeLists.txt中进行编译配置。

    cmake cmake_minimum_required(VERSION 3.4.1) project(object_wrap)

    set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})

    include_directories(${NATIVERENDER_ROOT_PATH} ${NATIVERENDER_ROOT_PATH}/include)

    add_definitions("-DLOG_DOMAIN=0x0000") add_definitions("-DLOG_TAG="testTag"")

    add_library(object_wrap SHARED object_wrap.cpp) target_link_libraries(object_wrap PUBLIC libace_napi.z.so libhilog_ndk.z.so)

  3. object_wrap.cpp中定义C++类,并在构造函数中使用napi_wrap方法进行绑定。

    cpp class MyObject { public: static napi_value Init(napi_env env, napi_value exports); static void Destructor(napi_env env, void* nativeObject, void* finalize_hint);

    private: explicit MyObject(double value_ = 0); ~MyObject();

    static napi_value New(napi_env env, napi_callback_info info);

    double value_; napi_env env_; napi_ref wrapper_; };

    MyObject::MyObject(double value) : value_(value), env_(nullptr), wrapper_(nullptr) {}

    MyObject::~MyObject() { napi_delete_reference(env_, wrapper_); }

    napi_value MyObject::Init(napi_env env, napi_value exports) { // 属性描述和类定义 }

    napi_value MyObject::New(napi_env env, napi_callback_info info) { napi_value newTarget; napi_get_new_target(env, info, &newTarget); if (newTarget != nullptr) { size_t argc = 1; napi_value args[1]; napi_value jsThis; napi_get_cb_info(env, info, &argc, args, &jsThis, nullptr);

    double value = 0.0;
    napi_valuetype valuetype;
    napi_typeof(env, args[0], &valuetype);
    if (valuetype != napi_undefined) {
      napi_get_value_double(env, args[0], &value);
    }
    
    MyObject* obj = new MyObject(value);
    obj->env_ = env;
    napi_wrap(env, jsThis, reinterpret_cast<void*>(obj), MyObject::Destructor, nullptr, &obj->wrapper_);
    return jsThis;
    

    } // 简单调用方式 }

  4. 在ArkTS中使用该绑定对象进行操作。

    typescript import hilog from '@ohos.hilog'; import { MyObject } from 'libobject_wrap.so'

    let object: MyObject = new MyObject(0); object.value = 1023; hilog.info(0x0000, 'testTag', 'MyObject value after set: %{public}d', object.value); hilog.info(0x0000, 'testTag', 'MyObject plusOne: %{public}d', object.plusOne());

分享
微博
QQ
微信
回复
2024-12-20 11:22:21
相关问题
ArkTS对象绑定C++对象如何回收?
1268浏览 • 1回复 待解决
如何在C/C++ 创建ArkTS对象
2792浏览 • 1回复 待解决
如何实现ArkTSC/C++对象传递
1118浏览 • 1回复 待解决
ArkTS通过接口访问C++对象
772浏览 • 1回复 待解决