From: Russell J. <rpj...@gm...> - 2012-02-01 18:17:02
|
I have a C++ library that is called by Java through a SWIG-based interface. On the Java side, I build up a structure containing pointers to arrays of other structures, using the default struct interface andcarrays.i's %array_class. Because Java's garbage collector is not aware of the members of the top-level struct, the array is sometimes freed, whereon its finalizer delete[]s its backing memory. I need a way around this, preferably without duplicating the struct in Java, since it's rather large. A minimal example looks like this (although it probably won't trigger the bug since it doesn't do much): 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); } } |
From: AlBor <dsb...@gm...> - 2012-02-07 08:44:35
|
I didn't deal with Java but had a similar experience with C# wrappers. I did the following: provided the destructors of such "dangerous" classes with "GC.SuppressFinalize(this);" using typemap "%typemap(csdestruct". And in the very code I called dispose method of such class and then "GC.Collect();" explicitly. Hope there's much in common and you'll find my post useful for your case. Regards, Alex. -- View this message in context: http://old.nabble.com/SWIG-struct-members-are-freed-prematurely-by-Java%27s-garbage-collector-tp33245133p33277132.html Sent from the swig-user mailing list archive at Nabble.com. |
From: William S F. <ws...@fu...> - 2012-03-27 22:44:14
|
On 01/02/12 18:16, Russell Johnston wrote: > I have a C++ library that is called by Java through a SWIG-based > interface. On the Java side, I build up a structure containing > pointers to arrays of other structures, using the default struct > interface andcarrays.i's %array_class. > > Because Java's garbage collector is not aware of the members of the > top-level struct, the array is sometimes freed, whereon its finalizer > delete[]s its backing memory. I need a way around this, preferably > without duplicating the struct in Java, since it's rather large. > > A minimal example looks like this (although it probably won't trigger > the bug since it doesn't do much): The following might help: http://www.swig.org/Doc2.0/Java.html#Java_memory_management_objects as well as the previous section. William |