1# Install jni libraries for one arch. 2# Input variables: 3# my_2nd_arch_prefix: indicate if this is for TARGET_2ND_ARCH. 4# my_embed_jni: indicate if we want to embed the jni libs in the apk. 5# my_prebuilt_jni_libs 6# my_installed_module_stem (from configure_module_stem.mk) 7# partition_tag (from base_rules.mk) 8# my_prebuilt_src_file (from prebuilt_internal.mk) 9# 10# Output variables: 11# my_jni_shared_libraries, my_jni_shared_libraries_abi, if we are going to embed the libraries into the apk; 12# my_embedded_prebuilt_jni_libs, prebuilt jni libs embedded in prebuilt apk. 13# 14 15my_jni_shared_libraries := \ 16 $(addprefix $($(my_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/, \ 17 $(addsuffix .so, \ 18 $(LOCAL_JNI_SHARED_LIBRARIES))) 19 20# App-specific lib path. 21my_app_lib_path := $(dir $(LOCAL_INSTALLED_MODULE))lib/$(TARGET_$(my_2nd_arch_prefix)ARCH) 22my_embedded_prebuilt_jni_libs := 23 24ifdef my_embed_jni 25# App explicitly requires the prebuilt NDK stl shared libraies. 26# The NDK stl shared libraries should never go to the system image. 27ifneq ($(filter $(LOCAL_NDK_STL_VARIANT), stlport_shared c++_shared),) 28ifndef LOCAL_SDK_VERSION 29$(error LOCAL_SDK_VERSION must be defined with LOCAL_NDK_STL_VARIANT, \ 30 LOCAL_PACKAGE_NAME=$(LOCAL_PACKAGE_NAME)) 31endif 32endif 33ifeq (stlport_shared,$(LOCAL_NDK_STL_VARIANT)) 34my_jni_shared_libraries += \ 35 $(HISTORICAL_NDK_VERSIONS_ROOT)/$(LOCAL_NDK_VERSION)/sources/cxx-stl/stlport/libs/$(TARGET_$(my_2nd_arch_prefix)CPU_ABI)/libstlport_shared.so 36else ifeq (c++_shared,$(LOCAL_NDK_STL_VARIANT)) 37my_jni_shared_libraries += \ 38 $(HISTORICAL_NDK_VERSIONS_ROOT)/$(LOCAL_NDK_VERSION)/sources/cxx-stl/llvm-libc++/libs/$(TARGET_$(my_2nd_arch_prefix)CPU_ABI)/libc++_shared.so 39endif 40 41# Set the abi directory used by the local JNI shared libraries. 42# (Doesn't change how the local shared libraries are compiled, just 43# sets where they are stored in the apk.) 44ifeq ($(LOCAL_JNI_SHARED_LIBRARIES_ABI),) 45 my_jni_shared_libraries_abi := $(TARGET_$(my_2nd_arch_prefix)CPU_ABI) 46else 47 my_jni_shared_libraries_abi := $(LOCAL_JNI_SHARED_LIBRARIES_ABI) 48endif 49 50else # not my_embed_jni 51 52my_jni_shared_libraries := $(strip $(my_jni_shared_libraries)) 53ifneq ($(my_jni_shared_libraries),) 54# The jni libaries will be installed to the system.img. 55my_jni_filenames := $(notdir $(my_jni_shared_libraries)) 56# Make sure the JNI libraries get installed 57my_shared_library_path := $($(my_2nd_arch_prefix)TARGET_OUT$(partition_tag)_SHARED_LIBRARIES) 58# Do not use order-only dependency, because we want to rebuild the image if an jni is updated. 59$(LOCAL_INSTALLED_MODULE) : $(addprefix $(my_shared_library_path)/, $(my_jni_filenames)) 60 61# Create symlink in the app specific lib path 62# Skip creating this symlink when running the second part of a target sanitization build. 63ifndef SANITIZE_TARGET 64ifdef LOCAL_POST_INSTALL_CMD 65# Add a shell command separator 66LOCAL_POST_INSTALL_CMD += ; 67endif 68 69my_symlink_target_dir := $(patsubst $(PRODUCT_OUT)%,%,\ 70 $(my_shared_library_path)) 71LOCAL_POST_INSTALL_CMD += \ 72 mkdir -p $(my_app_lib_path) \ 73 $(foreach lib, $(my_jni_filenames), ;ln -sf $(my_symlink_target_dir)/$(lib) $(my_app_lib_path)/$(lib)) 74$(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD := $(LOCAL_POST_INSTALL_CMD) 75else 76ifdef LOCAL_POST_INSTALL_CMD 77$(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD := $(LOCAL_POST_INSTALL_CMD) 78endif 79endif 80 81# Clear jni_shared_libraries to not embed it into the apk. 82my_jni_shared_libraries := 83endif # $(my_jni_shared_libraries) not empty 84endif # my_embed_jni 85 86ifdef my_prebuilt_jni_libs 87# Files like @lib/<abi>/libfoo.so (path inside the apk) are JNI libs embedded prebuilt apk; 88# Files like path/to/libfoo.so (path relative to LOCAL_PATH) are prebuilts in the source tree. 89my_embedded_prebuilt_jni_libs := $(patsubst @%,%, \ 90 $(filter @%, $(my_prebuilt_jni_libs))) 91 92# prebuilt JNI exsiting as separate source files. 93my_prebuilt_jni_libs := $(addprefix $(LOCAL_PATH)/, \ 94 $(filter-out @%, $(my_prebuilt_jni_libs))) 95ifdef my_prebuilt_jni_libs 96ifdef my_embed_jni 97# Embed my_prebuilt_jni_libs to the apk 98my_jni_shared_libraries += $(my_prebuilt_jni_libs) 99else # not my_embed_jni 100# Install my_prebuilt_jni_libs as separate files. 101$(foreach lib, $(my_prebuilt_jni_libs), \ 102 $(eval $(call copy-one-file, $(lib), $(my_app_lib_path)/$(notdir $(lib))))) 103 104$(LOCAL_INSTALLED_MODULE) : $(addprefix $(my_app_lib_path)/, $(notdir $(my_prebuilt_jni_libs))) 105endif # my_embed_jni 106endif # inner my_prebuilt_jni_libs 107endif # outer my_prebuilt_jni_libs 108 109# Verify that all included libraries are built against the NDK 110ifneq ($(strip $(LOCAL_JNI_SHARED_LIBRARIES)),) 111my_link_type := $(call intermediates-dir-for,APPS,$(LOCAL_MODULE))/$(my_2nd_arch_prefix)jni_link_type 112all_link_types: $(my_link_type) 113my_link_type_deps := $(strip \ 114 $(foreach l,$(LOCAL_JNI_SHARED_LIBRARIES),\ 115 $(call intermediates-dir-for,SHARED_LIBRARIES,$(l),,,$(my_2nd_arch_prefix))/link_type)) 116ifneq ($(LOCAL_SDK_VERSION),) 117$(my_link_type): PRIVATE_LINK_TYPE := app:sdk 118$(my_link_type): PRIVATE_WARN_TYPES := native:platform 119$(my_link_type): PRIVATE_ALLOWED_TYPES := native:ndk 120else 121$(my_link_type): PRIVATE_LINK_TYPE := app:platform 122$(my_link_type): PRIVATE_WARN_TYPES := 123$(my_link_type): PRIVATE_ALLOWED_TYPES := native:ndk native:platform 124endif 125$(eval $(call link-type-partitions,$(my_link_type))) 126$(my_link_type): PRIVATE_DEPS := $(my_link_type_deps) 127$(my_link_type): PRIVATE_MODULE := $(LOCAL_MODULE) 128$(my_link_type): PRIVATE_MAKEFILE := $(LOCAL_MODULE_MAKEFILE) 129$(my_link_type): $(my_link_type_deps) $(CHECK_LINK_TYPE) 130 @echo Check JNI module types: $@ 131 $(check-link-type) 132 133$(LOCAL_BUILT_MODULE): | $(my_link_type) 134 135my_link_type := 136my_link_type_deps := 137endif 138