Correctly use NativeAllocationRegistry for native objects
For native objects registered with NativeAllocationRegistry, call the
native free function to release the memory.
Bug: N/A
Test: layoutlib tests
Change-Id: I492c607335d1011126a725cb0a876b7866ebab61
diff --git a/bridge/src/android/view/SurfaceControl_Delegate.java b/bridge/src/android/view/SurfaceControl_Delegate.java
index 9cb0d5d..24838b2 100644
--- a/bridge/src/android/view/SurfaceControl_Delegate.java
+++ b/bridge/src/android/view/SurfaceControl_Delegate.java
@@ -26,9 +26,20 @@
// ---- delegate manager ----
private static final DelegateManager<SurfaceControl_Delegate> sManager =
new DelegateManager<>(SurfaceControl_Delegate.class);
+ private static long sFinalizer = -1;
@LayoutlibDelegate
/*package*/ static long nativeCreateTransaction() {
return sManager.addNewDelegate(new SurfaceControl_Delegate());
}
+
+ @LayoutlibDelegate
+ /*package*/ static long nativeGetNativeTransactionFinalizer() {
+ synchronized (SurfaceControl_Delegate.class) {
+ if (sFinalizer == -1) {
+ sFinalizer = NativeAllocationRegistry_Delegate.createFinalizer(sManager::removeJavaReferenceFor);
+ }
+ }
+ return sFinalizer;
+ }
}
diff --git a/bridge/src/com/android/layoutlib/bridge/impl/DelegateManager.java b/bridge/src/com/android/layoutlib/bridge/impl/DelegateManager.java
index 69325bd..398c260 100644
--- a/bridge/src/com/android/layoutlib/bridge/impl/DelegateManager.java
+++ b/bridge/src/com/android/layoutlib/bridge/impl/DelegateManager.java
@@ -122,7 +122,6 @@
}
}
- assert delegate != null;
//noinspection unchecked
return (T)delegate;
}
diff --git a/bridge/src/libcore/util/NativeAllocationRegistry_Delegate.java b/bridge/src/libcore/util/NativeAllocationRegistry_Delegate.java
index 04fabc2..857b4fe 100644
--- a/bridge/src/libcore/util/NativeAllocationRegistry_Delegate.java
+++ b/bridge/src/libcore/util/NativeAllocationRegistry_Delegate.java
@@ -59,6 +59,8 @@
NativeAllocationRegistry_Delegate delegate = sManager.getDelegate(freeFunction);
if (delegate != null) {
delegate.mFinalizer.free(nativePtr);
+ } else if (freeFunction != 0) {
+ nativeApplyFreeFunction(freeFunction, nativePtr);
}
} catch (Throwable ignore) {
}
@@ -67,4 +69,6 @@
public interface FreeFunction {
void free(long nativePtr);
}
+
+ private static native void nativeApplyFreeFunction(long freeFunction, long nativePtr);
}
diff --git a/common/src/com/android/tools/layoutlib/create/NativeConfig.java b/common/src/com/android/tools/layoutlib/create/NativeConfig.java
index 763bf7b..b50fa7a 100644
--- a/common/src/com/android/tools/layoutlib/create/NativeConfig.java
+++ b/common/src/com/android/tools/layoutlib/create/NativeConfig.java
@@ -58,6 +58,7 @@
"android.view.MotionEvent",
"android.view.Surface",
"com.android.internal.util.VirtualRefBasePtr",
+ "libcore.util.NativeAllocationRegistry_Delegate",
};
/**
diff --git a/create/src/com/android/tools/layoutlib/create/CreateInfo.java b/create/src/com/android/tools/layoutlib/create/CreateInfo.java
index 6f3f46d..bf7d952 100644
--- a/create/src/com/android/tools/layoutlib/create/CreateInfo.java
+++ b/create/src/com/android/tools/layoutlib/create/CreateInfo.java
@@ -252,6 +252,7 @@
"android.view.PointerIcon#loadResource",
"android.view.PointerIcon#registerDisplayListener",
"android.view.SurfaceControl#nativeCreateTransaction",
+ "android.view.SurfaceControl#nativeGetNativeTransactionFinalizer",
"android.view.TextureView#getTextureLayer",
"android.view.View#draw",
"android.view.View#dispatchDetachedFromWindow",