From 554d8cdf767969e5b0392b1aa3971df80a1236a1 Mon Sep 17 00:00:00 2001 From: David Aurelio Date: Tue, 25 Sep 2018 15:44:40 -0700 Subject: [PATCH] Make native method binding configurable Summary: Moves binding of native methods into a separate native method that can be parameterized. This will be used to experiment with JNI-related technology. Reviewed By: priteshrnandgaonkar Differential Revision: D9943870 fbshipit-source-id: 661f15537d5bbf7a3eef7717e3d99fed2de23904 --- java/com/facebook/yoga/YogaConfig.java | 2 +- java/com/facebook/yoga/YogaJNI.java | 26 ++++ java/com/facebook/yoga/YogaNode.java | 2 +- java/jni/YGJNI.cpp | 204 +++++++++++++------------ 4 files changed, 134 insertions(+), 100 deletions(-) create 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 cbc549b7..0c4d8020 100644 --- a/java/com/facebook/yoga/YogaConfig.java +++ b/java/com/facebook/yoga/YogaConfig.java @@ -16,7 +16,7 @@ public class YogaConfig { public static int SPACING_TYPE = 1; static { - SoLoader.loadLibrary("yoga"); + YogaJNI.init(); } long mNativePointer; diff --git a/java/com/facebook/yoga/YogaJNI.java b/java/com/facebook/yoga/YogaJNI.java new file mode 100644 index 00000000..6e036c4a --- /dev/null +++ b/java/com/facebook/yoga/YogaJNI.java @@ -0,0 +1,26 @@ +/* + * 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 { + // set before loading any other Yoga code + public static boolean useFastCall = false; + + private static native void jni_bindNativeMethods(boolean useFastCall); + + static boolean init() { + if (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 ad9d495d..e266701d 100644 --- a/java/com/facebook/yoga/YogaNode.java +++ b/java/com/facebook/yoga/YogaNode.java @@ -18,7 +18,7 @@ import javax.annotation.Nullable; public class YogaNode implements Cloneable { static { - SoLoader.loadLibrary("yoga"); + YogaJNI.init(); } /** diff --git a/java/jni/YGJNI.cpp b/java/jni/YGJNI.cpp index 54d61940..aea7d368 100644 --- a/java/jni/YGJNI.cpp +++ b/java/jni/YGJNI.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) Facebook, Inc. and its affiliates. + * 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. @@ -674,107 +674,115 @@ jint jni_YGNodeGetInstanceCount(alias_ref clazz) { #define YGMakeNativeMethod(name) makeNativeMethod(#name, name) +void jni_bindNativeMethods(alias_ref, jboolean) { + registerNatives( + "com/facebook/yoga/YogaNode", + { + YGMakeNativeMethod(jni_YGNodeNew), + YGMakeNativeMethod(jni_YGNodeNewWithConfig), + YGMakeNativeMethod(jni_YGNodeFree), + YGMakeNativeMethod(jni_YGNodeReset), + YGMakeNativeMethod(jni_YGNodeClearChildren), + YGMakeNativeMethod(jni_YGNodeInsertChild), + YGMakeNativeMethod(jni_YGNodeInsertSharedChild), + YGMakeNativeMethod(jni_YGNodeRemoveChild), + YGMakeNativeMethod(jni_YGNodeCalculateLayout), + YGMakeNativeMethod(jni_YGNodeMarkDirty), + YGMakeNativeMethod(jni_YGNodeMarkDirtyAndPropogateToDescendants), + YGMakeNativeMethod(jni_YGNodeIsDirty), + YGMakeNativeMethod(jni_YGNodeSetHasMeasureFunc), + YGMakeNativeMethod(jni_YGNodeSetHasBaselineFunc), + YGMakeNativeMethod(jni_YGNodeCopyStyle), + YGMakeNativeMethod(jni_YGNodeStyleGetDirection), + YGMakeNativeMethod(jni_YGNodeStyleSetDirection), + YGMakeNativeMethod(jni_YGNodeStyleGetFlexDirection), + YGMakeNativeMethod(jni_YGNodeStyleSetFlexDirection), + YGMakeNativeMethod(jni_YGNodeStyleGetJustifyContent), + YGMakeNativeMethod(jni_YGNodeStyleSetJustifyContent), + YGMakeNativeMethod(jni_YGNodeStyleGetAlignItems), + YGMakeNativeMethod(jni_YGNodeStyleSetAlignItems), + YGMakeNativeMethod(jni_YGNodeStyleGetAlignSelf), + YGMakeNativeMethod(jni_YGNodeStyleSetAlignSelf), + YGMakeNativeMethod(jni_YGNodeStyleGetAlignContent), + YGMakeNativeMethod(jni_YGNodeStyleSetAlignContent), + YGMakeNativeMethod(jni_YGNodeStyleGetPositionType), + YGMakeNativeMethod(jni_YGNodeStyleSetPositionType), + YGMakeNativeMethod(jni_YGNodeStyleSetFlexWrap), + YGMakeNativeMethod(jni_YGNodeStyleGetOverflow), + YGMakeNativeMethod(jni_YGNodeStyleSetOverflow), + YGMakeNativeMethod(jni_YGNodeStyleGetDisplay), + YGMakeNativeMethod(jni_YGNodeStyleSetDisplay), + YGMakeNativeMethod(jni_YGNodeStyleSetFlex), + YGMakeNativeMethod(jni_YGNodeStyleGetFlexGrow), + YGMakeNativeMethod(jni_YGNodeStyleSetFlexGrow), + YGMakeNativeMethod(jni_YGNodeStyleGetFlexShrink), + YGMakeNativeMethod(jni_YGNodeStyleSetFlexShrink), + YGMakeNativeMethod(jni_YGNodeStyleGetFlexBasis), + YGMakeNativeMethod(jni_YGNodeStyleSetFlexBasis), + YGMakeNativeMethod(jni_YGNodeStyleSetFlexBasisPercent), + YGMakeNativeMethod(jni_YGNodeStyleSetFlexBasisAuto), + YGMakeNativeMethod(jni_YGNodeStyleGetMargin), + YGMakeNativeMethod(jni_YGNodeStyleSetMargin), + YGMakeNativeMethod(jni_YGNodeStyleSetMarginPercent), + YGMakeNativeMethod(jni_YGNodeStyleSetMarginAuto), + YGMakeNativeMethod(jni_YGNodeStyleGetPadding), + YGMakeNativeMethod(jni_YGNodeStyleSetPadding), + YGMakeNativeMethod(jni_YGNodeStyleSetPaddingPercent), + YGMakeNativeMethod(jni_YGNodeStyleGetBorder), + YGMakeNativeMethod(jni_YGNodeStyleSetBorder), + YGMakeNativeMethod(jni_YGNodeStyleGetPosition), + YGMakeNativeMethod(jni_YGNodeStyleSetPosition), + YGMakeNativeMethod(jni_YGNodeStyleSetPositionPercent), + YGMakeNativeMethod(jni_YGNodeStyleGetWidth), + YGMakeNativeMethod(jni_YGNodeStyleSetWidth), + YGMakeNativeMethod(jni_YGNodeStyleSetWidthPercent), + YGMakeNativeMethod(jni_YGNodeStyleSetWidthAuto), + YGMakeNativeMethod(jni_YGNodeStyleGetHeight), + YGMakeNativeMethod(jni_YGNodeStyleSetHeight), + YGMakeNativeMethod(jni_YGNodeStyleSetHeightPercent), + YGMakeNativeMethod(jni_YGNodeStyleSetHeightAuto), + YGMakeNativeMethod(jni_YGNodeStyleGetMinWidth), + YGMakeNativeMethod(jni_YGNodeStyleSetMinWidth), + YGMakeNativeMethod(jni_YGNodeStyleSetMinWidthPercent), + YGMakeNativeMethod(jni_YGNodeStyleGetMinHeight), + YGMakeNativeMethod(jni_YGNodeStyleSetMinHeight), + YGMakeNativeMethod(jni_YGNodeStyleSetMinHeightPercent), + YGMakeNativeMethod(jni_YGNodeStyleGetMaxWidth), + YGMakeNativeMethod(jni_YGNodeStyleSetMaxWidth), + YGMakeNativeMethod(jni_YGNodeStyleSetMaxWidthPercent), + YGMakeNativeMethod(jni_YGNodeStyleGetMaxHeight), + YGMakeNativeMethod(jni_YGNodeStyleSetMaxHeight), + YGMakeNativeMethod(jni_YGNodeStyleSetMaxHeightPercent), + YGMakeNativeMethod(jni_YGNodeStyleGetAspectRatio), + YGMakeNativeMethod(jni_YGNodeStyleSetAspectRatio), + YGMakeNativeMethod(jni_YGNodeGetInstanceCount), + YGMakeNativeMethod(jni_YGNodePrint), + YGMakeNativeMethod(jni_YGNodeClone), + YGMakeNativeMethod(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), + }); +} + jint JNI_OnLoad(JavaVM* vm, void*) { return initialize(vm, [] { registerNatives( - "com/facebook/yoga/YogaNode", + "com/facebook/yoga/YogaJNI", { - YGMakeNativeMethod(jni_YGNodeNew), - YGMakeNativeMethod(jni_YGNodeNewWithConfig), - YGMakeNativeMethod(jni_YGNodeFree), - YGMakeNativeMethod(jni_YGNodeReset), - YGMakeNativeMethod(jni_YGNodeClearChildren), - YGMakeNativeMethod(jni_YGNodeInsertChild), - YGMakeNativeMethod(jni_YGNodeInsertSharedChild), - YGMakeNativeMethod(jni_YGNodeRemoveChild), - YGMakeNativeMethod(jni_YGNodeCalculateLayout), - YGMakeNativeMethod(jni_YGNodeMarkDirty), - YGMakeNativeMethod(jni_YGNodeMarkDirtyAndPropogateToDescendants), - YGMakeNativeMethod(jni_YGNodeIsDirty), - YGMakeNativeMethod(jni_YGNodeSetHasMeasureFunc), - YGMakeNativeMethod(jni_YGNodeSetHasBaselineFunc), - YGMakeNativeMethod(jni_YGNodeCopyStyle), - YGMakeNativeMethod(jni_YGNodeStyleGetDirection), - YGMakeNativeMethod(jni_YGNodeStyleSetDirection), - YGMakeNativeMethod(jni_YGNodeStyleGetFlexDirection), - YGMakeNativeMethod(jni_YGNodeStyleSetFlexDirection), - YGMakeNativeMethod(jni_YGNodeStyleGetJustifyContent), - YGMakeNativeMethod(jni_YGNodeStyleSetJustifyContent), - YGMakeNativeMethod(jni_YGNodeStyleGetAlignItems), - YGMakeNativeMethod(jni_YGNodeStyleSetAlignItems), - YGMakeNativeMethod(jni_YGNodeStyleGetAlignSelf), - YGMakeNativeMethod(jni_YGNodeStyleSetAlignSelf), - YGMakeNativeMethod(jni_YGNodeStyleGetAlignContent), - YGMakeNativeMethod(jni_YGNodeStyleSetAlignContent), - YGMakeNativeMethod(jni_YGNodeStyleGetPositionType), - YGMakeNativeMethod(jni_YGNodeStyleSetPositionType), - YGMakeNativeMethod(jni_YGNodeStyleSetFlexWrap), - YGMakeNativeMethod(jni_YGNodeStyleGetOverflow), - YGMakeNativeMethod(jni_YGNodeStyleSetOverflow), - YGMakeNativeMethod(jni_YGNodeStyleGetDisplay), - YGMakeNativeMethod(jni_YGNodeStyleSetDisplay), - YGMakeNativeMethod(jni_YGNodeStyleSetFlex), - YGMakeNativeMethod(jni_YGNodeStyleGetFlexGrow), - YGMakeNativeMethod(jni_YGNodeStyleSetFlexGrow), - YGMakeNativeMethod(jni_YGNodeStyleGetFlexShrink), - YGMakeNativeMethod(jni_YGNodeStyleSetFlexShrink), - YGMakeNativeMethod(jni_YGNodeStyleGetFlexBasis), - YGMakeNativeMethod(jni_YGNodeStyleSetFlexBasis), - YGMakeNativeMethod(jni_YGNodeStyleSetFlexBasisPercent), - YGMakeNativeMethod(jni_YGNodeStyleSetFlexBasisAuto), - YGMakeNativeMethod(jni_YGNodeStyleGetMargin), - YGMakeNativeMethod(jni_YGNodeStyleSetMargin), - YGMakeNativeMethod(jni_YGNodeStyleSetMarginPercent), - YGMakeNativeMethod(jni_YGNodeStyleSetMarginAuto), - YGMakeNativeMethod(jni_YGNodeStyleGetPadding), - YGMakeNativeMethod(jni_YGNodeStyleSetPadding), - YGMakeNativeMethod(jni_YGNodeStyleSetPaddingPercent), - YGMakeNativeMethod(jni_YGNodeStyleGetBorder), - YGMakeNativeMethod(jni_YGNodeStyleSetBorder), - YGMakeNativeMethod(jni_YGNodeStyleGetPosition), - YGMakeNativeMethod(jni_YGNodeStyleSetPosition), - YGMakeNativeMethod(jni_YGNodeStyleSetPositionPercent), - YGMakeNativeMethod(jni_YGNodeStyleGetWidth), - YGMakeNativeMethod(jni_YGNodeStyleSetWidth), - YGMakeNativeMethod(jni_YGNodeStyleSetWidthPercent), - YGMakeNativeMethod(jni_YGNodeStyleSetWidthAuto), - YGMakeNativeMethod(jni_YGNodeStyleGetHeight), - YGMakeNativeMethod(jni_YGNodeStyleSetHeight), - YGMakeNativeMethod(jni_YGNodeStyleSetHeightPercent), - YGMakeNativeMethod(jni_YGNodeStyleSetHeightAuto), - YGMakeNativeMethod(jni_YGNodeStyleGetMinWidth), - YGMakeNativeMethod(jni_YGNodeStyleSetMinWidth), - YGMakeNativeMethod(jni_YGNodeStyleSetMinWidthPercent), - YGMakeNativeMethod(jni_YGNodeStyleGetMinHeight), - YGMakeNativeMethod(jni_YGNodeStyleSetMinHeight), - YGMakeNativeMethod(jni_YGNodeStyleSetMinHeightPercent), - YGMakeNativeMethod(jni_YGNodeStyleGetMaxWidth), - YGMakeNativeMethod(jni_YGNodeStyleSetMaxWidth), - YGMakeNativeMethod(jni_YGNodeStyleSetMaxWidthPercent), - YGMakeNativeMethod(jni_YGNodeStyleGetMaxHeight), - YGMakeNativeMethod(jni_YGNodeStyleSetMaxHeight), - YGMakeNativeMethod(jni_YGNodeStyleSetMaxHeightPercent), - YGMakeNativeMethod(jni_YGNodeStyleGetAspectRatio), - YGMakeNativeMethod(jni_YGNodeStyleSetAspectRatio), - YGMakeNativeMethod(jni_YGNodeGetInstanceCount), - YGMakeNativeMethod(jni_YGNodePrint), - YGMakeNativeMethod(jni_YGNodeClone), - YGMakeNativeMethod(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), + YGMakeNativeMethod(jni_bindNativeMethods), }); }); }