Unify JNI libraries handling.

JNI libraries are now coming with corresponding Java libraries - no need to explicitly include them everywhere. As a result UnixJniLoader significantly simplified.

RELNOTES: None.
PiperOrigin-RevId: 293323937
diff --git a/src/BUILD b/src/BUILD
index 425c588..2c32624 100644
--- a/src/BUILD
+++ b/src/BUILD
@@ -10,27 +10,11 @@
 # OpenBSD; here we use `dd` instead.
 md5_cmd = "set -e -o pipefail && echo $(SRCS) | sort | xargs %s | %s | dd bs=32 count=1 > $@"
 
-# TODO(bazel-team): find a better way to handle dylib extensions.
-filegroup(
-    name = "libunix",
-    srcs = select({
-        "//src/conditions:darwin": ["//src/main/native:libunix.dylib"],
-        "//src/conditions:darwin_x86_64": ["//src/main/native:libunix.dylib"],
-        "//src/conditions:windows": ["//src/main/native/windows:windows_jni.dll"],
-        "//conditions:default": ["//src/main/native:libunix.so"],
-    }),
-    visibility = [
-        "//src/test/java:__pkg__",
-        "//src/tools/remote:__subpackages__",
-    ],
-)
-
 [genrule(
     name = "install_base_key-file" + suffix,
     srcs = [
         "//src/main/java/com/google/devtools/build/lib:bazel/BazelServer_deploy.jar",
         "//src/main/cpp:client",
-        ":libunix",
         "//src/main/tools:build-runfiles",
         "//src/main/tools:process-wrapper",
         "//src/main/tools:linux-sandbox",
@@ -343,7 +327,8 @@
         "//src/main/java/com/google/devtools/build/lib:bazel/BazelServer_deploy.jar",
         "install_base_key" + suffix,
         ":platforms_archive",
-        ":libunix",
+        "//src/main/native:target-os-unix-native-lib",
+        "//src/main/native/windows:target-os-native-lib",
         "//src/main/tools:build-runfiles",
         "//src/main/tools:process-wrapper",
         "//src/main/tools:jdk-support",
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 2002dc0..b50b9b7 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -93,16 +93,17 @@
 )
 
 #   Java interfaces to various native UNIX system services.
+#
+#   All programs that depend on libraries in this package will have
+#   JNI (native code) dependencies.
 java_library(
     name = "unix",
     srcs = glob([
         "unix/*.java",
     ]) + ["UnixJniLoader.java"],
-    resources = select({
-        # todo(dslomov): Get rid of this whole library on Windows.
-        "//src/conditions:windows": [],
-        "//conditions:default": ["//src/main/native:libunix.so"],
-    }),
+    # Enable tests to pick up the native lib if using this library.
+    # See JavaBinary#collectNativeLibraries.
+    data = ["//src/main/native:target-os-unix-native-lib"],
     deps = [
         ":os_util",
         "//src/main/java/com/google/devtools/build/lib/concurrent",
diff --git a/src/main/java/com/google/devtools/build/lib/UnixJniLoader.java b/src/main/java/com/google/devtools/build/lib/UnixJniLoader.java
index 5646256..126bc93 100644
--- a/src/main/java/com/google/devtools/build/lib/UnixJniLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/UnixJniLoader.java
@@ -14,30 +14,11 @@
 
 package com.google.devtools.build.lib;
 
-import com.google.devtools.build.lib.util.OS;
-
-import java.io.File;
-
 /**
  * A class to load JNI dependencies for Bazel.
  */
 public class UnixJniLoader {
   public static void loadJni() {
-    try {
-      if (OS.getCurrent() != OS.WINDOWS) {
-        System.loadLibrary("unix");
-      }
-    } catch (UnsatisfiedLinkError ex) {
-      // We are probably in tests, let's try to find the library relative to where we are.
-      File cwd = new File(System.getProperty("user.dir"));
-      String libunix = "src" + File.separator + "main" + File.separator + "native" + File.separator
-          + System.mapLibraryName("unix");
-      File toTest = new File(cwd, libunix);
-      if (toTest.exists()) {
-        System.load(toTest.toString());
-      } else {
-        throw ex;
-      }
-    }
+    System.loadLibrary("unix");
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/windows/jni/BUILD b/src/main/java/com/google/devtools/build/lib/windows/jni/BUILD
index 6f5f841..fe30698 100644
--- a/src/main/java/com/google/devtools/build/lib/windows/jni/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/windows/jni/BUILD
@@ -55,8 +55,13 @@
     deps = [":jni-loader"],
 )
 
+#   Java interfaces to various native Windows system services.
+#
+#   All programs that depend on libraries in this package will have
+#   JNI (native code) dependencies.
 java_library(
     name = "jni-loader",
     srcs = ["WindowsJniLoader.java"],
+    data = ["//src/main/native/windows:target-os-native-lib"],
     deps = ["@bazel_tools//tools/java/runfiles"],
 )
diff --git a/src/main/native/BUILD b/src/main/native/BUILD
index 329e9c0..604284b 100644
--- a/src/main/native/BUILD
+++ b/src/main/native/BUILD
@@ -73,7 +73,8 @@
         "//conditions:default": [],
     }),
     linkshared = 1,
-    visibility = ["//src:__subpackages__"],
+    # :target-os-unix-native-lib should be used outside of this package
+    visibility = ["//visibility:private"],
     deps = [
         ":latin1_jni_path",
         "//src/main/cpp/util",
@@ -89,7 +90,24 @@
     outs = ["libunix.dylib"],
     cmd = "cp $< $@",
     output_to_bindir = 1,
-    visibility = ["//src:__subpackages__"],
+    # :target-os-unix-native-lib should be used outside of this package
+    visibility = ["//visibility:private"],
+)
+
+# Platform-independent holder for native JNI libraries (empty for non-UNIX systems).
+# Targets should depend on this filegroup rather then on Platform-dependent libraries directly!
+filegroup(
+    name = "target-os-unix-native-lib",
+    srcs = select({
+        "//src/conditions:darwin": ["//src/main/native:libunix.dylib"],
+        "//src/conditions:darwin_x86_64": ["//src/main/native:libunix.dylib"],
+        "//src/conditions:windows": [],
+        "//conditions:default": ["//src/main/native:libunix.so"],
+    }),
+    visibility = [
+        "//src:__pkg__",
+        "//src/main/java/com/google/devtools/build/lib:__pkg__",
+    ],
 )
 
 filegroup(
diff --git a/src/main/native/windows/BUILD b/src/main/native/windows/BUILD
index 6ee8b01..410792b 100644
--- a/src/main/native/windows/BUILD
+++ b/src/main/native/windows/BUILD
@@ -1,7 +1,5 @@
 load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
 
-package(default_visibility = ["//visibility:private"])
-
 filegroup(
     name = "srcs",
     srcs = glob(["**"]),
@@ -66,17 +64,28 @@
         "//src/main/native:jni_md.h",
     ],
     linkshared = 1,
-    visibility = [
-        "//src:__pkg__",
-        "//src/test/java/com/google/devtools/build/lib:__subpackages__",
-        "//src/tools/android/java/com/google/devtools/build/android:__subpackages__",
-    ],
+    # :target-os-native-lib should be used outside of this package
+    visibility = ["//visibility:private"],
     deps = [
         ":lib-file",
         ":lib-process",
     ],
 )
 
+# Platform-independent holder for native JNI libraries (empty for non-Windows systems).
+# Targets should depend on this filegroup rather then on Platform-dependent libraries directly!
+filegroup(
+    name = "target-os-native-lib",
+    srcs = select({
+        "//src/conditions:windows": ["//src/main/native/windows:windows_jni.dll"],
+        "//conditions:default": [],
+    }),
+    visibility = [
+        "//src:__pkg__",
+        "//src/main/java/com/google/devtools/build/lib/windows/jni:__pkg__",
+    ],
+)
+
 filegroup(
     name = "embedded_java_tools",
     srcs = [
diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD
index 8e2c339..16f6a30 100644
--- a/src/test/java/com/google/devtools/build/lib/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/BUILD
@@ -28,14 +28,6 @@
 # All Windows-specific tests. Use this to exclude Windows tests from globs.
 ALL_WINDOWS_TESTS = CROSS_PLATFORM_WINDOWS_TESTS + WINDOWS_ON_WINDOWS_TESTS
 
-JNI_LIB = select({
-    "//src/conditions:windows": ["//src/main/native/windows:windows_jni.dll"],
-    "//conditions:default": [
-        "//src/main/native:libunix.dylib",
-        "//src/main/native:libunix.so",
-    ],
-})
-
 # Generate list of all srcs via:
 # bazel query 'filter("srcs", kind("filegroup rule", //src/test/java/com/google/devtools/build/lib/...))' | sort | sed -e "s/^/\"/" | sed -e "s/$/\",/" | fgrep -v "build/lib:srcs"
 filegroup(
@@ -151,7 +143,6 @@
         "vfs/util/*.java",
         "events/util/*.java",
     ]),
-    data = JNI_LIB,
     deps = [
         ":guava_junit_truth",
         ":testutil",
@@ -537,7 +528,7 @@
     data = [
         ":MockSubprocess_deploy.jar",
         ":printarg",
-    ] + JNI_LIB,
+    ],
     jvm_flags = [
         "-Dbazel.windows_unix_root=C:/fake/msys",
     ],
diff --git a/src/tools/android/java/com/google/devtools/build/android/BUILD.tools b/src/tools/android/java/com/google/devtools/build/android/BUILD.tools
index 44d932a..dec8b41 100644
--- a/src/tools/android/java/com/google/devtools/build/android/BUILD.tools
+++ b/src/tools/android/java/com/google/devtools/build/android/BUILD.tools
@@ -7,10 +7,6 @@
 
 java_binary(
     name = "ResourceProcessorBusyBox",
-    data = select({
-        "//src/conditions:windows": ["//src/main/native/windows:windows_jni.dll"],
-        "//conditions:default": [],
-    }),
     jvm_flags = [
         # quiet warnings from com.google.protobuf.UnsafeUtil,
         # see: https://github.com/google/protobuf/issues/3781
diff --git a/src/tools/android/java/com/google/devtools/build/android/junctions/BUILD b/src/tools/android/java/com/google/devtools/build/android/junctions/BUILD
index 172f9ec..272204f 100644
--- a/src/tools/android/java/com/google/devtools/build/android/junctions/BUILD
+++ b/src/tools/android/java/com/google/devtools/build/android/junctions/BUILD
@@ -31,10 +31,6 @@
 java_library(
     name = "junctions",
     srcs = glob(["*.java"]),
-    data = select({
-        "//src/conditions:windows": ["//src/main/native/windows:windows_jni.dll"],
-        "//conditions:default": [],
-    }),
     visibility = [
         ":android-prod",
         ":android-tests",
diff --git a/src/tools/remote/src/main/java/com/google/devtools/build/remote/worker/BUILD b/src/tools/remote/src/main/java/com/google/devtools/build/remote/worker/BUILD
index 8bbcd3d..20d58c5 100644
--- a/src/tools/remote/src/main/java/com/google/devtools/build/remote/worker/BUILD
+++ b/src/tools/remote/src/main/java/com/google/devtools/build/remote/worker/BUILD
@@ -11,7 +11,6 @@
 java_library(
     name = "worker",
     srcs = glob(["*.java"]),
-    data = ["//src:libunix"],
     resources = ["//src/main/tools:linux-sandbox"],
     visibility = ["//src/tools/remote:__subpackages__"],
     deps = [