diff --git a/java/com/facebook/yoga/YogaNode.java b/java/com/facebook/yoga/YogaNode.java index f8b895b1..1565d4bb 100644 --- a/java/com/facebook/yoga/YogaNode.java +++ b/java/com/facebook/yoga/YogaNode.java @@ -175,6 +175,8 @@ public class YogaNode implements Cloneable { jni_YGNodeInsertSharedChild(mNativePointer, child.mNativePointer, i); } + private native void jni_YGNodeSetOwner(long nativePointer, long newOwnerNativePointer); + private native long jni_YGNodeClone(long nativePointer, Object newNode); @Override @@ -182,6 +184,14 @@ public class YogaNode implements Cloneable { try { YogaNode clonedYogaNode = (YogaNode) super.clone(); long clonedNativePointer = jni_YGNodeClone(mNativePointer, clonedYogaNode); + + if (mChildren != null) { + for (YogaNode child : mChildren) { + child.jni_YGNodeSetOwner(child.mNativePointer, 0); + child.mOwner = null; + } + } + clonedYogaNode.mNativePointer = clonedNativePointer; clonedYogaNode.mOwner = null; clonedYogaNode.mChildren = diff --git a/java/jni/YGJNI.cpp b/java/jni/YGJNI.cpp index 2bc0ee8b..5649ef7e 100644 --- a/java/jni/YGJNI.cpp +++ b/java/jni/YGJNI.cpp @@ -268,6 +268,16 @@ jlong jni_YGNodeNewWithConfig(alias_ref thiz, jlong configPointer) { return reinterpret_cast(node); } +void jni_YGNodeSetOwner( + alias_ref thiz, + jlong nativePointer, + jlong newOwnerNativePointer) { + const YGNodeRef node = _jlong2YGNodeRef(nativePointer); + const YGNodeRef newOwnerNode = _jlong2YGNodeRef(newOwnerNativePointer); + + node->setOwner(newOwnerNode); +} + jlong jni_YGNodeClone( alias_ref thiz, jlong nativePointer, @@ -667,6 +677,7 @@ jint JNI_OnLoad(JavaVM *vm, void *) { YGMakeNativeMethod(jni_YGNodeGetInstanceCount), YGMakeNativeMethod(jni_YGNodePrint), YGMakeNativeMethod(jni_YGNodeClone), + YGMakeNativeMethod(jni_YGNodeSetOwner), }); registerNatives( "com/facebook/yoga/YogaConfig", diff --git a/yoga/Yoga.cpp b/yoga/Yoga.cpp index 3c83ce08..e5d1aabb 100644 --- a/yoga/Yoga.cpp +++ b/yoga/Yoga.cpp @@ -244,9 +244,6 @@ YGNodeRef YGNodeClone(YGNodeRef oldNode) { oldNode->getConfig(), node != nullptr, "Could not allocate memory for node"); - for (auto &item : oldNode->getChildren()) { - item->setOwner(nullptr); - } gNodeInstanceCount++; node->setOwner(nullptr); return node;