diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/BUILD b/src/main/java/com/google/devtools/build/lib/rules/java/BUILD
index 4f9a49d..cb1c28c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/BUILD
@@ -142,7 +142,7 @@
         "JavaInfo.java",
         "JavaInfoBuildHelper.java",
         "JavaLibraryHelper.java",
-        "JavaNativeLibraryProvider.java",
+        "JavaNativeLibraryInfo.java",
         "JavaOptions.java",
         "JavaPackageConfigurationProvider.java",
         "JavaPluginInfoProvider.java",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
index 3fb222a..148079d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
@@ -379,7 +379,7 @@
   /**
    * Returns transitive Java native libraries.
    *
-   * @see JavaNativeLibraryProvider
+   * @see JavaNativeLibraryInfo
    */
   protected NestedSet<LibraryToLink> collectTransitiveJavaNativeLibraries() {
     NativeLibraryNestedSetBuilder builder = new NativeLibraryNestedSetBuilder();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
index d427a8a..c6f6e2d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
@@ -157,9 +157,7 @@
             JavaStarlarkApiProvider.NAME, JavaStarlarkApiProvider.fromRuleContext())
         .addNativeDeclaredProvider(javaInfo)
         .add(RunfilesProvider.class, RunfilesProvider.simple(runfiles))
-        .add(
-            JavaNativeLibraryProvider.class,
-            new JavaNativeLibraryProvider(transitiveJavaNativeLibraries))
+        .addNativeDeclaredProvider(new JavaNativeLibraryInfo(transitiveJavaNativeLibraries))
         .addNativeDeclaredProvider(new ProguardSpecProvider(proguardSpecs))
         .addOutputGroup(JavaSemantics.SOURCE_JARS_OUTPUT_GROUP, transitiveJavaSourceJars)
         .addOutputGroup(OutputGroupInfo.HIDDEN_TOP_LEVEL, proguardSpecs)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
index 5b99dcc..756fc0a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
@@ -201,7 +201,7 @@
             RunfilesProvider.simple(
                 JavaCommon.getRunfiles(ruleContext, semantics, javaArtifacts, neverLink)))
         .setFilesToBuild(filesToBuild)
-        .addProvider(new JavaNativeLibraryProvider(transitiveJavaNativeLibraries))
+        .addNativeDeclaredProvider(new JavaNativeLibraryInfo(transitiveJavaNativeLibraries))
         .addProvider(JavaSourceInfoProvider.fromJavaTargetAttributes(attributes, semantics))
         .addNativeDeclaredProvider(new ProguardSpecProvider(proguardSpecs))
         .addNativeDeclaredProvider(javaInfo)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaNativeLibraryInfo.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaNativeLibraryInfo.java
new file mode 100644
index 0000000..7ed44aa
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaNativeLibraryInfo.java
@@ -0,0 +1,91 @@
+// Copyright 2014 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.rules.java;
+
+import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.collect.nestedset.Depset;
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
+import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.packages.BuiltinProvider;
+import com.google.devtools.build.lib.packages.NativeInfo;
+import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
+import com.google.devtools.build.lib.skylarkbuildapi.java.JavaNativeLibraryInfoApi;
+import com.google.devtools.build.lib.syntax.EvalException;
+
+/**
+ * A target that provides native libraries in the transitive closure of its deps that are needed for
+ * executing Java code.
+ */
+@Immutable
+@AutoCodec
+public final class JavaNativeLibraryInfo
+    extends NativeInfo implements JavaNativeLibraryInfoApi<Artifact, LibraryToLink> {
+
+  public static final Provider PROVIDER = new Provider();
+
+  private final NestedSet<LibraryToLink> transitiveJavaNativeLibraries;
+
+  public JavaNativeLibraryInfo(NestedSet<LibraryToLink> transitiveJavaNativeLibraries) {
+    super(PROVIDER);
+    this.transitiveJavaNativeLibraries = transitiveJavaNativeLibraries;
+  }
+
+  /**
+   * Collects native libraries in the transitive closure of its deps that are needed for executing
+   * Java code.
+   */
+  NestedSet<LibraryToLink> getTransitiveJavaNativeLibraries() {
+    return transitiveJavaNativeLibraries;
+  }
+
+  @Override
+  public Depset /*<LibraryToLink>*/ getTransitiveJavaNativeLibrariesForStarlark() {
+    return Depset.of(LibraryToLink.TYPE, transitiveJavaNativeLibraries);
+  }
+
+  public static JavaNativeLibraryInfo merge(Iterable<JavaNativeLibraryInfo> deps) {
+    NestedSetBuilder<LibraryToLink> transitiveSourceJars = NestedSetBuilder.stableOrder();
+
+    for (JavaNativeLibraryInfo wrapper : deps) {
+      transitiveSourceJars.addTransitive(wrapper.getTransitiveJavaNativeLibraries());
+    }
+    return new JavaNativeLibraryInfo(transitiveSourceJars.build());
+  }
+
+  /** Provider class for {@link JavaNativeLibraryInfo} objects. */
+  public static class Provider extends BuiltinProvider<JavaNativeLibraryInfo>
+      implements JavaNativeLibraryInfoApi.Provider<Artifact, LibraryToLink> {
+
+    private Provider() {
+      super(NAME, JavaNativeLibraryInfo.class);
+    }
+
+    public String getName() {
+      return NAME;
+    }
+
+    @Override
+    public JavaNativeLibraryInfo create(Depset transitiveLibraries)
+        throws EvalException {
+      return new JavaNativeLibraryInfo(
+          NestedSetBuilder.<LibraryToLink>stableOrder()
+              .addTransitive(
+                  Depset.cast(transitiveLibraries, LibraryToLink.class, "transitive_libraries"))
+              .build());
+    }
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaNativeLibraryProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaNativeLibraryProvider.java
deleted file mode 100644
index c22b68e..0000000
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaNativeLibraryProvider.java
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2014 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.rules.java;
-
-import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
-import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
-import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-
-/**
- * A target that provides native libraries in the transitive closure of its deps that are needed for
- * executing Java code.
- */
-@Immutable
-@AutoCodec
-public final class JavaNativeLibraryProvider implements TransitiveInfoProvider {
-
-  private final NestedSet<LibraryToLink> transitiveJavaNativeLibraries;
-
-  public JavaNativeLibraryProvider(NestedSet<LibraryToLink> transitiveJavaNativeLibraries) {
-    this.transitiveJavaNativeLibraries = transitiveJavaNativeLibraries;
-  }
-
-  /**
-   * Collects native libraries in the transitive closure of its deps that are needed for executing
-   * Java code.
-   */
-  public NestedSet<LibraryToLink> getTransitiveJavaNativeLibraries() {
-    return transitiveJavaNativeLibraries;
-  }
-
-  public static JavaNativeLibraryProvider merge(Iterable<JavaNativeLibraryProvider> deps) {
-    NestedSetBuilder<LibraryToLink> transitiveSourceJars = NestedSetBuilder.stableOrder();
-
-    for (JavaNativeLibraryProvider wrapper : deps) {
-      transitiveSourceJars.addTransitive(wrapper.getTransitiveJavaNativeLibraries());
-    }
-    return new JavaNativeLibraryProvider(transitiveSourceJars.build());
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/NativeLibraryNestedSetBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/java/NativeLibraryNestedSetBuilder.java
index 2ee5cd8..f994e13 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/NativeLibraryNestedSetBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/NativeLibraryNestedSetBuilder.java
@@ -52,7 +52,7 @@
 
   /** Include native Java libraries of a specified target into the nested set. */
   public NativeLibraryNestedSetBuilder addJavaTarget(TransitiveInfoCollection dep) {
-    JavaNativeLibraryProvider javaProvider = dep.getProvider(JavaNativeLibraryProvider.class);
+    JavaNativeLibraryInfo javaProvider = dep.get(JavaNativeLibraryInfo.PROVIDER);
     if (javaProvider != null) {
       builder.addTransitive(javaProvider.getTransitiveJavaNativeLibraries());
       return this;
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaNativeLibraryInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaNativeLibraryInfoApi.java
new file mode 100644
index 0000000..0d919ed
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaNativeLibraryInfoApi.java
@@ -0,0 +1,83 @@
+// Copyright 2020 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.skylarkbuildapi.java;
+
+import com.google.devtools.build.lib.collect.nestedset.Depset;
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
+import com.google.devtools.build.lib.skylarkbuildapi.core.ProviderApi;
+import com.google.devtools.build.lib.skylarkbuildapi.core.StructApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.LibraryToLinkApi;
+import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
+import net.starlark.java.annot.Param;
+import net.starlark.java.annot.StarlarkBuiltin;
+import net.starlark.java.annot.StarlarkConstructor;
+import net.starlark.java.annot.StarlarkDocumentationCategory;
+import net.starlark.java.annot.StarlarkMethod;
+
+/** A target that provides C++ {@link LibraryToLinkApi}s to be linked into Java targets. */
+@StarlarkBuiltin(
+    name = "JavaNativeLibraryInfo",
+    doc =
+        "Do not use this module. It is intended for migration purposes only. If you depend on it, "
+            + "you will be broken when it is removed."
+            + "Information about the C++ libraries to be linked into Java targets.",
+    documented = true,
+    category = StarlarkDocumentationCategory.PROVIDER)
+public interface JavaNativeLibraryInfoApi<
+        FileT extends FileApi, LibraryToLinkT extends LibraryToLinkApi<FileT>>
+    extends StructApi {
+  /** Name of this info object. */
+  String NAME = "JavaNativeLibraryInfo";
+
+  /** Returns the cc linking info */
+  @StarlarkMethod(
+      name = "transitive_libraries",
+      structField = true,
+      doc = "Returns the set of transitive LibraryToLink objects.",
+      documented = true,
+      enableOnlyWithFlag = FlagIdentifier.EXPERIMENTAL_ENABLE_ANDROID_MIGRATION_APIS)
+  Depset /*<LibraryToLinkT>*/ getTransitiveJavaNativeLibrariesForStarlark();
+
+  /** The provider implementing this can construct the JavaNativeLibraryInfo provider. */
+  @StarlarkBuiltin(
+      name = "Provider",
+      doc =
+          "Do not use this module. It is intended for migration purposes only. If you depend on "
+              + "it, you will be broken when it is removed.",
+      documented = false)
+  interface Provider<FileT extends FileApi, LibraryToLinkT extends LibraryToLinkApi<FileT>>
+      extends ProviderApi {
+
+    @StarlarkMethod(
+        name = NAME,
+        doc = "The <code>JavaNativeLibraryInfo</code> constructor.",
+        documented = true,
+        enableOnlyWithFlag = FlagIdentifier.EXPERIMENTAL_ENABLE_ANDROID_MIGRATION_APIS,
+        parameters = {
+          @Param(
+              name = "transitive_libraries",
+              doc = "The transitive set of LibraryToLink providers.",
+              positional = true,
+              named = false,
+              type = Depset.class,
+              generic1 = LibraryToLinkApi.class),
+        },
+        selfCall = true)
+    @StarlarkConstructor(objectType = JavaNativeLibraryInfoApi.class, receiverNameForDoc = NAME)
+    JavaNativeLibraryInfoApi<FileT, LibraryToLinkT> create(Depset transitiveLibraries)
+        throws EvalException;
+  }
+}
