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
按赞同
/
按时间
dushinongmin

退到后台和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对象绑定
417浏览 • 1回复 待解决
Native如何通过napi获取ArrayBuffer?
1811浏览 • 1回复 待解决
NAPI介绍(九) - gdb调试
153浏览 • 1回复 待解决
napi 基本使用场景示例
410浏览 • 1回复 待解决
NAPI中定义并注册Class
297浏览 • 1回复 待解决
需要提供napi反调ets例子
515浏览 • 1回复 待解决
为什么禁止缓存napi_env
571浏览 • 1回复 待解决
undefined symbol napi_create_threadsafe_function
2722浏览 • 1回复 待解决
"NAPI通信耗时长"导致丢帧分析
149浏览 • 1回复 待解决
是否有简洁易用NAPI开发框架
1219浏览 • 1回复 待解决
NAPI跨线程调用TS线程函数
379浏览 • 1回复 待解决
ArkTS import导入napi模块结果错误
597浏览 • 0回复 待解决