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

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

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

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

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

HarmonyOS
2024-05-10 22:01:50
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
单花红丝线

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

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

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

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

代码如下:

import { hilog } from ‘@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(50) 
          .fontWeight(FontWeight.Bold) 
          .onClick(async () => { 
            testGC(); 
          }) 
      } 
      .width(‘100%’) 
    } 
    .height(‘100%’) 
  } 
 
} 
 
// test.ts 
export function testGC(){ 
  // @ts-ignore 
  ArkTools.forceFullGC() 
}
分享
微博
QQ
微信
回复
2024-05-11 11:19:11
相关问题
napi常见用法:class对象绑定
910浏览 • 1回复 待解决
Native如何通过napi获取ArrayBuffer?
3332浏览 • 1回复 待解决
没有napi一些demo?
240浏览 • 3回复 待解决
HarmonyOS NAPI调用ArkTS静态方法
335浏览 • 1回复 待解决
HarmonyOS NAPI开发相关问题
227浏览 • 1回复 待解决
NAPI介绍(九) - gdb调试
472浏览 • 1回复 待解决
需要提供napi反调ets例子
805浏览 • 1回复 待解决
NAPI中定义并注册Class
584浏览 • 1回复 待解决
napi 基本使用场景示例
1224浏览 • 1回复 待解决