diff --git a/ReactAndroid/src/main/java/com/facebook/yoga/YogaNode.java b/ReactAndroid/src/main/java/com/facebook/yoga/YogaNode.java index 093d209d3..1a280dd8d 100644 --- a/ReactAndroid/src/main/java/com/facebook/yoga/YogaNode.java +++ b/ReactAndroid/src/main/java/com/facebook/yoga/YogaNode.java @@ -16,7 +16,7 @@ import java.util.List; import javax.annotation.Nullable; @DoNotStrip -public class YogaNode { +public class YogaNode implements Cloneable { static { SoLoader.loadLibrary("yoga"); @@ -31,7 +31,7 @@ public class YogaNode { private List mChildren; private YogaMeasureFunction mMeasureFunction; private YogaBaselineFunction mBaselineFunction; - private final long mNativePointer; + private long mNativePointer; private Object mData; /* Those flags needs be in sync with YGJNI.cpp */ @@ -160,6 +160,18 @@ public class YogaNode { jni_YGNodeInsertChild(mNativePointer, child.mNativePointer, i); } + private native long jni_YGNodeClone(long nativePointer, Object newNode); + + @Override + public YogaNode clone() throws CloneNotSupportedException { + YogaNode clonedYogaNode = (YogaNode) super.clone(); + long clonedNativePointer = jni_YGNodeClone(mNativePointer, clonedYogaNode); + clonedYogaNode.mNativePointer = clonedNativePointer; + clonedYogaNode.mChildren = + mChildren != null ? (List) ((ArrayList) mChildren).clone() : null; + return clonedYogaNode; + } + private native void jni_YGNodeRemoveChild(long nativePointer, long childPointer); public YogaNode removeChildAt(int i) { diff --git a/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNI.cpp b/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNI.cpp index 67042729b..b8cfe0a62 100644 --- a/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNI.cpp +++ b/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNI.cpp @@ -250,6 +250,16 @@ jlong jni_YGNodeNewWithConfig(alias_ref thiz, jlong configPointer) { return reinterpret_cast(node); } +jlong jni_YGNodeClone( + alias_ref thiz, + jlong nativePointer, + alias_ref clonedJavaObject) { + const YGNodeRef clonedYogaNode = YGNodeClone(_jlong2YGNodeRef(nativePointer)); + clonedYogaNode->setContext( + new weak_ref(make_weak(clonedJavaObject))); + return reinterpret_cast(clonedYogaNode); +} + void jni_YGNodeFree(alias_ref thiz, jlong nativePointer) { const YGNodeRef node = _jlong2YGNodeRef(nativePointer); delete YGNodeJobject(node); @@ -612,6 +622,7 @@ jint JNI_OnLoad(JavaVM *vm, void *) { YGMakeNativeMethod(jni_YGNodeStyleSetAspectRatio), YGMakeNativeMethod(jni_YGNodeGetInstanceCount), YGMakeNativeMethod(jni_YGNodePrint), + YGMakeNativeMethod(jni_YGNodeClone), }); registerNatives("com/facebook/yoga/YogaConfig", {