Loading core/java/android/view/RenderNodeAnimator.java +15 −20 Original line number Diff line number Diff line Loading @@ -21,6 +21,8 @@ import android.graphics.CanvasProperty; import android.graphics.Paint; import android.util.SparseIntArray; import com.android.internal.util.VirtualRefBasePtr; import java.lang.ref.WeakReference; /** Loading Loading @@ -70,28 +72,32 @@ public final class RenderNodeAnimator { public static final int DELTA_TYPE_DELTA = 1; private RenderNode mTarget; private long mNativePtr; private VirtualRefBasePtr mNativePtr; public int mapViewPropertyToRenderProperty(int viewProperty) { return sViewPropertyAnimatorMap.get(viewProperty); } public RenderNodeAnimator(int property, int deltaType, float deltaValue) { mNativePtr = nCreateAnimator(new WeakReference<RenderNodeAnimator>(this), property, deltaType, deltaValue); init(nCreateAnimator(new WeakReference<RenderNodeAnimator>(this), property, deltaType, deltaValue)); } public RenderNodeAnimator(CanvasProperty<Float> property, int deltaType, float deltaValue) { mNativePtr = nCreateCanvasPropertyFloatAnimator( init(nCreateCanvasPropertyFloatAnimator( new WeakReference<RenderNodeAnimator>(this), property.getNativeContainer(), deltaType, deltaValue); property.getNativeContainer(), deltaType, deltaValue)); } public RenderNodeAnimator(CanvasProperty<Paint> property, int paintField, int deltaType, float deltaValue) { mNativePtr = nCreateCanvasPropertyPaintAnimator( init(nCreateCanvasPropertyPaintAnimator( new WeakReference<RenderNodeAnimator>(this), property.getNativeContainer(), paintField, deltaType, deltaValue); property.getNativeContainer(), paintField, deltaType, deltaValue)); } private void init(long ptr) { mNativePtr = new VirtualRefBasePtr(ptr); } public void start(View target) { Loading @@ -115,11 +121,11 @@ public final class RenderNodeAnimator { } public void setDuration(int duration) { nSetDuration(mNativePtr, duration); nSetDuration(mNativePtr.get(), duration); } long getNativeAnimator() { return mNativePtr; return mNativePtr.get(); } private void onFinished() { Loading @@ -134,16 +140,6 @@ public final class RenderNodeAnimator { } } @Override protected void finalize() throws Throwable { try { nUnref(mNativePtr); mNativePtr = 0; } finally { super.finalize(); } } private static native long nCreateAnimator(WeakReference<RenderNodeAnimator> weakThis, int property, int deltaValueType, float deltaValue); private static native long nCreateCanvasPropertyFloatAnimator(WeakReference<RenderNodeAnimator> weakThis, Loading @@ -151,5 +147,4 @@ public final class RenderNodeAnimator { private static native long nCreateCanvasPropertyPaintAnimator(WeakReference<RenderNodeAnimator> weakThis, long canvasProperty, int paintField, int deltaValueType, float deltaValue); private static native void nSetDuration(long nativePtr, int duration); private static native void nUnref(long nativePtr); } libs/hwui/utils/VirtualLightRefBase.h→core/java/com/android/internal/util/VirtualRefBasePtr.java +47 −0 Original line number Diff line number Diff line Loading @@ -13,22 +13,35 @@ * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef VIRTUALLIGHTREFBASE_H #define VIRTUALLIGHTREFBASE_H #include <utils/RefBase.h> package com.android.internal.util; namespace android { namespace uirenderer { /** * Helper class that contains a strong reference to a VirtualRefBase native * object. This will incStrong in the ctor, and decStrong in the finalizer */ public final class VirtualRefBasePtr { private long mNativePtr; public VirtualRefBasePtr(long ptr) { mNativePtr = ptr; nIncStrong(mNativePtr); } // This is a wrapper around LightRefBase that simply enforces a virtual // destructor to eliminate the template requirement of LightRefBase class VirtualLightRefBase : public LightRefBase<VirtualLightRefBase> { public: virtual ~VirtualLightRefBase() {} }; public long get() { return mNativePtr; } } /* namespace uirenderer */ } /* namespace android */ @Override protected void finalize() throws Throwable { try { nDecStrong(mNativePtr); mNativePtr = 0; } finally { super.finalize(); } } #endif /* VIRTUALLIGHTREFBASE_H */ private static native void nIncStrong(long ptr); private static native void nDecStrong(long ptr); } core/jni/Android.mk +2 −1 Original line number Diff line number Diff line Loading @@ -155,7 +155,8 @@ LOCAL_SRC_FILES:= \ android_content_res_Configuration.cpp \ android_animation_PropertyValuesHolder.cpp \ com_android_internal_net_NetworkStatsFactory.cpp \ com_android_internal_os_Zygote.cpp com_android_internal_os_Zygote.cpp \ com_android_internal_util_VirtualRefBasePtr.cpp LOCAL_C_INCLUDES += \ $(JNI_H_INCLUDE) \ Loading core/jni/AndroidRuntime.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -181,6 +181,7 @@ extern int register_android_animation_PropertyValuesHolder(JNIEnv *env); extern int register_com_android_internal_content_NativeLibraryHelper(JNIEnv *env); extern int register_com_android_internal_net_NetworkStatsFactory(JNIEnv *env); extern int register_com_android_internal_os_Zygote(JNIEnv *env); extern int register_com_android_internal_util_VirtualRefBasePtr(JNIEnv *env); static AndroidRuntime* gCurRuntime = NULL; Loading Loading @@ -1262,6 +1263,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_os_MemoryFile), REG_JNI(register_com_android_internal_os_ZygoteInit), REG_JNI(register_com_android_internal_os_Zygote), REG_JNI(register_com_android_internal_util_VirtualRefBasePtr), REG_JNI(register_android_hardware_Camera), REG_JNI(register_android_hardware_camera2_CameraMetadata), REG_JNI(register_android_hardware_SensorManager), Loading core/jni/android/graphics/CanvasProperty.cpp +3 −13 Original line number Diff line number Diff line Loading @@ -18,7 +18,7 @@ #include "GraphicsJNI.h" #include <android_runtime/AndroidRuntime.h> #include <utils/VirtualLightRefBase.h> #include <utils/RefBase.h> #include <CanvasProperty.h> namespace android { Loading @@ -27,22 +27,13 @@ using namespace uirenderer; #ifdef USE_OPENGL_RENDERER static jlong incRef(VirtualLightRefBase* ptr) { ptr->incStrong(0); return reinterpret_cast<jlong>(ptr); } static jlong createFloat(JNIEnv* env, jobject clazz, jfloat initialValue) { return incRef(new CanvasPropertyPrimitive(initialValue)); return reinterpret_cast<jlong>(new CanvasPropertyPrimitive(initialValue)); } static jlong createPaint(JNIEnv* env, jobject clazz, jlong paintPtr) { const SkPaint* paint = reinterpret_cast<const SkPaint*>(paintPtr); return incRef(new CanvasPropertyPaint(*paint)); } static void unref(JNIEnv* env, jobject clazz, jlong containerPtr) { reinterpret_cast<VirtualLightRefBase*>(containerPtr)->decStrong(0); return reinterpret_cast<jlong>(new CanvasPropertyPaint(*paint)); } #endif Loading @@ -57,7 +48,6 @@ static JNINativeMethod gMethods[] = { #ifdef USE_OPENGL_RENDERER { "nCreateFloat", "(F)J", (void*) createFloat }, { "nCreatePaint", "(J)J", (void*) createPaint }, { "nUnref", "(J)V", (void*) unref }, #endif }; Loading Loading
core/java/android/view/RenderNodeAnimator.java +15 −20 Original line number Diff line number Diff line Loading @@ -21,6 +21,8 @@ import android.graphics.CanvasProperty; import android.graphics.Paint; import android.util.SparseIntArray; import com.android.internal.util.VirtualRefBasePtr; import java.lang.ref.WeakReference; /** Loading Loading @@ -70,28 +72,32 @@ public final class RenderNodeAnimator { public static final int DELTA_TYPE_DELTA = 1; private RenderNode mTarget; private long mNativePtr; private VirtualRefBasePtr mNativePtr; public int mapViewPropertyToRenderProperty(int viewProperty) { return sViewPropertyAnimatorMap.get(viewProperty); } public RenderNodeAnimator(int property, int deltaType, float deltaValue) { mNativePtr = nCreateAnimator(new WeakReference<RenderNodeAnimator>(this), property, deltaType, deltaValue); init(nCreateAnimator(new WeakReference<RenderNodeAnimator>(this), property, deltaType, deltaValue)); } public RenderNodeAnimator(CanvasProperty<Float> property, int deltaType, float deltaValue) { mNativePtr = nCreateCanvasPropertyFloatAnimator( init(nCreateCanvasPropertyFloatAnimator( new WeakReference<RenderNodeAnimator>(this), property.getNativeContainer(), deltaType, deltaValue); property.getNativeContainer(), deltaType, deltaValue)); } public RenderNodeAnimator(CanvasProperty<Paint> property, int paintField, int deltaType, float deltaValue) { mNativePtr = nCreateCanvasPropertyPaintAnimator( init(nCreateCanvasPropertyPaintAnimator( new WeakReference<RenderNodeAnimator>(this), property.getNativeContainer(), paintField, deltaType, deltaValue); property.getNativeContainer(), paintField, deltaType, deltaValue)); } private void init(long ptr) { mNativePtr = new VirtualRefBasePtr(ptr); } public void start(View target) { Loading @@ -115,11 +121,11 @@ public final class RenderNodeAnimator { } public void setDuration(int duration) { nSetDuration(mNativePtr, duration); nSetDuration(mNativePtr.get(), duration); } long getNativeAnimator() { return mNativePtr; return mNativePtr.get(); } private void onFinished() { Loading @@ -134,16 +140,6 @@ public final class RenderNodeAnimator { } } @Override protected void finalize() throws Throwable { try { nUnref(mNativePtr); mNativePtr = 0; } finally { super.finalize(); } } private static native long nCreateAnimator(WeakReference<RenderNodeAnimator> weakThis, int property, int deltaValueType, float deltaValue); private static native long nCreateCanvasPropertyFloatAnimator(WeakReference<RenderNodeAnimator> weakThis, Loading @@ -151,5 +147,4 @@ public final class RenderNodeAnimator { private static native long nCreateCanvasPropertyPaintAnimator(WeakReference<RenderNodeAnimator> weakThis, long canvasProperty, int paintField, int deltaValueType, float deltaValue); private static native void nSetDuration(long nativePtr, int duration); private static native void nUnref(long nativePtr); }
libs/hwui/utils/VirtualLightRefBase.h→core/java/com/android/internal/util/VirtualRefBasePtr.java +47 −0 Original line number Diff line number Diff line Loading @@ -13,22 +13,35 @@ * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef VIRTUALLIGHTREFBASE_H #define VIRTUALLIGHTREFBASE_H #include <utils/RefBase.h> package com.android.internal.util; namespace android { namespace uirenderer { /** * Helper class that contains a strong reference to a VirtualRefBase native * object. This will incStrong in the ctor, and decStrong in the finalizer */ public final class VirtualRefBasePtr { private long mNativePtr; public VirtualRefBasePtr(long ptr) { mNativePtr = ptr; nIncStrong(mNativePtr); } // This is a wrapper around LightRefBase that simply enforces a virtual // destructor to eliminate the template requirement of LightRefBase class VirtualLightRefBase : public LightRefBase<VirtualLightRefBase> { public: virtual ~VirtualLightRefBase() {} }; public long get() { return mNativePtr; } } /* namespace uirenderer */ } /* namespace android */ @Override protected void finalize() throws Throwable { try { nDecStrong(mNativePtr); mNativePtr = 0; } finally { super.finalize(); } } #endif /* VIRTUALLIGHTREFBASE_H */ private static native void nIncStrong(long ptr); private static native void nDecStrong(long ptr); }
core/jni/Android.mk +2 −1 Original line number Diff line number Diff line Loading @@ -155,7 +155,8 @@ LOCAL_SRC_FILES:= \ android_content_res_Configuration.cpp \ android_animation_PropertyValuesHolder.cpp \ com_android_internal_net_NetworkStatsFactory.cpp \ com_android_internal_os_Zygote.cpp com_android_internal_os_Zygote.cpp \ com_android_internal_util_VirtualRefBasePtr.cpp LOCAL_C_INCLUDES += \ $(JNI_H_INCLUDE) \ Loading
core/jni/AndroidRuntime.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -181,6 +181,7 @@ extern int register_android_animation_PropertyValuesHolder(JNIEnv *env); extern int register_com_android_internal_content_NativeLibraryHelper(JNIEnv *env); extern int register_com_android_internal_net_NetworkStatsFactory(JNIEnv *env); extern int register_com_android_internal_os_Zygote(JNIEnv *env); extern int register_com_android_internal_util_VirtualRefBasePtr(JNIEnv *env); static AndroidRuntime* gCurRuntime = NULL; Loading Loading @@ -1262,6 +1263,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_os_MemoryFile), REG_JNI(register_com_android_internal_os_ZygoteInit), REG_JNI(register_com_android_internal_os_Zygote), REG_JNI(register_com_android_internal_util_VirtualRefBasePtr), REG_JNI(register_android_hardware_Camera), REG_JNI(register_android_hardware_camera2_CameraMetadata), REG_JNI(register_android_hardware_SensorManager), Loading
core/jni/android/graphics/CanvasProperty.cpp +3 −13 Original line number Diff line number Diff line Loading @@ -18,7 +18,7 @@ #include "GraphicsJNI.h" #include <android_runtime/AndroidRuntime.h> #include <utils/VirtualLightRefBase.h> #include <utils/RefBase.h> #include <CanvasProperty.h> namespace android { Loading @@ -27,22 +27,13 @@ using namespace uirenderer; #ifdef USE_OPENGL_RENDERER static jlong incRef(VirtualLightRefBase* ptr) { ptr->incStrong(0); return reinterpret_cast<jlong>(ptr); } static jlong createFloat(JNIEnv* env, jobject clazz, jfloat initialValue) { return incRef(new CanvasPropertyPrimitive(initialValue)); return reinterpret_cast<jlong>(new CanvasPropertyPrimitive(initialValue)); } static jlong createPaint(JNIEnv* env, jobject clazz, jlong paintPtr) { const SkPaint* paint = reinterpret_cast<const SkPaint*>(paintPtr); return incRef(new CanvasPropertyPaint(*paint)); } static void unref(JNIEnv* env, jobject clazz, jlong containerPtr) { reinterpret_cast<VirtualLightRefBase*>(containerPtr)->decStrong(0); return reinterpret_cast<jlong>(new CanvasPropertyPaint(*paint)); } #endif Loading @@ -57,7 +48,6 @@ static JNINativeMethod gMethods[] = { #ifdef USE_OPENGL_RENDERER { "nCreateFloat", "(F)J", (void*) createFloat }, { "nCreatePaint", "(J)J", (void*) createPaint }, { "nUnref", "(J)V", (void*) unref }, #endif }; Loading