Есть несколько возможных решений для этого. Самое простое - это обернуть функцию, которая может создавать object
s без «владения» памятью Java. Это может выглядеть примерно так:
%inline %{
object *new_object() {
// SWIG will assume that it doesn't own this
return new object;
}
%}
Вы можете изменить swigCMemOwn
boolean
после создания. Карта типов должна быть в состоянии внедрить это в соответствующем месте (когда object
передается setitem
). Например, вы можете написать:
%typemap(javacode) object %{
object transfer() {
swigCMemOwn = false;
return this;
}
%}
Это должно быть до того, как класс object
будет впервые замечен, и позволит вам написать что-то вроде:
os.setitem(i, o.transfer());
вместо os.setitem(i, o);
.
Разновидностью этой темы может быть использование javain
карты типов для замены стандартной реализации setitem
в прокси Java, так что она вызывает функцию (вы предоставляете) на object
для изменения владельца, например :
%javamethodmodifiers objectArray::setitem "protected";
%rename objectArray::setitem setitemImpl;
%typemap(javacode) objectArray %{
public void setitem(int i, object o) {
o.disown();
setitemImpl(i, o);
}
%}
до %include "carrays.i"
и соответствующего disown()
через %typemap(javacode) object
. (swigCMemOwn
равно protected
, поэтому objectArray
не может изменить это напрямую).
Возможны и другие подходы, которые также включают установление права собственности. Я думаю, что те, которые я показал, самые простые.
В качестве альтернативы, другим распространенным обходным решением будет сохранить ссылку на прокси-объект Java, висящий вокруг , назначив его переменной-члену. В этом случае, поскольку у вас потенциально есть много объектов, которые должны быть самим контейнером.