From c0dd11e5326db15da2b84a21478eab1fc862a03b Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Sat, 11 Jul 2020 09:36:33 -0700 Subject: [PATCH] Introduce JNativeModulePerfLogger Summary: ## Description This diff introduces `NativeModulePerfLogger.java`, the Android extension (a `jni::HybridClass`) to `NativeModulePerfLogger`. ### Why is this a Hybrid class? Because we have C++ and Java markers, and the perf-logger has both a Java and a C++ interface that the application must implement. `jni::Hybrid` classes are a convenient solution for these constraints. Changelog: [Android][Added] - Introduce JNativeModulePerfLogger Reviewed By: ejanzer Differential Revision: D21318052 fbshipit-source-id: 2f43853b243fa2a629068bb4aced1e3f12f038ba --- .../com/facebook/react/reactperflogger/BUCK | 22 ++++++++ .../NativeModulePerfLogger.java | 56 +++++++++++++++++++ .../react/reactperflogger/jni/Android.mk | 31 ++++++++++ .../facebook/react/reactperflogger/jni/BUCK | 37 ++++++++++++ .../jni/reactperflogger/.clang-tidy | 5 ++ .../reactperflogger/JNativeModulePerfLogger.h | 30 ++++++++++ .../jni/reactperflogger/OnLoad.cpp | 14 +++++ 7 files changed, 195 insertions(+) create mode 100644 ReactAndroid/src/main/java/com/facebook/react/reactperflogger/BUCK create mode 100644 ReactAndroid/src/main/java/com/facebook/react/reactperflogger/NativeModulePerfLogger.java create mode 100644 ReactAndroid/src/main/java/com/facebook/react/reactperflogger/jni/Android.mk create mode 100644 ReactAndroid/src/main/java/com/facebook/react/reactperflogger/jni/BUCK create mode 100644 ReactAndroid/src/main/java/com/facebook/react/reactperflogger/jni/reactperflogger/.clang-tidy create mode 100644 ReactAndroid/src/main/java/com/facebook/react/reactperflogger/jni/reactperflogger/JNativeModulePerfLogger.h create mode 100644 ReactAndroid/src/main/java/com/facebook/react/reactperflogger/jni/reactperflogger/OnLoad.cpp diff --git a/ReactAndroid/src/main/java/com/facebook/react/reactperflogger/BUCK b/ReactAndroid/src/main/java/com/facebook/react/reactperflogger/BUCK new file mode 100644 index 00000000000..d8d99e703d2 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/reactperflogger/BUCK @@ -0,0 +1,22 @@ +load("//tools/build_defs/oss:rn_defs.bzl", "react_native_dep", "react_native_target", "rn_android_library") + +rn_android_library( + name = "reactperflogger", + srcs = glob( + [ + "*.java", + ], + ), + labels = [ + "supermodule:xplat/default/public.react_native.infra", + ], + required_for_source_only_abi = True, + visibility = [ + "PUBLIC", + ], + deps = [ + react_native_dep("libraries/soloader/java/com/facebook/soloader:soloader"), + react_native_dep("libraries/fbjni:java"), + react_native_target("java/com/facebook/react/reactperflogger/jni:jni"), + ], +) diff --git a/ReactAndroid/src/main/java/com/facebook/react/reactperflogger/NativeModulePerfLogger.java b/ReactAndroid/src/main/java/com/facebook/react/reactperflogger/NativeModulePerfLogger.java new file mode 100644 index 00000000000..56f9adfbbfb --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/reactperflogger/NativeModulePerfLogger.java @@ -0,0 +1,56 @@ +/* + * 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.react.perflogger; + +import com.facebook.jni.HybridData; +import com.facebook.soloader.SoLoader; + +public abstract class NativeModulePerfLogger { + private final HybridData mHybridData; + + private static volatile boolean sIsSoLibraryLoaded; + + protected abstract HybridData initHybrid(); + + protected NativeModulePerfLogger() { + maybeLoadOtherSoLibraries(); + maybeLoadSoLibrary(); + mHybridData = initHybrid(); + } + + public abstract void moduleDataCreateStart(String moduleName, int id); + + public abstract void moduleDataCreateEnd(String moduleName, int id); + + public abstract void moduleCreateStart(String moduleName, int id); + + public abstract void moduleCreateCacheHit(String moduleName, int id); + + public abstract void moduleCreateConstructStart(String moduleName, int id); + + public abstract void moduleCreateConstructEnd(String moduleName, int id); + + public abstract void moduleCreateSetUpStart(String moduleName, int id); + + public abstract void moduleCreateSetUpEnd(String moduleName, int id); + + public abstract void moduleCreateEnd(String moduleName, int id); + + public abstract void moduleCreateFail(String moduleName, int id); + + // Prevents issues with initializer interruptions. See T38996825 and D13793825 for more context. + private static synchronized void maybeLoadSoLibrary() { + if (!sIsSoLibraryLoaded) { + SoLoader.loadLibrary("reactperfloggerjni"); + sIsSoLibraryLoaded = true; + } + } + + /** Subclasses will override this method to load their own SO libraries. */ + protected synchronized void maybeLoadOtherSoLibraries() {} +} diff --git a/ReactAndroid/src/main/java/com/facebook/react/reactperflogger/jni/Android.mk b/ReactAndroid/src/main/java/com/facebook/react/reactperflogger/jni/Android.mk new file mode 100644 index 00000000000..c44496918d5 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/reactperflogger/jni/Android.mk @@ -0,0 +1,31 @@ +# 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. + +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +# Header search path for all source files in this module. +LOCAL_C_INCLUDES := $(LOCAL_PATH)/reactperflogger + +# Header search path for modules that depend on this module +LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) + +LOCAL_CFLAGS += -fexceptions -frtti -std=c++14 -Wall + +LOCAL_LDLIBS += -landroid + +LOCAL_STATIC_LIBRARIES = libreactperflogger + +LOCAL_SHARED_LIBRARIES = libfb libfbjni + +# Name of this module. +LOCAL_MODULE := reactperfloggerjni + +# Compile all local c++ files +LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/reactperflogger/*.cpp) + +# Build the files in this directory as a shared library +include $(BUILD_SHARED_LIBRARY) diff --git a/ReactAndroid/src/main/java/com/facebook/react/reactperflogger/jni/BUCK b/ReactAndroid/src/main/java/com/facebook/react/reactperflogger/jni/BUCK new file mode 100644 index 00000000000..481682cb97c --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/reactperflogger/jni/BUCK @@ -0,0 +1,37 @@ +load("@fbsource//tools/build_defs/oss:rn_defs.bzl", "ANDROID", "FBJNI_TARGET", "react_native_xplat_target", "rn_xplat_cxx_library") + +rn_xplat_cxx_library( + name = "jni", + srcs = [ + "reactperflogger/OnLoad.cpp", + ], + header_namespace = "", + exported_headers = { + "reactperflogger/JNativeModulePerfLogger.h": "reactperflogger/JNativeModulePerfLogger.h", + }, + compiler_flags = [ + "-fexceptions", + "-frtti", + "-std=c++14", + "-Wall", + ], + fbandroid_allow_jni_merging = True, + fbandroid_labels = [ + "supermodule:xplat/default/public.react_native.infra", + ], + platforms = ANDROID, + preprocessor_flags = [ + "-DLOG_TAG=\"ReactNative\"", + "-DWITH_FBSYSTRACE=1", + ], + soname = "libreactperfloggerjni.$(ext)", + visibility = [ + "PUBLIC", + ], + deps = [ + FBJNI_TARGET, + ], + exported_deps = [ + react_native_xplat_target("reactperflogger:reactperflogger"), + ], +) diff --git a/ReactAndroid/src/main/java/com/facebook/react/reactperflogger/jni/reactperflogger/.clang-tidy b/ReactAndroid/src/main/java/com/facebook/react/reactperflogger/jni/reactperflogger/.clang-tidy new file mode 100644 index 00000000000..c98fd78ff64 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/reactperflogger/jni/reactperflogger/.clang-tidy @@ -0,0 +1,5 @@ +--- +Checks: '> +clang-diagnostic-*, +' +... diff --git a/ReactAndroid/src/main/java/com/facebook/react/reactperflogger/jni/reactperflogger/JNativeModulePerfLogger.h b/ReactAndroid/src/main/java/com/facebook/react/reactperflogger/jni/reactperflogger/JNativeModulePerfLogger.h new file mode 100644 index 00000000000..018d8de782d --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/reactperflogger/jni/reactperflogger/JNativeModulePerfLogger.h @@ -0,0 +1,30 @@ +/* + * 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. + */ + +#pragma once + +#include +#include +#include + +namespace facebook { +namespace react { + +class JNativeModulePerfLogger + : public jni::HybridClass { + public: + static auto constexpr kJavaDescriptor = + "Lcom/facebook/react/perflogger/NativeModulePerfLogger;"; + + virtual std::unique_ptr get() = 0; + + private: + friend HybridBase; +}; + +} // namespace react +} // namespace facebook diff --git a/ReactAndroid/src/main/java/com/facebook/react/reactperflogger/jni/reactperflogger/OnLoad.cpp b/ReactAndroid/src/main/java/com/facebook/react/reactperflogger/jni/reactperflogger/OnLoad.cpp new file mode 100644 index 00000000000..4ac3d476441 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/reactperflogger/jni/reactperflogger/OnLoad.cpp @@ -0,0 +1,14 @@ +/* + * 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 "JNativeModulePerfLogger.h" + +JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) { + return facebook::jni::initialize(vm, [] {}); +}