From 888892885e8fd3bceffd99c7ee5c5159df33107e Mon Sep 17 00:00:00 2001 From: David Aurelio Date: Mon, 4 Mar 2019 01:27:30 -0800 Subject: [PATCH] Encapsulate all used java classes Summary: @public Moves all Java classes used from C++ to their own header + implementation file. In `YGJNI.cpp`, we only call methods on these objects deriving from `jni::JavaClass`. This is only a bit of cleanup, no functional change. Reviewed By: SidharthGuglani Differential Revision: D14261043 fbshipit-source-id: 2db1d81cb7f56a4cdc24b182b2166e1d7e24ba3c --- java/CMakeLists.txt | 2 +- java/jni/YGJNI.cpp | 240 ++++++++++++++++++------------------------ java/jni/YGJTypes.cpp | 44 ++++++++ java/jni/YGJTypes.h | 42 ++++++++ 4 files changed, 189 insertions(+), 139 deletions(-) create mode 100644 java/jni/YGJTypes.cpp create mode 100644 java/jni/YGJTypes.h diff --git a/java/CMakeLists.txt b/java/CMakeLists.txt index 0d91904b..12e69eb0 100644 --- a/java/CMakeLists.txt +++ b/java/CMakeLists.txt @@ -29,7 +29,7 @@ add_compile_options( -Wall -std=c++11) -add_library(yoga SHARED jni/YGJNI.cpp) +add_library(yoga SHARED jni/YGJNI.cpp jni/YGJTypes.cpp) target_include_directories(yoga PRIVATE ${libfb_DIR}/include diff --git a/java/jni/YGJNI.cpp b/java/jni/YGJNI.cpp index c262f3b1..f36e6e20 100644 --- a/java/jni/YGJNI.cpp +++ b/java/jni/YGJNI.cpp @@ -11,6 +11,8 @@ #include #include +#include "YGJTypes.h" + using namespace facebook::jni; using namespace std; using facebook::yoga::detail::Log; @@ -58,14 +60,6 @@ enum YGStyleInput { IsReferenceBaseline, }; -struct JYogaNode : public JavaClass { - static constexpr auto kJavaDescriptor = "Lcom/facebook/yoga/YogaNodeJNI;"; -}; - -struct JYogaConfig : public JavaClass { - static constexpr auto kJavaDescriptor = "Lcom/facebook/yoga/YogaConfig;"; -}; - class PtrJNodeMap { using JNodeArray = JArrayClass; std::map ptrsToIdxs_; @@ -250,10 +244,7 @@ static float YGJNIBaselineFunc( float height, void* layoutContext) { if (auto obj = YGNodeJobject(node, layoutContext)) { - static auto baselineFunc = - findClassStatic("com/facebook/yoga/YogaNodeJNI") - ->getMethod("baseline"); - return baselineFunc(obj, width, height); + return obj->baseline(width, height); } else { return height; } @@ -275,13 +266,9 @@ static YGSize YGJNIMeasureFunc( YGMeasureMode heightMode, void* layoutContext) { if (auto obj = YGNodeJobject(node, layoutContext)) { - static auto measureFunc = - findClassStatic("com/facebook/yoga/YogaNodeJNI") - ->getMethod("measure"); - YGTransferLayoutDirection(node, obj); const auto measureResult = - measureFunc(obj, width, widthMode, height, heightMode); + obj->measure(width, widthMode, height, heightMode); static_assert( sizeof(measureResult) == 8, @@ -307,10 +294,6 @@ static YGSize YGJNIMeasureFunc( } } -struct JYogaLogLevel : public JavaClass { - static constexpr auto kJavaDescriptor = "Lcom/facebook/yoga/YogaLogLevel;"; -}; - static int YGJNILogFunc( const YGConfigRef config, const YGNodeRef node, @@ -322,25 +305,15 @@ static int YGJNILogFunc( std::vector buffer(1 + result); vsnprintf(buffer.data(), buffer.size(), format, args); - static auto logFunc = - findClassStatic("com/facebook/yoga/YogaLogger") - ->getMethod, local_ref, jstring)>("log"); - - static auto logLevelFromInt = - JYogaLogLevel::javaClassStatic() - ->getStaticMethod("fromInt"); - auto jloggerPtr = - static_cast*>(YGConfigGetContext(config)); + static_cast*>(YGConfigGetContext(config)); if (jloggerPtr != nullptr) { if (auto obj = YGNodeJobject(node, layoutContext)) { - logFunc( - *jloggerPtr, - obj, - logLevelFromInt( - JYogaLogLevel::javaClassStatic(), static_cast(level)), - Environment::current()->NewStringUTF(buffer.data())); + (*jloggerPtr) + ->log( + obj, + JYogaLogLevel::fromInt(level), + Environment::current()->NewStringUTF(buffer.data())); } } @@ -479,14 +452,6 @@ void jni_YGNodeCopyStyle(jlong dstNativePointer, jlong srcNativePointer) { _jlong2YGNodeRef(dstNativePointer), _jlong2YGNodeRef(srcNativePointer)); } -struct JYogaValue : public JavaClass { - constexpr static auto kJavaDescriptor = "Lcom/facebook/yoga/YogaValue;"; - - static local_ref create(YGValue value) { - return newInstance(value.value, static_cast(value.unit)); - } -}; - #define YG_NODE_JNI_STYLE_PROP(javatype, type, name) \ javatype jni_YGNodeStyleGet##name(jlong nativePointer) { \ return (javatype) YGNodeStyleGet##name(_jlong2YGNodeRef(nativePointer)); \ @@ -605,8 +570,8 @@ jlong jni_YGConfigNew(alias_ref) { void jni_YGConfigFree(alias_ref, jlong nativePointer) { const YGConfigRef config = _jlong2YGConfigRef(nativePointer); // unique_ptr will destruct the underlying global_ref, if present. - auto context = std::unique_ptr>{ - static_cast*>(YGConfigGetContext(config))}; + auto context = std::unique_ptr>{ + static_cast*>(YGConfigGetContext(config))}; YGConfigFree(config); } @@ -666,14 +631,15 @@ void jni_YGConfigSetLogger( alias_ref logger) { const YGConfigRef config = _jlong2YGConfigRef(nativePointer); auto context = - reinterpret_cast*>(YGConfigGetContext(config)); + reinterpret_cast*>(YGConfigGetContext(config)); if (logger) { if (context == nullptr) { - context = new global_ref{}; + context = new global_ref{}; YGConfigSetContext(config, context); } - *context = make_global(logger); + + *context = make_global(static_ref_cast(logger)); config->setLogger(YGJNILogFunc); } else { if (context != nullptr) { @@ -955,94 +921,92 @@ void jni_YGNodeStyleSetBorder(jlong nativePointer, jint edge, jfloat border) { jint JNI_OnLoad(JavaVM* vm, void*) { return initialize(vm, [] { - registerNatives( - "com/facebook/yoga/YogaNodeJNI", - { - YGMakeNativeMethod(jni_YGNodeNew), - YGMakeNativeMethod(jni_YGNodeNewWithConfig), - YGMakeNativeMethod(jni_YGNodeFree), - YGMakeCriticalNativeMethod(jni_YGNodeReset), - YGMakeCriticalNativeMethod(jni_YGNodeClearChildren), - YGMakeCriticalNativeMethod(jni_YGNodeInsertChild), - 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_YGNodeStyleGetFlexWrap), - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetFlexWrap), - YGMakeCriticalNativeMethod(jni_YGNodeStyleGetOverflow), - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetOverflow), - YGMakeCriticalNativeMethod(jni_YGNodeStyleGetDisplay), - YGMakeCriticalNativeMethod(jni_YGNodeStyleSetDisplay), - YGMakeCriticalNativeMethod(jni_YGNodeStyleGetFlex), - 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_YGNodeSetStyleInputs), - }); + JYogaNode::javaClassStatic()->registerNatives({ + YGMakeNativeMethod(jni_YGNodeNew), + YGMakeNativeMethod(jni_YGNodeNewWithConfig), + YGMakeNativeMethod(jni_YGNodeFree), + YGMakeCriticalNativeMethod(jni_YGNodeReset), + YGMakeCriticalNativeMethod(jni_YGNodeClearChildren), + YGMakeCriticalNativeMethod(jni_YGNodeInsertChild), + 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_YGNodeStyleGetFlexWrap), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetFlexWrap), + YGMakeCriticalNativeMethod(jni_YGNodeStyleGetOverflow), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetOverflow), + YGMakeCriticalNativeMethod(jni_YGNodeStyleGetDisplay), + YGMakeCriticalNativeMethod(jni_YGNodeStyleSetDisplay), + YGMakeCriticalNativeMethod(jni_YGNodeStyleGetFlex), + 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_YGNodeSetStyleInputs), + }); registerNatives( "com/facebook/yoga/YogaConfig", { diff --git a/java/jni/YGJTypes.cpp b/java/jni/YGJTypes.cpp new file mode 100644 index 00000000..6be24495 --- /dev/null +++ b/java/jni/YGJTypes.cpp @@ -0,0 +1,44 @@ +/** + * 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. + */ +#include "YGJTypes.h" + +using facebook::jni::alias_ref; +using facebook::jni::local_ref; + +jfloat JYogaNode::baseline(jfloat width, jfloat height) { + static auto javaMethod = + javaClassLocal()->getMethod("baseline"); + return javaMethod(self(), width, height); +} + +jlong JYogaNode::measure( + jfloat width, + jint widthMode, + jfloat height, + jint heightMode) { + static auto javaMethod = + javaClassLocal()->getMethod("measure"); + return javaMethod(self(), width, widthMode, height, heightMode); +} + +facebook::jni::local_ref JYogaLogLevel::fromInt(jint logLevel) { + static auto javaMethod = + javaClassStatic()->getStaticMethod(jint)>( + "fromInt"); + return javaMethod(javaClassStatic(), logLevel); +} + +void JYogaLogger::log( + facebook::jni::alias_ref node, + facebook::jni::alias_ref logLevel, + jstring message) { + static auto javaMethod = + javaClassLocal() + ->getMethod, alias_ref, jstring)>("log"); + javaMethod(self(), node, logLevel, message); +} diff --git a/java/jni/YGJTypes.h b/java/jni/YGJTypes.h new file mode 100644 index 00000000..5681e81e --- /dev/null +++ b/java/jni/YGJTypes.h @@ -0,0 +1,42 @@ +/** + * 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. + */ +#include +#include + +struct JYogaNode : public facebook::jni::JavaClass { + static constexpr auto kJavaDescriptor = "Lcom/facebook/yoga/YogaNodeJNI;"; + + jfloat baseline(jfloat width, jfloat height); + jlong measure(jfloat width, jint widthMode, jfloat height, jint heightMode); +}; + +struct JYogaConfig : public facebook::jni::JavaClass { + static constexpr auto kJavaDescriptor = "Lcom/facebook/yoga/YogaConfig;"; +}; + +struct JYogaLogLevel : public facebook::jni::JavaClass { + static constexpr auto kJavaDescriptor = "Lcom/facebook/yoga/YogaLogLevel;"; + + static facebook::jni::local_ref fromInt(jint); +}; + +struct JYogaLogger : public facebook::jni::JavaClass { + static constexpr auto kJavaDescriptor = "Lcom/facebook/yoga/YogaLogger"; + + void log( + facebook::jni::alias_ref, + facebook::jni::alias_ref, + jstring); +}; + +struct JYogaValue : public facebook::jni::JavaClass { + constexpr static auto kJavaDescriptor = "Lcom/facebook/yoga/YogaValue;"; + + static facebook::jni::local_ref create(YGValue value) { + return newInstance(value.value, static_cast(value.unit)); + } +};