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",