我有一個C++庫,由Java通過基於SWIG的接口調用。在Java方面,我使用默認的結構接口和carrays.i
的%array_class
構建了一個包含指向其他結構數組的指針的結構。SWIG結構成員被Java的垃圾收集器過早釋放
因爲Java的垃圾收集器不知道頂層結構的成員,所以有時會釋放該數組,其數組有時會被釋放,其終結符delete[]
就是它的後備內存。我需要一種解決方法,最好不要在Java中重複結構,因爲它相當大。
小例子看起來是這樣的(雖然它可能不會引發錯誤,因爲它並沒有做太多):
C++ /痛飲:
%module example
%include "carrays.i"
%array_class(object, objectArray);
struct object {
unsigned int id;
char *name;
};
struct data {
size_t nobjects;
object *objects;
};
void use_data(data*);
的Java:
public class Example {
private static data writeData() {
data d = new data();
objectArray os = new objectArray(3);
for (int i = 0; i < 3; i++) {
object o = new object();
o.setId(i);
o.setName("obj" + i);
os.setitem(i, o);
}
d.setNobjects(3);
d.setObjects(os.cast());
return d;
}
public static void main(String[] args) {
data d = writeData();
example.use_data(d);
}
}