HarmonyOS 鸿蒙Next NAPI 通过 napi_wrap 创建的对象似乎没有被销毁

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

HarmonyOS 鸿蒙Next NAPI 通过 napi_wrap 创建的对象似乎没有被销毁

问题描述:

C++ 当中使用下面的方法包装了一个 C++ 的对象:

// 用法1napi_wrap不需要接收创建的napi_ref,最后一个参数传递nullptr,创建的napi_ref是弱引用,由系统管理,不需要用户手动释放napi_wrap(env, jsobject, nativeObject, cb, nullptr, nullptr)

按照文档的说明,这个对象会在 GC 的时候自动销毁,并且通过调用 cb 来完成 C++ 对象的析构。

现在的问题是,发现 cb 没有被调用,导致 C++ 对象一直没有析构。

4 回复

解决措施:

退到后台和js中主动触发GC,都会 调用对象的析构方法;

您可以尝试以下步骤触发GC验证触发GC的操作如下:12均可触发

1、应用切后台且满足内存增长条件,可触发Compress GC

2js代码中手动调用ArkTools.forceFullGC(),可触发Compress GC

代码如下:

import { hilog } from ‘[@kit](/user/kit).PerformanceAnalysisKit’; 
import { NativeClass } from ‘libentry.so’; 
import {testGC} from ‘./test’


@Entry
@Component
struct Index {
@State message: string = ‘Hello World’;


build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.onClick(async () => {
hilog.info(0x0000, ‘testTag’, ‘1111’);
let nativeClass = new NativeClass()
nativeClass.sayHello()
hilog.info(0x0000, ‘testTag’, ‘2222’);
})


    Text(“GC”) 
    .fontSize(<span class="hljs-number"><span class="hljs-number">50</span></span>) 
      .fontWeight(FontWeight.Bold) 
      .onClick(async () =&gt; { 
        testGC(); 
      }) 
  } 
  .width(‘<span class="hljs-number"><span class="hljs-number">100</span></span>%’) 
} 
.height(‘<span class="hljs-number"><span class="hljs-number">100</span></span>%’) 
}


}


// test.ts 
export function testGC(){
// @ts-ignore 
ArkTools.forceFullGC()
}

请问问题是已经解决了吗,我这边试了还是不销毁,需不需要调用别的代码呢?

有没有可能是调用了napi_remove_wrap?image.png

在HarmonyOS鸿蒙Next NAPI环境中,napi_wrap 函数用于将原生C/C++对象与JavaScript对象进行关联。当你发现通过 napi_wrap 创建的对象似乎没有被销毁时,这通常与内存管理和对象生命周期管理有关。

  1. 确保解除包装:在JavaScript对象不再需要时,应确保调用 napi_remove_wrap 来解除JavaScript对象与原生对象的关联,这样原生对象才有可能被垃圾回收机制处理。

  2. 检查引用计数:如果原生对象使用了智能指针或其他形式的引用计数,确保所有引用在不再需要时被正确释放。

  3. 分析内存泄漏:使用内存分析工具检查是否存在内存泄漏。这可以帮助识别哪些对象或资源未被正确释放。

  4. 原生对象析构函数:如果可能,为原生对象定义析构函数,以便在对象被销毁时执行必要的清理操作。

  5. JavaScript侧管理:确保JavaScript代码中没有意外的全局变量或闭包导致对象无法被垃圾回收。

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

回到顶部