У меня есть библиотека C++, которая вызывается Java через интерфейс на основе SWIG. На стороне Java я создаю структуру, содержащую указатели на массивы других структур, используя интерфейс структуры по умолчанию и carrays.i
's %array_class
.Члены SWIG-структуры досрочно освобождаются сборщиком мусора Java
Поскольку сборщик мусора Java не осведомлен о членах структуры верхнего уровня, массив иногда освобождается, где его финализатор delete[]
имеет свою резервную память. Мне нужно обойти это, желательно без дублирования структуры на Java, поскольку она довольно большая.
Минимальный пример выглядит следующим образом (хотя это, вероятно, не вызовет ошибку, так как он ничего не делает):
C++/SWIG:
%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);
}
}