diff --git a/core/install_jni_libs.mk b/core/install_jni_libs.mk index 01f7f101ea..515d34f750 100644 --- a/core/install_jni_libs.mk +++ b/core/install_jni_libs.mk @@ -13,10 +13,10 @@ my_embed_jni := ifneq ($(TARGET_BUILD_APPS),) -my_embed_jni := true + my_embed_jni := true endif ifneq ($(filter tests samples, $(LOCAL_MODULE_TAGS)),) -my_embed_jni := true + my_embed_jni := true endif # If the APK is not installed in one of the following partitions, force its libraries @@ -29,13 +29,13 @@ supported_partition_patterns := \ $(TARGET_OUT_PRODUCT_SERVICES)/% \ ifeq ($(filter $(supported_partition_patterns),$(my_module_path)),) - my_embed_jni := true + my_embed_jni := true endif # If we're installing this APP as a compressed module, we include all JNI libraries # in the compressed artifact, rather than as separate files on the partition in question. ifdef LOCAL_COMPRESSED_MODULE -my_embed_jni := true + my_embed_jni := true endif jni_shared_libraries := @@ -50,56 +50,56 @@ my_2nd_arch_prefix := my_add_jni := # The module is built for TARGET_ARCH ifeq ($(my_2nd_arch_prefix),$(LOCAL_2ND_ARCH_VAR_PREFIX)) -my_add_jni := true + my_add_jni := true endif # Or it explicitly requires both ifeq ($(my_module_multilib),both) -my_add_jni := true + my_add_jni := true endif ifeq ($(my_add_jni),true) -my_prebuilt_jni_libs := $(LOCAL_PREBUILT_JNI_LIBS_$(TARGET_ARCH)) -ifndef my_prebuilt_jni_libs -my_prebuilt_jni_libs := $(LOCAL_PREBUILT_JNI_LIBS) -endif -include $(BUILD_SYSTEM)/install_jni_libs_internal.mk -jni_shared_libraries += $(my_jni_shared_libraries) -jni_shared_libraries_abis += $(my_jni_shared_libraries_abi) -jni_shared_libraries_with_abis += $(addprefix $(my_jni_shared_libraries_abi):,\ - $(my_jni_shared_libraries)) -embedded_prebuilt_jni_libs += $(my_embedded_prebuilt_jni_libs) + my_prebuilt_jni_libs := $(LOCAL_PREBUILT_JNI_LIBS_$(TARGET_ARCH)) + ifndef my_prebuilt_jni_libs + my_prebuilt_jni_libs := $(LOCAL_PREBUILT_JNI_LIBS) + endif + include $(BUILD_SYSTEM)/install_jni_libs_internal.mk + jni_shared_libraries += $(my_jni_shared_libraries) + jni_shared_libraries_abis += $(my_jni_shared_libraries_abi) + jni_shared_libraries_with_abis += $(addprefix $(my_jni_shared_libraries_abi):,\ + $(my_jni_shared_libraries)) + embedded_prebuilt_jni_libs += $(my_embedded_prebuilt_jni_libs) -# Include RS dynamically-generated libraries as well -# TODO: Add multilib support once RS supports generating multilib libraries. -jni_shared_libraries += $(rs_compatibility_jni_libs) -jni_shared_libraries_with_abis += $(addprefix $(my_jni_shared_libraries_abi):,\ - $(rs_compatibility_jni_libs)) + # Include RS dynamically-generated libraries as well + # TODO: Add multilib support once RS supports generating multilib libraries. + jni_shared_libraries += $(rs_compatibility_jni_libs) + jni_shared_libraries_with_abis += $(addprefix $(my_jni_shared_libraries_abi):,\ + $(rs_compatibility_jni_libs)) endif # my_add_jni ####################################### # For TARGET_2ND_ARCH ifdef TARGET_2ND_ARCH -my_2nd_arch_prefix := $(TARGET_2ND_ARCH_VAR_PREFIX) -my_add_jni := -# The module is built for TARGET_2ND_ARCH -ifeq ($(my_2nd_arch_prefix),$(LOCAL_2ND_ARCH_VAR_PREFIX)) -my_add_jni := true -endif -# Or it explicitly requires both -ifeq ($(my_module_multilib),both) -my_add_jni := true -endif -ifeq ($(my_add_jni),true) -my_prebuilt_jni_libs := $(LOCAL_PREBUILT_JNI_LIBS_$(TARGET_2ND_ARCH)) -ifndef my_prebuilt_jni_libs -my_prebuilt_jni_libs := $(LOCAL_PREBUILT_JNI_LIBS) -endif -include $(BUILD_SYSTEM)/install_jni_libs_internal.mk -jni_shared_libraries += $(my_jni_shared_libraries) -jni_shared_libraries_abis += $(my_jni_shared_libraries_abi) -jni_shared_libraries_with_abis += $(addprefix $(my_jni_shared_libraries_abi):,\ - $(my_jni_shared_libraries)) -embedded_prebuilt_jni_libs += $(my_embedded_prebuilt_jni_libs) -endif # my_add_jni + my_2nd_arch_prefix := $(TARGET_2ND_ARCH_VAR_PREFIX) + my_add_jni := + # The module is built for TARGET_2ND_ARCH + ifeq ($(my_2nd_arch_prefix),$(LOCAL_2ND_ARCH_VAR_PREFIX)) + my_add_jni := true + endif + # Or it explicitly requires both + ifeq ($(my_module_multilib),both) + my_add_jni := true + endif + ifeq ($(my_add_jni),true) + my_prebuilt_jni_libs := $(LOCAL_PREBUILT_JNI_LIBS_$(TARGET_2ND_ARCH)) + ifndef my_prebuilt_jni_libs + my_prebuilt_jni_libs := $(LOCAL_PREBUILT_JNI_LIBS) + endif + include $(BUILD_SYSTEM)/install_jni_libs_internal.mk + jni_shared_libraries += $(my_jni_shared_libraries) + jni_shared_libraries_abis += $(my_jni_shared_libraries_abi) + jni_shared_libraries_with_abis += $(addprefix $(my_jni_shared_libraries_abi):,\ + $(my_jni_shared_libraries)) + embedded_prebuilt_jni_libs += $(my_embedded_prebuilt_jni_libs) + endif # my_add_jni endif # TARGET_2ND_ARCH jni_shared_libraries := $(strip $(jni_shared_libraries)) diff --git a/core/install_jni_libs_internal.mk b/core/install_jni_libs_internal.mk index a79a49a7f0..eac0414130 100644 --- a/core/install_jni_libs_internal.mk +++ b/core/install_jni_libs_internal.mk @@ -12,117 +12,117 @@ # my_embedded_prebuilt_jni_libs, prebuilt jni libs embedded in prebuilt apk. # -my_jni_shared_libraries := \ +my_jni_shared_libraries := $(strip \ $(foreach lib,$(LOCAL_JNI_SHARED_LIBRARIES), \ - $(call intermediates-dir-for,SHARED_LIBRARIES,$(lib),,,$(my_2nd_arch_prefix))/$(lib).so) + $(call intermediates-dir-for,SHARED_LIBRARIES,$(lib),,,$(my_2nd_arch_prefix))/$(lib).so)) # App-specific lib path. my_app_lib_path := $(dir $(LOCAL_INSTALLED_MODULE))lib/$(TARGET_$(my_2nd_arch_prefix)ARCH) my_embedded_prebuilt_jni_libs := ifdef my_embed_jni -# App explicitly requires the prebuilt NDK stl shared libraies. -# The NDK stl shared libraries should never go to the system image. -ifeq ($(LOCAL_NDK_STL_VARIANT),c++_shared) -ifndef LOCAL_SDK_VERSION -$(error LOCAL_SDK_VERSION must be defined with LOCAL_NDK_STL_VARIANT, \ - LOCAL_PACKAGE_NAME=$(LOCAL_PACKAGE_NAME)) -endif -my_jni_shared_libraries += \ - $(HISTORICAL_NDK_VERSIONS_ROOT)/$(LOCAL_NDK_VERSION)/sources/cxx-stl/llvm-libc++/libs/$(TARGET_$(my_2nd_arch_prefix)CPU_ABI)/libc++_shared.so -endif + # App explicitly requires the prebuilt NDK stl shared libraies. + # The NDK stl shared libraries should never go to the system image. + ifeq ($(LOCAL_NDK_STL_VARIANT),c++_shared) + ifndef LOCAL_SDK_VERSION + $(error LOCAL_SDK_VERSION must be defined with LOCAL_NDK_STL_VARIANT, \ + LOCAL_PACKAGE_NAME=$(LOCAL_PACKAGE_NAME)) + endif + my_jni_shared_libraries += \ + $(HISTORICAL_NDK_VERSIONS_ROOT)/$(LOCAL_NDK_VERSION)/sources/cxx-stl/llvm-libc++/libs/$(TARGET_$(my_2nd_arch_prefix)CPU_ABI)/libc++_shared.so + endif -# Set the abi directory used by the local JNI shared libraries. -# (Doesn't change how the local shared libraries are compiled, just -# sets where they are stored in the apk.) -ifeq ($(LOCAL_JNI_SHARED_LIBRARIES_ABI),) + # Set the abi directory used by the local JNI shared libraries. + # (Doesn't change how the local shared libraries are compiled, just + # sets where they are stored in the apk.) + ifeq ($(LOCAL_JNI_SHARED_LIBRARIES_ABI),) my_jni_shared_libraries_abi := $(TARGET_$(my_2nd_arch_prefix)CPU_ABI) -else + else my_jni_shared_libraries_abi := $(LOCAL_JNI_SHARED_LIBRARIES_ABI) -endif + endif -else # not my_embed_jni +else ifneq ($(my_jni_shared_libraries),) # not my_embed_jni -my_jni_shared_libraries := $(strip $(my_jni_shared_libraries)) -ifneq ($(my_jni_shared_libraries),) -# The jni libaries will be installed to the system.img. -my_jni_filenames := $(notdir $(my_jni_shared_libraries)) -# Make sure the JNI libraries get installed -my_shared_library_path := $(call get_non_asan_path,\ - $($(my_2nd_arch_prefix)TARGET_OUT$(partition_tag)_SHARED_LIBRARIES)) -# Do not use order-only dependency, because we want to rebuild the image if an jni is updated. -my_installed_library := $(addprefix $(my_shared_library_path)/, $(my_jni_filenames)) -$(LOCAL_INSTALLED_MODULE) : $(my_installed_library) -ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(my_installed_library) + # The jni libaries will be installed to the system.img. + my_jni_filenames := $(notdir $(my_jni_shared_libraries)) + # Make sure the JNI libraries get installed + my_shared_library_path := $(call get_non_asan_path,\ + $($(my_2nd_arch_prefix)TARGET_OUT$(partition_tag)_SHARED_LIBRARIES)) + my_installed_library := $(addprefix $(my_shared_library_path)/, $(my_jni_filenames)) + # Do not use order-only dependency, because we want to rebuild the image if an jni is updated. + $(LOCAL_INSTALLED_MODULE) : $(my_installed_library) -# Create symlink in the app specific lib path -# Skip creating this symlink when running the second part of a target sanitization build. -ifeq ($(filter address,$(SANITIZE_TARGET)),) -ifdef LOCAL_POST_INSTALL_CMD -# Add a shell command separator -LOCAL_POST_INSTALL_CMD += ; -endif + ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(my_installed_library) -my_symlink_target_dir := $(patsubst $(PRODUCT_OUT)%,%,\ - $(my_shared_library_path)) -LOCAL_POST_INSTALL_CMD += \ - mkdir -p $(my_app_lib_path) \ - $(foreach lib, $(my_jni_filenames), ;ln -sf $(my_symlink_target_dir)/$(lib) $(my_app_lib_path)/$(lib)) -$(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD := $(LOCAL_POST_INSTALL_CMD) -else -ifdef LOCAL_POST_INSTALL_CMD -$(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD := $(LOCAL_POST_INSTALL_CMD) -endif -endif + # Create symlink in the app specific lib path + # Skip creating this symlink when running the second part of a target sanitization build. + ifeq ($(filter address,$(SANITIZE_TARGET)),) + ifdef LOCAL_POST_INSTALL_CMD + # Add a shell command separator + LOCAL_POST_INSTALL_CMD += ; + endif -# Clear jni_shared_libraries to not embed it into the apk. -my_jni_shared_libraries := -endif # $(my_jni_shared_libraries) not empty + my_symlink_target_dir := $(patsubst $(PRODUCT_OUT)%,%,\ + $(my_shared_library_path)) + LOCAL_POST_INSTALL_CMD += \ + mkdir -p $(my_app_lib_path) \ + $(foreach lib, $(my_jni_filenames), ;ln -sf $(my_symlink_target_dir)/$(lib) $(my_app_lib_path)/$(lib)) + $(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD := $(LOCAL_POST_INSTALL_CMD) + else + ifdef LOCAL_POST_INSTALL_CMD + $(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD := $(LOCAL_POST_INSTALL_CMD) + endif + endif + + # Clear jni_shared_libraries to not embed it into the apk. + my_jni_shared_libraries := endif # my_embed_jni ifdef my_prebuilt_jni_libs -# Files like @lib//libfoo.so (path inside the apk) are JNI libs embedded prebuilt apk; -# Files like path/to/libfoo.so (path relative to LOCAL_PATH) are prebuilts in the source tree. -my_embedded_prebuilt_jni_libs := $(patsubst @%,%, \ - $(filter @%, $(my_prebuilt_jni_libs))) + # Files like @lib//libfoo.so (path inside the apk) are JNI libs embedded prebuilt apk; + # Files like path/to/libfoo.so (path relative to LOCAL_PATH) are prebuilts in the source tree. + my_embedded_prebuilt_jni_libs := $(patsubst @%,%, \ + $(filter @%, $(my_prebuilt_jni_libs))) -# prebuilt JNI exsiting as separate source files. -my_prebuilt_jni_libs := $(addprefix $(LOCAL_PATH)/, \ - $(filter-out @%, $(my_prebuilt_jni_libs))) -ifdef my_prebuilt_jni_libs -ifdef my_embed_jni -# Embed my_prebuilt_jni_libs to the apk -my_jni_shared_libraries += $(my_prebuilt_jni_libs) -else # not my_embed_jni -# Install my_prebuilt_jni_libs as separate files. -$(foreach lib, $(my_prebuilt_jni_libs), \ - $(eval $(call copy-one-file, $(lib), $(my_app_lib_path)/$(notdir $(lib))))) + # prebuilt JNI exsiting as separate source files. + my_prebuilt_jni_libs := $(addprefix $(LOCAL_PATH)/, \ + $(filter-out @%, $(my_prebuilt_jni_libs))) + ifdef my_prebuilt_jni_libs + ifdef my_embed_jni + # Embed my_prebuilt_jni_libs to the apk + my_jni_shared_libraries += $(my_prebuilt_jni_libs) + else # not my_embed_jni + # Install my_prebuilt_jni_libs as separate files. + $(foreach lib, $(my_prebuilt_jni_libs), \ + $(eval $(call copy-one-file, $(lib), $(my_app_lib_path)/$(notdir $(lib))))) -my_installed_library := $(addprefix $(my_app_lib_path)/, $(notdir $(my_prebuilt_jni_libs))) -$(LOCAL_INSTALLED_MODULE) : $(my_installed_library) -ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(my_installed_library) -endif # my_embed_jni -endif # inner my_prebuilt_jni_libs + my_installed_library := $(addprefix $(my_app_lib_path)/, $(notdir $(my_prebuilt_jni_libs))) + $(LOCAL_INSTALLED_MODULE) : $(my_installed_library) + + ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(my_installed_library) + endif # my_embed_jni + endif # inner my_prebuilt_jni_libs endif # outer my_prebuilt_jni_libs # Verify that all included libraries are built against the NDK include $(BUILD_SYSTEM)/allowed_ndk_types.mk + ifneq ($(strip $(LOCAL_JNI_SHARED_LIBRARIES)),) -ifneq ($(LOCAL_SDK_VERSION),) -my_link_type := app:sdk -my_warn_types := native:platform $(my_warn_ndk_types) -my_allowed_types := $(my_allowed_ndk_types) + ifneq ($(LOCAL_SDK_VERSION),) + my_link_type := app:sdk + my_warn_types := native:platform $(my_warn_ndk_types) + my_allowed_types := $(my_allowed_ndk_types) ifneq (,$(filter true,$(LOCAL_VENDOR_MODULE) $(LOCAL_ODM_MODULE) $(LOCAL_PROPRIETARY_MODULE))) - my_allowed_types += native:vendor native:vndk native:platform_vndk + my_allowed_types += native:vendor native:vndk native:platform_vndk endif -else -my_link_type := app:platform -my_warn_types := $(my_warn_ndk_types) -my_allowed_types := $(my_allowed_ndk_types) native:platform native:vendor native:vndk native:vndk_private native:platform_vndk -endif + else + my_link_type := app:platform + my_warn_types := $(my_warn_ndk_types) + my_allowed_types := $(my_allowed_ndk_types) native:platform native:vendor native:vndk native:vndk_private native:platform_vndk + endif -my_link_deps := $(addprefix SHARED_LIBRARIES:,$(LOCAL_JNI_SHARED_LIBRARIES)) + my_link_deps := $(addprefix SHARED_LIBRARIES:,$(LOCAL_JNI_SHARED_LIBRARIES)) -my_common := -include $(BUILD_SYSTEM)/link_type.mk + my_common := + include $(BUILD_SYSTEM)/link_type.mk endif