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
相关问题
Native如何通过napi获取ArrayBuffer?
1414浏览 • 1回复 待解决
undefined symbol napi_create_threadsafe_function
2338浏览 • 1回复 待解决
为什么禁止缓存napi_env
114浏览 • 1回复 待解决
需要提供napi反调ets例子
99浏览 • 1回复 待解决
napi_module结构体字段描述解析
325浏览 • 1回复 待解决
是否有简洁易用NAPI开发框架
832浏览 • 1回复 待解决
openharmony napi 异步耗时阻塞jsui刷新
3618浏览 • 1回复 已解决
ArkTS import导入napi模块结果错误
174浏览 • 0回复 待解决
napi_queue_async_work 处理机制
111浏览 • 1回复 待解决
napi里面,相同输入输出不一致
125浏览 • 1回复 待解决
NAPI执行上层回调时,如何获取env
364浏览 • 1回复 待解决
有谁知道napi多函数导出写法
268浏览 • 1回复 待解决