diff --git a/engine/src/core/com/jme3/util/BufferUtils.java b/engine/src/core/com/jme3/util/BufferUtils.java index 668621e6f..f0cc69852 100644 --- a/engine/src/core/com/jme3/util/BufferUtils.java +++ b/engine/src/core/com/jme3/util/BufferUtils.java @@ -1165,9 +1165,21 @@ public final class BufferUtils { Method cleanerMethod = toBeDestroyed.getClass().getMethod("cleaner"); cleanerMethod.setAccessible(true); Object cleaner = cleanerMethod.invoke(toBeDestroyed); - Method cleanMethod = cleaner.getClass().getMethod("clean"); - cleanMethod.setAccessible(true); - cleanMethod.invoke(cleaner); + if (cleaner != null) { + Method cleanMethod = cleaner.getClass().getMethod("clean"); + cleanMethod.setAccessible(true); + cleanMethod.invoke(cleaner); + } else { + // Try the alternate approach of getting the viewed buffer + Method viewedBufferMethod = toBeDestroyed.getClass().getMethod("viewedBuffer"); + viewedBufferMethod.setAccessible(true); + Object viewedBuffer = viewedBufferMethod.invoke(toBeDestroyed); + if (viewedBuffer != null) { + destroyDirectBuffer( (Buffer)viewedBuffer ); + } else { + Logger.getLogger(BufferUtils.class.getName()).log(Level.SEVERE, "Buffer cannot be destroyed: {0}", toBeDestroyed); + } + } } catch (IllegalAccessException ex) { Logger.getLogger(BufferUtils.class.getName()).log(Level.SEVERE, "{0}", ex); } catch (IllegalArgumentException ex) { diff --git a/engine/src/test/jme3test/app/TestReleaseDirectMemory.java b/engine/src/test/jme3test/app/TestReleaseDirectMemory.java index 7446919a7..84a58ae16 100644 --- a/engine/src/test/jme3test/app/TestReleaseDirectMemory.java +++ b/engine/src/test/jme3test/app/TestReleaseDirectMemory.java @@ -39,6 +39,7 @@ import com.jme3.scene.Geometry; import com.jme3.scene.shape.Box; import com.jme3.util.BufferUtils; import java.nio.ByteBuffer; +import java.nio.FloatBuffer; public class TestReleaseDirectMemory extends SimpleApplication { @@ -61,6 +62,9 @@ public class TestReleaseDirectMemory extends SimpleApplication { public void simpleUpdate(float tpf) { ByteBuffer buf = BufferUtils.createByteBuffer(500000); BufferUtils.destroyDirectBuffer(buf); + + FloatBuffer buf2 = BufferUtils.createFloatBuffer(500000); + BufferUtils.destroyDirectBuffer(buf2); } }