diff --git a/java/app_test.go b/java/app_test.go index 92fe2244f..d6ba0f1dd 100644 --- a/java/app_test.go +++ b/java/app_test.go @@ -2043,6 +2043,44 @@ func TestJNIPackaging(t *testing.T) { } } +func TestJNITranstiveDepsInstallation(t *testing.T) { + ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+` + android_app { + name: "app", + jni_libs: ["libjni"], + platform_apis: true, + } + + cc_library { + name: "libjni", + shared_libs: ["libplatform"], + system_shared_libs: [], + stl: "none", + required: ["librequired"], + } + + cc_library { + name: "libplatform", + system_shared_libs: [], + stl: "none", + } + + cc_library { + name: "librequired", + system_shared_libs: [], + stl: "none", + } + + `) + + app := ctx.ModuleForTests("app", "android_common") + jniLibZip := app.Output("jnilibs.zip") + android.AssertPathsEndWith(t, "embedd jni lib mismatch", []string{"libjni.so"}, jniLibZip.Implicits) + + install := app.Rule("Cp") + android.AssertPathsEndWith(t, "install dep mismatch", []string{"libplatform.so", "librequired.so"}, install.OrderOnly) +} + func TestJNISDK(t *testing.T) { ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+` cc_library { diff --git a/java/java.go b/java/java.go index 0df96a3a5..fc7e5c5a3 100644 --- a/java/java.go +++ b/java/java.go @@ -368,6 +368,17 @@ type dependencyTag struct { static bool } +var _ android.SkipToTransitiveDepsTag = (*dependencyTag)(nil) + +func (depTag dependencyTag) SkipToTransitiveDeps() bool { + // jni_libs are not installed because they are always embedded into the app. However, + // transitive deps of jni_libs themselves should be installed along with the app. + if IsJniDepTag(depTag) { + return true + } + return false +} + // installDependencyTag is a dependency tag that is annotated to cause the installed files of the // dependency to be installed when the parent module is installed. type installDependencyTag struct {