From 4edf262021d3a0a2e2062bdd31db695d76a6e94e Mon Sep 17 00:00:00 2001 From: "PSp..om" Date: Wed, 1 Feb 2012 22:59:36 +0000 Subject: [PATCH] Fixed FloatBuffer support as well as other buffers that are views of other buffers and follow the same conventions. git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9127 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- engine/src/core/com/jme3/util/BufferUtils.java | 18 +++++++++++++++--- .../jme3test/app/TestReleaseDirectMemory.java | 4 ++++ 2 files changed, 19 insertions(+), 3 deletions(-) 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); } }