diff --git a/ReactAndroid/src/main/java/com/facebook/yoga/YogaNative.java b/ReactAndroid/src/main/java/com/facebook/yoga/YogaNative.java index c9ebfd1319..8d7cc50435 100644 --- a/ReactAndroid/src/main/java/com/facebook/yoga/YogaNative.java +++ b/ReactAndroid/src/main/java/com/facebook/yoga/YogaNative.java @@ -125,6 +125,9 @@ public class YogaNative { static native void jni_YGConfigSetShouldDiffLayoutWithoutLegacyStretchBehaviourJNI(long nativePointer, boolean shouldDiffLayoutWithoutLegacyStretchBehaviour); // static native void jni_YGConfigSetLoggerJNI(long nativePointer, Object logger); + // YGNode related + static native long jni_YGNodeNewJNI(); + static native long jni_YGNodeNewWithConfigJNI(long configPointer); static native void jni_YGNodeFreeJNI(long nativePointer); static native void jni_YGNodeResetJNI(long nativePointer); static native void jni_YGNodeInsertChildJNI(long nativePointer, long childPointer, int index); diff --git a/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeFactory.java b/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeFactory.java index 6e292826f3..cf015f383a 100644 --- a/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeFactory.java +++ b/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeFactory.java @@ -5,6 +5,10 @@ public abstract class YogaNodeFactory { return new YogaNodeJNIFinalizer(); } + public static YogaNode create(boolean useVanillaJNI) { + return new YogaNodeJNIFinalizer(useVanillaJNI); + } + public static YogaNode create(YogaConfig config) { return new YogaNodeJNIFinalizer(config); } diff --git a/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeJNIBase.java b/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeJNIBase.java index 57c9716c38..dba6032344 100644 --- a/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeJNIBase.java +++ b/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeJNIBase.java @@ -59,8 +59,12 @@ public abstract class YogaNodeJNIBase extends YogaNode implements Cloneable { this(YogaNative.jni_YGNodeNew()); } + YogaNodeJNIBase(boolean useVanillaJNI) { + this(useVanillaJNI ? YogaNative.jni_YGNodeNewJNI() : YogaNative.jni_YGNodeNew()); + } + YogaNodeJNIBase(YogaConfig config) { - this(YogaNative.jni_YGNodeNewWithConfig(((YogaConfigJNIBase)config).mNativePointer)); + this(config.useVanillaJNI() ? YogaNative.jni_YGNodeNewWithConfigJNI(((YogaConfigJNIBase)config).mNativePointer) : YogaNative.jni_YGNodeNewWithConfig(((YogaConfigJNIBase)config).mNativePointer)); this.useVanillaJNI = config.useVanillaJNI(); } diff --git a/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeJNIFinalizer.java b/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeJNIFinalizer.java index 41986c25a0..0472998bef 100644 --- a/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeJNIFinalizer.java +++ b/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeJNIFinalizer.java @@ -11,6 +11,10 @@ public class YogaNodeJNIFinalizer extends YogaNodeJNIBase { super(); } + public YogaNodeJNIFinalizer(boolean useVanillaJNI) { + super(useVanillaJNI); + } + public YogaNodeJNIFinalizer(YogaConfig config) { super(config); } diff --git a/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNIVanilla.cpp b/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNIVanilla.cpp index eea7de8691..f6b657af97 100644 --- a/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNIVanilla.cpp +++ b/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNIVanilla.cpp @@ -12,6 +12,7 @@ #include "common.h" #include "YGJTypesVanilla.h" #include +#include using namespace facebook::yoga::vanillajni; using facebook::yoga::detail::Log; @@ -90,6 +91,18 @@ static void jni_YGConfigSetPointScaleFactorJNI( YGConfigSetPointScaleFactor(config, pixelsInPoint); } +static void YGPrint(YGNodeRef node, void* layoutContext) { + if (auto obj = YGNodeJobject(node, layoutContext)) { + // TODO cout << obj.get()->toString() << endl; + } else { + Log::log( + node, + YGLogLevelError, + nullptr, + "Java YGNode was GCed during layout calculation\n"); + } +} + static void jni_YGConfigSetUseLegacyStretchBehaviourJNI( JNIEnv* env, jobject obj, @@ -99,6 +112,22 @@ static void jni_YGConfigSetUseLegacyStretchBehaviourJNI( YGConfigSetUseLegacyStretchBehaviour(config, useLegacyStretchBehaviour); } +static jlong jni_YGNodeNewJNI(JNIEnv* env, jobject obj) { + const YGNodeRef node = YGNodeNew(); + node->setContext(YGNodeContext{}.asVoidPtr); + node->setPrintFunc(YGPrint); + return reinterpret_cast(node); +} + +static jlong jni_YGNodeNewWithConfigJNI( + JNIEnv* env, + jobject obj, + jlong configPointer) { + const YGNodeRef node = YGNodeNewWithConfig(_jlong2YGConfigRef(configPointer)); + node->setContext(YGNodeContext{}.asVoidPtr); + return reinterpret_cast(node); +} + static void jni_YGNodeFreeJNI(JNIEnv* env, jobject obj, jlong nativePointer) { if (nativePointer == 0) { return; @@ -558,6 +587,8 @@ static JNINativeMethod methods[] = { "(JZ)V", (void*) jni_YGConfigSetShouldDiffLayoutWithoutLegacyStretchBehaviourJNI}, // {"jni_YGConfigSetLoggerJNI", "(JO)V", (void*) jni_YGConfigSetLoggerJNI}, + {"jni_YGNodeNewJNI", "()J", (void*) jni_YGNodeNewJNI}, + {"jni_YGNodeNewWithConfigJNI", "(J)J", (void*) jni_YGNodeNewWithConfigJNI}, {"jni_YGNodeFreeJNI", "(J)V", (void*) jni_YGNodeFreeJNI}, {"jni_YGNodeResetJNI", "(J)V", (void*) jni_YGNodeResetJNI}, {"jni_YGNodeInsertChildJNI", "(JJI)V", (void*) jni_YGNodeInsertChildJNI},