From 7a60399b2bbd6e4220bb320b0669cd8d6bfb55c5 Mon Sep 17 00:00:00 2001 From: David Aurelio Date: Wed, 7 Nov 2018 09:33:33 -0800 Subject: [PATCH] Add Yoga JNI bindings to libcoldstart Summary: Yoga's JNI bindings are usually loaded during class loading, and can stall the UI thread. Here, we try to mitigate the problem by adding the bindings to libcoldstart. Reviewed By: michalgr Differential Revision: D12956818 fbshipit-source-id: 9dda5cb6d26c2bae64606bc2d7c98ab8f7c05a30 --- java/BUCK | 1 + java/com/facebook/yoga/YogaJNI.java | 8 +++++--- tools/build_defs/oss/yoga_defs.bzl | 2 ++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/java/BUCK b/java/BUCK index 14210ed1..87a44ad6 100644 --- a/java/BUCK +++ b/java/BUCK @@ -10,6 +10,7 @@ yoga_cxx_library( srcs = glob(["jni/*.cpp"]), headers = glob(["jni/*.h"]), header_namespace = "", + allow_jni_merging = True, compiler_flags = [ "-fno-omit-frame-pointer", "-fexceptions", diff --git a/java/com/facebook/yoga/YogaJNI.java b/java/com/facebook/yoga/YogaJNI.java index deccbcf5..fb013804 100644 --- a/java/com/facebook/yoga/YogaJNI.java +++ b/java/com/facebook/yoga/YogaJNI.java @@ -10,6 +10,7 @@ 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; @@ -19,12 +20,13 @@ public class YogaJNI { private static native void jni_bindNativeMethods(boolean useFastCall); - static boolean init() { - if (SoLoader.loadLibrary("yoga")) { + static synchronized boolean init() { + if (!isInitialized) { + isInitialized = true; + SoLoader.loadLibrary("yoga"); jni_bindNativeMethods(useFastCall); return true; } - return false; } } diff --git a/tools/build_defs/oss/yoga_defs.bzl b/tools/build_defs/oss/yoga_defs.bzl index 6b3ac1d5..7eca7b9b 100644 --- a/tools/build_defs/oss/yoga_defs.bzl +++ b/tools/build_defs/oss/yoga_defs.bzl @@ -174,6 +174,8 @@ def yoga_cxx_binary(*args, **kwargs): def yoga_cxx_library(*args, **kwargs): # Currently unused kwargs.pop("platforms", None) + kwargs.pop("allow_jni_merging", None) + native.cxx_library(*args, **kwargs) def yoga_cxx_test(*args, **kwargs):