فهرست منبع

Attempt to fix a direct memory deallocation crash on android

Nehon 7 سال پیش
والد
کامیت
2120c9d334
1فایلهای تغییر یافته به همراه15 افزوده شده و 4 حذف شده
  1. 15 4
      jme3-core/src/main/java/com/jme3/util/ReflectionAllocator.java

+ 15 - 4
jme3-core/src/main/java/com/jme3/util/ReflectionAllocator.java

@@ -149,10 +149,21 @@ public final class ReflectionAllocator implements BufferAllocator {
 							// first
 							Object viewedBuffer = localViewedBufferMethod.invoke(toBeDestroyed);
 							if (viewedBuffer != null) {
-								destroyDirectBuffer((Buffer) viewedBuffer);
-							} else {
-								Logger.getLogger(BufferUtils.class.getName()).log(Level.SEVERE,
-										"Buffer cannot be destroyed: {0}", toBeDestroyed);
+                                if (viewedBuffer instanceof Buffer) {
+                                    destroyDirectBuffer((Buffer) viewedBuffer);
+                                } else {
+                                    //on android there is an internal MemoryRef class that is returned and has a "free" method.
+                                    Method freeMethod = loadMethod(viewedBuffer.getClass().getName(), "free");
+                                    if (freeMethod != null) {
+                                        freeMethod.invoke(viewedBuffer);
+                                    } else {
+                                        Logger.getLogger(BufferUtils.class.getName()).log(Level.SEVERE,
+                                                "Buffer cannot be destroyed: {0}, {1}", new Object[]{toBeDestroyed, viewedBuffer});
+                                    }
+                                }
+                            } else {
+                                Logger.getLogger(BufferUtils.class.getName()).log(Level.SEVERE,
+                                        "Buffer cannot be destroyed: {0}", toBeDestroyed);
 							}
 						}
 					}