gpt4 book ai didi

java - 防止过早的垃圾收集

转载 作者:行者123 更新时间:2023-11-30 05:35:51 24 4
gpt4 key购买 nike

我遇到过早垃圾回收的问题。我找到了一个不错的 solution在 SWIG 文档中用于解决此类问题。但是我遇到了问题,因为我有静态工厂方法,无法从中访问非静态引用字段。

将推荐的 SWIG 解决方案应用于下面的 C++ 代码

struct Child {
};

struct Parent {
static Parent* create(Child& child);
};

获取像

这样的损坏的 Java 代码
public static Parent create(Child child) {
long cPtr = SampleJNI.Parent_create(getCPtrAndAddReference(child), child);
return (cPtr == 0) ? null : new Parent(cPtr, false);
}

此代码已损坏,因为 Parent.create(Child child) 是静态的,但 Parent.getCPtrAndAddReference(Child child) 不是。我正在考虑两种解决方案中的一种。

第一个是找到生成类似东西的方法

public static Parent create(Child child) {
long cPtr = SampleJNI.Parent_create(Child.getCPtr(child), child);
return (cPtr == 0) ? null : new Parent(cPtr, false, child)/* call of alternative constructor created with typmap(javabody) */;
}

但是我不知道怎么做。

第二种解决方案是使用 SetObjectField 调用在 JNI 端实现赋值。我确实知道一般如何去做,但如果可能的话我宁愿选择第一个解决方案。

最佳答案

尝试这样的事情:

%newobject Parent::create;

%typemap(javacode) Parent %{
private Child childReference;
%}

%typemap(javaout) Parent* create(Child&) {
long cPtr = $jnicall;
if (cPtr == 0) {
return null;
} else {
Parent p = new Parent(cPtr, $owner);
p.childReference=child;
return p;
}
}

这将向 Parent 添加字段,该字段将存储对子项的引用,并在创建时保存引用。

%newobject 表示 java 在垃圾收集此项时删除 C 对象。不要忘记它,否则会发生内存泄漏。

关于java - 防止过早的垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33752220/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com