From 339c5574b8f9b2c4763c05efe780c5f71f0fb971 Mon Sep 17 00:00:00 2001 From: David Aurelio Date: Thu, 22 Nov 2018 03:59:22 -0800 Subject: [PATCH] Dealloc JNI implementation experiment Summary: @public Remove ability to configure Yoga to run with/without JNI fast calls on dalvik / art. This switches to always run with fast calls. Reviewed By: astreet Differential Revision: D13144652 fbshipit-source-id: 091aab0cd1290d46346323d3e26a11dd0bb17187 --- java/com/facebook/yoga/YogaConfig.java | 3 +- java/com/facebook/yoga/YogaJNI.java | 32 ---- java/com/facebook/yoga/YogaNode.java | 3 +- java/jni/YGJNI.cpp | 224 +++++++++++-------------- 4 files changed, 106 insertions(+), 156 deletions(-) delete mode 100644 java/com/facebook/yoga/YogaJNI.java diff --git a/java/com/facebook/yoga/YogaConfig.java b/java/com/facebook/yoga/YogaConfig.java index 57561df7..40de7d2c 100644 --- a/java/com/facebook/yoga/YogaConfig.java +++ b/java/com/facebook/yoga/YogaConfig.java @@ -8,6 +8,7 @@ package com.facebook.yoga; import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.soloader.SoLoader; @DoNotStrip public class YogaConfig { @@ -15,7 +16,7 @@ public class YogaConfig { public static int SPACING_TYPE = 1; static { - YogaJNI.init(); + SoLoader.loadLibrary("yoga"); } long mNativePointer; diff --git a/java/com/facebook/yoga/YogaJNI.java b/java/com/facebook/yoga/YogaJNI.java deleted file mode 100644 index fb013804..00000000 --- a/java/com/facebook/yoga/YogaJNI.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the LICENSE - * file in the root directory of this source tree. - * - */ -package com.facebook.yoga; - -import com.facebook.soloader.SoLoader; - -public class YogaJNI { - private static boolean isInitialized = false; - - // Known constants. 1-3 used in previous experiments. Do not reuse. - public static int JNI_FAST_CALLS = 4; - - // set before loading any other Yoga code - public static boolean useFastCall = false; - - private static native void jni_bindNativeMethods(boolean useFastCall); - - static synchronized boolean init() { - if (!isInitialized) { - isInitialized = true; - SoLoader.loadLibrary("yoga"); - jni_bindNativeMethods(useFastCall); - return true; - } - return false; - } -} diff --git a/java/com/facebook/yoga/YogaNode.java b/java/com/facebook/yoga/YogaNode.java index f3d4a53a..7dd26947 100644 --- a/java/com/facebook/yoga/YogaNode.java +++ b/java/com/facebook/yoga/YogaNode.java @@ -8,6 +8,7 @@ package com.facebook.yoga; import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.soloader.SoLoader; import java.util.ArrayList; import java.util.List; import javax.annotation.Nullable; @@ -16,7 +17,7 @@ import javax.annotation.Nullable; public class YogaNode implements Cloneable { static { - YogaJNI.init(); + SoLoader.loadLibrary("yoga"); } /** diff --git a/java/jni/YGJNI.cpp b/java/jni/YGJNI.cpp index 7261a315..8c6536d4 100644 --- a/java/jni/YGJNI.cpp +++ b/java/jni/YGJNI.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. + * Copyright (c) 2018-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the LICENSE * file in the root directory of this source tree. @@ -658,132 +658,112 @@ jint jni_YGNodeGetInstanceCount() { } #define YGMakeNativeMethod(name) makeNativeMethod(#name, name) -#define YGRealMakeCriticalNativeMethod(name) \ - makeCriticalNativeMethod(#name, name) -#define YGWrapCriticalNativeMethodForRegularCall(name) \ - makeNativeMethod( \ - #name, \ - ::facebook::jni::detail::CriticalMethod::call<&name>) - -#define YGRegisterNatives(YGMakeCriticalNativeMethod) \ - registerNatives( \ - "com/facebook/yoga/YogaNode", \ - { \ - YGMakeNativeMethod(jni_YGNodeNew), \ - YGMakeNativeMethod(jni_YGNodeNewWithConfig), \ - YGMakeCriticalNativeMethod(jni_YGNodeFree), \ - YGMakeCriticalNativeMethod(jni_YGNodeReset), \ - YGMakeCriticalNativeMethod(jni_YGNodeClearChildren), \ - YGMakeCriticalNativeMethod(jni_YGNodeInsertChild), \ - YGMakeCriticalNativeMethod(jni_YGNodeInsertSharedChild), \ - YGMakeCriticalNativeMethod(jni_YGNodeRemoveChild), \ - YGMakeCriticalNativeMethod(jni_YGNodeSetIsReferenceBaseline), \ - YGMakeCriticalNativeMethod(jni_YGNodeIsReferenceBaseline), \ - YGMakeNativeMethod(jni_YGNodeCalculateLayout), \ - YGMakeCriticalNativeMethod(jni_YGNodeMarkDirty), \ - YGMakeCriticalNativeMethod( \ - jni_YGNodeMarkDirtyAndPropogateToDescendants), \ - YGMakeCriticalNativeMethod(jni_YGNodeIsDirty), \ - YGMakeCriticalNativeMethod(jni_YGNodeSetHasMeasureFunc), \ - YGMakeCriticalNativeMethod(jni_YGNodeSetHasBaselineFunc), \ - YGMakeCriticalNativeMethod(jni_YGNodeCopyStyle), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleGetDirection), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetDirection), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleGetFlexDirection), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetFlexDirection), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleGetJustifyContent), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetJustifyContent), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleGetAlignItems), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetAlignItems), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleGetAlignSelf), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetAlignSelf), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleGetAlignContent), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetAlignContent), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleGetPositionType), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetPositionType), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetFlexWrap), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleGetOverflow), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetOverflow), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleGetDisplay), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetDisplay), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetFlex), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleGetFlexGrow), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetFlexGrow), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleGetFlexShrink), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetFlexShrink), \ - YGMakeNativeMethod(jni_YGNodeStyleGetFlexBasis), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetFlexBasis), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetFlexBasisPercent), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetFlexBasisAuto), \ - YGMakeNativeMethod(jni_YGNodeStyleGetMargin), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetMargin), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetMarginPercent), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetMarginAuto), \ - YGMakeNativeMethod(jni_YGNodeStyleGetPadding), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetPadding), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetPaddingPercent), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleGetBorder), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetBorder), \ - YGMakeNativeMethod(jni_YGNodeStyleGetPosition), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetPosition), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetPositionPercent), \ - YGMakeNativeMethod(jni_YGNodeStyleGetWidth), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetWidth), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetWidthPercent), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetWidthAuto), \ - YGMakeNativeMethod(jni_YGNodeStyleGetHeight), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetHeight), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetHeightPercent), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetHeightAuto), \ - YGMakeNativeMethod(jni_YGNodeStyleGetMinWidth), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetMinWidth), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetMinWidthPercent), \ - YGMakeNativeMethod(jni_YGNodeStyleGetMinHeight), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetMinHeight), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetMinHeightPercent), \ - YGMakeNativeMethod(jni_YGNodeStyleGetMaxWidth), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetMaxWidth), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetMaxWidthPercent), \ - YGMakeNativeMethod(jni_YGNodeStyleGetMaxHeight), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetMaxHeight), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetMaxHeightPercent), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleGetAspectRatio), \ - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetAspectRatio), \ - YGMakeCriticalNativeMethod(jni_YGNodeGetInstanceCount), \ - YGMakeCriticalNativeMethod(jni_YGNodePrint), \ - YGMakeNativeMethod(jni_YGNodeClone), \ - YGMakeCriticalNativeMethod(jni_YGNodeSetOwner), \ - }); \ - registerNatives( \ - "com/facebook/yoga/YogaConfig", \ - { \ - YGMakeNativeMethod(jni_YGConfigNew), \ - YGMakeNativeMethod(jni_YGConfigFree), \ - YGMakeNativeMethod(jni_YGConfigSetExperimentalFeatureEnabled), \ - YGMakeNativeMethod(jni_YGConfigSetUseWebDefaults), \ - YGMakeNativeMethod(jni_YGConfigSetPrintTreeFlag), \ - YGMakeNativeMethod(jni_YGConfigSetPointScaleFactor), \ - YGMakeNativeMethod(jni_YGConfigSetUseLegacyStretchBehaviour), \ - YGMakeNativeMethod(jni_YGConfigSetLogger), \ - YGMakeNativeMethod(jni_YGConfigSetHasCloneNodeFunc), \ - YGMakeNativeMethod( \ - jni_YGConfigSetShouldDiffLayoutWithoutLegacyStretchBehaviour), \ - }); - -void jni_bindNativeMethods(alias_ref, jboolean useFastCall) { - if (useFastCall) { - YGRegisterNatives(YGRealMakeCriticalNativeMethod); - } else { - YGRegisterNatives(YGWrapCriticalNativeMethodForRegularCall); - } -} +#define YGMakeCriticalNativeMethod(name) makeCriticalNativeMethod(#name, name) jint JNI_OnLoad(JavaVM* vm, void*) { return initialize(vm, [] { registerNatives( - "com/facebook/yoga/YogaJNI", + "com/facebook/yoga/YogaNode", { - YGMakeNativeMethod(jni_bindNativeMethods), + YGMakeNativeMethod(jni_YGNodeNew), + YGMakeNativeMethod(jni_YGNodeNewWithConfig), + YGMakeCriticalNativeMethod(jni_YGNodeFree), + YGMakeCriticalNativeMethod(jni_YGNodeReset), + YGMakeCriticalNativeMethod(jni_YGNodeClearChildren), + YGMakeCriticalNativeMethod(jni_YGNodeInsertChild), + YGMakeCriticalNativeMethod(jni_YGNodeInsertSharedChild), + YGMakeCriticalNativeMethod(jni_YGNodeRemoveChild), + YGMakeCriticalNativeMethod(jni_YGNodeSetIsReferenceBaseline), + YGMakeCriticalNativeMethod(jni_YGNodeIsReferenceBaseline), + YGMakeNativeMethod(jni_YGNodeCalculateLayout), + YGMakeCriticalNativeMethod(jni_YGNodeMarkDirty), + YGMakeCriticalNativeMethod( + jni_YGNodeMarkDirtyAndPropogateToDescendants), + YGMakeCriticalNativeMethod(jni_YGNodeIsDirty), + YGMakeCriticalNativeMethod(jni_YGNodeSetHasMeasureFunc), + YGMakeCriticalNativeMethod(jni_YGNodeSetHasBaselineFunc), + YGMakeCriticalNativeMethod(jni_YGNodeCopyStyle), + YGMakeCriticalNativeMethod(jni_YGNodeStyleGetDirection), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetDirection), + YGMakeCriticalNativeMethod(jni_YGNodeStyleGetFlexDirection), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetFlexDirection), + YGMakeCriticalNativeMethod(jni_YGNodeStyleGetJustifyContent), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetJustifyContent), + YGMakeCriticalNativeMethod(jni_YGNodeStyleGetAlignItems), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetAlignItems), + YGMakeCriticalNativeMethod(jni_YGNodeStyleGetAlignSelf), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetAlignSelf), + YGMakeCriticalNativeMethod(jni_YGNodeStyleGetAlignContent), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetAlignContent), + YGMakeCriticalNativeMethod(jni_YGNodeStyleGetPositionType), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetPositionType), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetFlexWrap), + YGMakeCriticalNativeMethod(jni_YGNodeStyleGetOverflow), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetOverflow), + YGMakeCriticalNativeMethod(jni_YGNodeStyleGetDisplay), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetDisplay), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetFlex), + YGMakeCriticalNativeMethod(jni_YGNodeStyleGetFlexGrow), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetFlexGrow), + YGMakeCriticalNativeMethod(jni_YGNodeStyleGetFlexShrink), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetFlexShrink), + YGMakeNativeMethod(jni_YGNodeStyleGetFlexBasis), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetFlexBasis), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetFlexBasisPercent), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetFlexBasisAuto), + YGMakeNativeMethod(jni_YGNodeStyleGetMargin), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetMargin), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetMarginPercent), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetMarginAuto), + YGMakeNativeMethod(jni_YGNodeStyleGetPadding), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetPadding), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetPaddingPercent), + YGMakeCriticalNativeMethod(jni_YGNodeStyleGetBorder), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetBorder), + YGMakeNativeMethod(jni_YGNodeStyleGetPosition), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetPosition), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetPositionPercent), + YGMakeNativeMethod(jni_YGNodeStyleGetWidth), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetWidth), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetWidthPercent), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetWidthAuto), + YGMakeNativeMethod(jni_YGNodeStyleGetHeight), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetHeight), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetHeightPercent), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetHeightAuto), + YGMakeNativeMethod(jni_YGNodeStyleGetMinWidth), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetMinWidth), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetMinWidthPercent), + YGMakeNativeMethod(jni_YGNodeStyleGetMinHeight), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetMinHeight), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetMinHeightPercent), + YGMakeNativeMethod(jni_YGNodeStyleGetMaxWidth), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetMaxWidth), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetMaxWidthPercent), + YGMakeNativeMethod(jni_YGNodeStyleGetMaxHeight), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetMaxHeight), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetMaxHeightPercent), + YGMakeCriticalNativeMethod(jni_YGNodeStyleGetAspectRatio), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetAspectRatio), + YGMakeCriticalNativeMethod(jni_YGNodeGetInstanceCount), + YGMakeCriticalNativeMethod(jni_YGNodePrint), + YGMakeNativeMethod(jni_YGNodeClone), + YGMakeCriticalNativeMethod(jni_YGNodeSetOwner), + }); + registerNatives( + "com/facebook/yoga/YogaConfig", + { + YGMakeNativeMethod(jni_YGConfigNew), + YGMakeNativeMethod(jni_YGConfigFree), + YGMakeNativeMethod(jni_YGConfigSetExperimentalFeatureEnabled), + YGMakeNativeMethod(jni_YGConfigSetUseWebDefaults), + YGMakeNativeMethod(jni_YGConfigSetPrintTreeFlag), + YGMakeNativeMethod(jni_YGConfigSetPointScaleFactor), + YGMakeNativeMethod(jni_YGConfigSetUseLegacyStretchBehaviour), + YGMakeNativeMethod(jni_YGConfigSetLogger), + YGMakeNativeMethod(jni_YGConfigSetHasCloneNodeFunc), + YGMakeNativeMethod( + jni_YGConfigSetShouldDiffLayoutWithoutLegacyStretchBehaviour), }); }); }