Loading core/java/android/view/RenderNodeAnimator.java +15 −20 Original line number Original line Diff line number Diff line Loading @@ -21,6 +21,8 @@ import android.graphics.CanvasProperty; import android.graphics.Paint; import android.graphics.Paint; import android.util.SparseIntArray; import android.util.SparseIntArray; import com.android.internal.util.VirtualRefBasePtr; import java.lang.ref.WeakReference; import java.lang.ref.WeakReference; /** /** Loading Loading @@ -70,28 +72,32 @@ public final class RenderNodeAnimator { public static final int DELTA_TYPE_DELTA = 1; public static final int DELTA_TYPE_DELTA = 1; private RenderNode mTarget; private RenderNode mTarget; private long mNativePtr; private VirtualRefBasePtr mNativePtr; public int mapViewPropertyToRenderProperty(int viewProperty) { public int mapViewPropertyToRenderProperty(int viewProperty) { return sViewPropertyAnimatorMap.get(viewProperty); return sViewPropertyAnimatorMap.get(viewProperty); } } public RenderNodeAnimator(int property, int deltaType, float deltaValue) { public RenderNodeAnimator(int property, int deltaType, float deltaValue) { mNativePtr = nCreateAnimator(new WeakReference<RenderNodeAnimator>(this), init(nCreateAnimator(new WeakReference<RenderNodeAnimator>(this), property, deltaType, deltaValue); property, deltaType, deltaValue)); } } public RenderNodeAnimator(CanvasProperty<Float> property, int deltaType, float deltaValue) { public RenderNodeAnimator(CanvasProperty<Float> property, int deltaType, float deltaValue) { mNativePtr = nCreateCanvasPropertyFloatAnimator( init(nCreateCanvasPropertyFloatAnimator( new WeakReference<RenderNodeAnimator>(this), new WeakReference<RenderNodeAnimator>(this), property.getNativeContainer(), deltaType, deltaValue); property.getNativeContainer(), deltaType, deltaValue)); } } public RenderNodeAnimator(CanvasProperty<Paint> property, int paintField, public RenderNodeAnimator(CanvasProperty<Paint> property, int paintField, int deltaType, float deltaValue) { int deltaType, float deltaValue) { mNativePtr = nCreateCanvasPropertyPaintAnimator( init(nCreateCanvasPropertyPaintAnimator( new WeakReference<RenderNodeAnimator>(this), 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) { public void start(View target) { Loading @@ -115,11 +121,11 @@ public final class RenderNodeAnimator { } } public void setDuration(int duration) { public void setDuration(int duration) { nSetDuration(mNativePtr, duration); nSetDuration(mNativePtr.get(), duration); } } long getNativeAnimator() { long getNativeAnimator() { return mNativePtr; return mNativePtr.get(); } } private void onFinished() { 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, private static native long nCreateAnimator(WeakReference<RenderNodeAnimator> weakThis, int property, int deltaValueType, float deltaValue); int property, int deltaValueType, float deltaValue); private static native long nCreateCanvasPropertyFloatAnimator(WeakReference<RenderNodeAnimator> weakThis, 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, private static native long nCreateCanvasPropertyPaintAnimator(WeakReference<RenderNodeAnimator> weakThis, long canvasProperty, int paintField, int deltaValueType, float deltaValue); long canvasProperty, int paintField, int deltaValueType, float deltaValue); private static native void nSetDuration(long nativePtr, int duration); 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 Original line Diff line number Diff line Loading @@ -13,22 +13,35 @@ * See the License for the specific language governing permissions and * See the License for the specific language governing permissions and * limitations under the License. * 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 public long get() { // destructor to eliminate the template requirement of LightRefBase return mNativePtr; class VirtualLightRefBase : public LightRefBase<VirtualLightRefBase> { } public: virtual ~VirtualLightRefBase() {} }; } /* namespace uirenderer */ @Override } /* namespace android */ 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 Original line Diff line number Diff line Loading @@ -155,7 +155,8 @@ LOCAL_SRC_FILES:= \ android_content_res_Configuration.cpp \ android_content_res_Configuration.cpp \ android_animation_PropertyValuesHolder.cpp \ android_animation_PropertyValuesHolder.cpp \ com_android_internal_net_NetworkStatsFactory.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 += \ LOCAL_C_INCLUDES += \ $(JNI_H_INCLUDE) \ $(JNI_H_INCLUDE) \ Loading core/jni/AndroidRuntime.cpp +2 −0 Original line number Original line 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_content_NativeLibraryHelper(JNIEnv *env); extern int register_com_android_internal_net_NetworkStatsFactory(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_os_Zygote(JNIEnv *env); extern int register_com_android_internal_util_VirtualRefBasePtr(JNIEnv *env); static AndroidRuntime* gCurRuntime = NULL; static AndroidRuntime* gCurRuntime = NULL; Loading Loading @@ -1262,6 +1263,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_os_MemoryFile), REG_JNI(register_android_os_MemoryFile), REG_JNI(register_com_android_internal_os_ZygoteInit), REG_JNI(register_com_android_internal_os_ZygoteInit), REG_JNI(register_com_android_internal_os_Zygote), 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_Camera), REG_JNI(register_android_hardware_camera2_CameraMetadata), REG_JNI(register_android_hardware_camera2_CameraMetadata), REG_JNI(register_android_hardware_SensorManager), REG_JNI(register_android_hardware_SensorManager), Loading core/jni/android/graphics/CanvasProperty.cpp +3 −13 Original line number Original line Diff line number Diff line Loading @@ -18,7 +18,7 @@ #include "GraphicsJNI.h" #include "GraphicsJNI.h" #include <android_runtime/AndroidRuntime.h> #include <android_runtime/AndroidRuntime.h> #include <utils/VirtualLightRefBase.h> #include <utils/RefBase.h> #include <CanvasProperty.h> #include <CanvasProperty.h> namespace android { namespace android { Loading @@ -27,22 +27,13 @@ using namespace uirenderer; #ifdef USE_OPENGL_RENDERER #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) { 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) { static jlong createPaint(JNIEnv* env, jobject clazz, jlong paintPtr) { const SkPaint* paint = reinterpret_cast<const SkPaint*>(paintPtr); const SkPaint* paint = reinterpret_cast<const SkPaint*>(paintPtr); return incRef(new CanvasPropertyPaint(*paint)); return reinterpret_cast<jlong>(new CanvasPropertyPaint(*paint)); } static void unref(JNIEnv* env, jobject clazz, jlong containerPtr) { reinterpret_cast<VirtualLightRefBase*>(containerPtr)->decStrong(0); } } #endif #endif Loading @@ -57,7 +48,6 @@ static JNINativeMethod gMethods[] = { #ifdef USE_OPENGL_RENDERER #ifdef USE_OPENGL_RENDERER { "nCreateFloat", "(F)J", (void*) createFloat }, { "nCreateFloat", "(F)J", (void*) createFloat }, { "nCreatePaint", "(J)J", (void*) createPaint }, { "nCreatePaint", "(J)J", (void*) createPaint }, { "nUnref", "(J)V", (void*) unref }, #endif #endif }; }; Loading Loading
core/java/android/view/RenderNodeAnimator.java +15 −20 Original line number Original line Diff line number Diff line Loading @@ -21,6 +21,8 @@ import android.graphics.CanvasProperty; import android.graphics.Paint; import android.graphics.Paint; import android.util.SparseIntArray; import android.util.SparseIntArray; import com.android.internal.util.VirtualRefBasePtr; import java.lang.ref.WeakReference; import java.lang.ref.WeakReference; /** /** Loading Loading @@ -70,28 +72,32 @@ public final class RenderNodeAnimator { public static final int DELTA_TYPE_DELTA = 1; public static final int DELTA_TYPE_DELTA = 1; private RenderNode mTarget; private RenderNode mTarget; private long mNativePtr; private VirtualRefBasePtr mNativePtr; public int mapViewPropertyToRenderProperty(int viewProperty) { public int mapViewPropertyToRenderProperty(int viewProperty) { return sViewPropertyAnimatorMap.get(viewProperty); return sViewPropertyAnimatorMap.get(viewProperty); } } public RenderNodeAnimator(int property, int deltaType, float deltaValue) { public RenderNodeAnimator(int property, int deltaType, float deltaValue) { mNativePtr = nCreateAnimator(new WeakReference<RenderNodeAnimator>(this), init(nCreateAnimator(new WeakReference<RenderNodeAnimator>(this), property, deltaType, deltaValue); property, deltaType, deltaValue)); } } public RenderNodeAnimator(CanvasProperty<Float> property, int deltaType, float deltaValue) { public RenderNodeAnimator(CanvasProperty<Float> property, int deltaType, float deltaValue) { mNativePtr = nCreateCanvasPropertyFloatAnimator( init(nCreateCanvasPropertyFloatAnimator( new WeakReference<RenderNodeAnimator>(this), new WeakReference<RenderNodeAnimator>(this), property.getNativeContainer(), deltaType, deltaValue); property.getNativeContainer(), deltaType, deltaValue)); } } public RenderNodeAnimator(CanvasProperty<Paint> property, int paintField, public RenderNodeAnimator(CanvasProperty<Paint> property, int paintField, int deltaType, float deltaValue) { int deltaType, float deltaValue) { mNativePtr = nCreateCanvasPropertyPaintAnimator( init(nCreateCanvasPropertyPaintAnimator( new WeakReference<RenderNodeAnimator>(this), 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) { public void start(View target) { Loading @@ -115,11 +121,11 @@ public final class RenderNodeAnimator { } } public void setDuration(int duration) { public void setDuration(int duration) { nSetDuration(mNativePtr, duration); nSetDuration(mNativePtr.get(), duration); } } long getNativeAnimator() { long getNativeAnimator() { return mNativePtr; return mNativePtr.get(); } } private void onFinished() { 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, private static native long nCreateAnimator(WeakReference<RenderNodeAnimator> weakThis, int property, int deltaValueType, float deltaValue); int property, int deltaValueType, float deltaValue); private static native long nCreateCanvasPropertyFloatAnimator(WeakReference<RenderNodeAnimator> weakThis, 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, private static native long nCreateCanvasPropertyPaintAnimator(WeakReference<RenderNodeAnimator> weakThis, long canvasProperty, int paintField, int deltaValueType, float deltaValue); long canvasProperty, int paintField, int deltaValueType, float deltaValue); private static native void nSetDuration(long nativePtr, int duration); 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 Original line Diff line number Diff line Loading @@ -13,22 +13,35 @@ * See the License for the specific language governing permissions and * See the License for the specific language governing permissions and * limitations under the License. * 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 public long get() { // destructor to eliminate the template requirement of LightRefBase return mNativePtr; class VirtualLightRefBase : public LightRefBase<VirtualLightRefBase> { } public: virtual ~VirtualLightRefBase() {} }; } /* namespace uirenderer */ @Override } /* namespace android */ 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 Original line Diff line number Diff line Loading @@ -155,7 +155,8 @@ LOCAL_SRC_FILES:= \ android_content_res_Configuration.cpp \ android_content_res_Configuration.cpp \ android_animation_PropertyValuesHolder.cpp \ android_animation_PropertyValuesHolder.cpp \ com_android_internal_net_NetworkStatsFactory.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 += \ LOCAL_C_INCLUDES += \ $(JNI_H_INCLUDE) \ $(JNI_H_INCLUDE) \ Loading
core/jni/AndroidRuntime.cpp +2 −0 Original line number Original line 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_content_NativeLibraryHelper(JNIEnv *env); extern int register_com_android_internal_net_NetworkStatsFactory(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_os_Zygote(JNIEnv *env); extern int register_com_android_internal_util_VirtualRefBasePtr(JNIEnv *env); static AndroidRuntime* gCurRuntime = NULL; static AndroidRuntime* gCurRuntime = NULL; Loading Loading @@ -1262,6 +1263,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_os_MemoryFile), REG_JNI(register_android_os_MemoryFile), REG_JNI(register_com_android_internal_os_ZygoteInit), REG_JNI(register_com_android_internal_os_ZygoteInit), REG_JNI(register_com_android_internal_os_Zygote), 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_Camera), REG_JNI(register_android_hardware_camera2_CameraMetadata), REG_JNI(register_android_hardware_camera2_CameraMetadata), REG_JNI(register_android_hardware_SensorManager), REG_JNI(register_android_hardware_SensorManager), Loading
core/jni/android/graphics/CanvasProperty.cpp +3 −13 Original line number Original line Diff line number Diff line Loading @@ -18,7 +18,7 @@ #include "GraphicsJNI.h" #include "GraphicsJNI.h" #include <android_runtime/AndroidRuntime.h> #include <android_runtime/AndroidRuntime.h> #include <utils/VirtualLightRefBase.h> #include <utils/RefBase.h> #include <CanvasProperty.h> #include <CanvasProperty.h> namespace android { namespace android { Loading @@ -27,22 +27,13 @@ using namespace uirenderer; #ifdef USE_OPENGL_RENDERER #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) { 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) { static jlong createPaint(JNIEnv* env, jobject clazz, jlong paintPtr) { const SkPaint* paint = reinterpret_cast<const SkPaint*>(paintPtr); const SkPaint* paint = reinterpret_cast<const SkPaint*>(paintPtr); return incRef(new CanvasPropertyPaint(*paint)); return reinterpret_cast<jlong>(new CanvasPropertyPaint(*paint)); } static void unref(JNIEnv* env, jobject clazz, jlong containerPtr) { reinterpret_cast<VirtualLightRefBase*>(containerPtr)->decStrong(0); } } #endif #endif Loading @@ -57,7 +48,6 @@ static JNINativeMethod gMethods[] = { #ifdef USE_OPENGL_RENDERER #ifdef USE_OPENGL_RENDERER { "nCreateFloat", "(F)J", (void*) createFloat }, { "nCreateFloat", "(F)J", (void*) createFloat }, { "nCreatePaint", "(J)J", (void*) createPaint }, { "nCreatePaint", "(J)J", (void*) createPaint }, { "nUnref", "(J)V", (void*) unref }, #endif #endif }; }; Loading