Hi Claudio, Thanks for you informing about new JNA version. I try to use JNA provided API. It works well. The updated code is as following: public SchedParameter[] getSchedulerParameters() throws LibvirtException { IntByReference nParams = new IntByReference(); SchedParameter[] returnValue = new SchedParameter[0]; - String scheduler = libvirt.virDomainGetSchedulerType(VDP, nParams); + Pointer pScheduler = libvirt.virDomainGetSchedulerType(VDP, + nParams); processError(); - if (scheduler != null) { + if (pScheduler != null) { + String scheduler = pScheduler.getString(0); + Native.free(Pointer.nativeValue(pScheduler)); virSchedParameter[] nativeParams = new virSchedParameter[nParams.getValue()]; returnValue = new SchedParameter[nParams.getValue()]; libvirt.virDomainGetSchedulerParameters(VDP, nativeParams, nParams); If there is no issue. I recommend to use this solution to enhance all JNA code. BTW: Not all the returned String should be freed by JNA. For example, In Domain Class, the result returned by the method getName/ getUUIDString can't be freed. Because the reference were not allocated temporarily. We must analyze case by case. B.R. Benjamin Wang -----Original Message----- From: Claudio Bley [mailto:cbley@xxxxxxxxxx] Sent: 2012年10月11日 23:36 To: Benjamin Wang (gendwang) Cc: veillard@xxxxxxxxxx; libvir-list@xxxxxxxxxx; Yang Zhou (yangzho) Subject: Re: Memory free in libvirt JNA At Thu, 11 Oct 2012 08:37:23 +0000, Benjamin Wang (gendwang) wrote: > > Hi Claudio, > Sorry for my late response. > I have gone through Claudio's solution. It's good. But I think this is not a common solution. There are two points: > 1. This solution must use Pointerbyreference to encapsulate the > Pointer. This is not clean. Yes, as I said, this adds another level of indirection --- which is pretty useless in Java. > 2. Libvirt provides virFree method. But a common library could not > provide memory management functions. Sorry, I don't get your point here. > My proposal is as following: > 1. Add a new Class Libc.java > public interface Libc extends Library{ > Libc INSTANCE = (Libc) Native.loadLibrary("c", Libc.class); > > public void free(Pointer p); > } Not every platform has a shared library called "c". On Windows this would be msvcrt.dll for the Microsoft runtime. So, you would need to branch on the platform to load whatever library seems appropriate. Also, I just discovered that since version 3.3.0 JNA provides a public free method itself. Since I get crashes when using callback functions with JNA 3.2.7 in certain circumstances it is better just to require a newer version of JNA, IMHO. I'll post a few patches with improvements and memory fixes tomorrow. -- AV-Test GmbH, Henricistraße 20, 04155 Leipzig, Germany Phone: +49 341 265 310 19 Web:<http://www.av-test.org> Eingetragen am / Registered at: Amtsgericht Stendal (HRB 114076) Geschaeftsfuehrer (CEO): Andreas Marx, Guido Habicht, Maik Morgenstern -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list