install_jni_libs.mk revision 966c1e0cae6a59f15264d3b542af08e21e2dc06c
1# Decides how to install the jni libraries needed by an apk. 2# Input variables: 3# LOCAL_JNI_SHARED_LIBRARIES 4# LOCAL_INSTALLED_MODULE 5# rs_compatibility_jni_libs (from java.mk) 6# my_module_path (from base_rules.mk) 7# partition_tag (from base_rules.mk) 8# my_prebuilt_src_file (from prebuilt_internal.mk) 9# 10# Output variables: 11# jni_shared_libraries, jni_shared_libraries_abi, if we are going to embed the libraries into the apk; 12# my_extracted_jni_libs, if we extract jni libs from prebuilt apk. 13# 14 15jni_shared_libraries := \ 16 $(addprefix $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATE_LIBRARIES)/, \ 17 $(addsuffix .so, \ 18 $(LOCAL_JNI_SHARED_LIBRARIES))) 19 20# Include RS dynamically-generated libraries as well 21# Keep this ifneq, as the += otherwise adds spaces that need to be stripped. 22ifneq ($(rs_compatibility_jni_libs),) 23jni_shared_libraries += $(rs_compatibility_jni_libs) 24endif 25 26my_embed_jni := 27ifneq ($(TARGET_BUILD_APPS),) 28my_embed_jni := true 29endif 30ifneq ($(filter tests samples, $(LOCAL_MODULE_TAGS)),) 31my_embed_jni := true 32endif 33ifeq ($(filter $(TARGET_OUT)/% $(TARGET_OUT_VENDOR)/% $(TARGET_OUT_OEM)/%, $(my_module_path)),) 34# If this app isn't to be installed to system partitions. 35my_embed_jni := true 36endif 37 38# App-specific lib path. 39my_app_lib_path := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET$(partition_tag)_OUT_SHARED_LIBRARIES)/$(basename $(my_installed_module_stem)) 40my_extracted_jni_libs := 41 42ifdef my_embed_jni 43# App explicitly requires the prebuilt NDK stl shared libraies. 44# The NDK stl shared libraries should never go to the system image. 45ifneq ($(filter $(LOCAL_NDK_STL_VARIANT), stlport_shared c++_shared),) 46ifndef LOCAL_SDK_VERSION 47$(error LOCAL_SDK_VERSION must be defined with LOCAL_NDK_STL_VARIANT, \ 48 LOCAL_PACKAGE_NAME=$(LOCAL_PACKAGE_NAME)) 49endif 50endif 51ifeq (stlport_shared,$(LOCAL_NDK_STL_VARIANT)) 52jni_shared_libraries += \ 53 $(HISTORICAL_NDK_VERSIONS_ROOT)/current/sources/cxx-stl/stlport/libs/$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)CPU_ABI)/libstlport_shared.so 54else ifeq (c++_shared,$(LOCAL_NDK_STL_VARIANT)) 55jni_shared_libraries += \ 56 $(HISTORICAL_NDK_VERSIONS_ROOT)/current/sources/cxx-stl/llvm-libc++/libs/$(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)CPU_ABI)/libc++_shared.so 57endif 58 59# Set the abi directory used by the local JNI shared libraries. 60# (Doesn't change how the local shared libraries are compiled, just 61# sets where they are stored in the apk.) 62ifeq ($(LOCAL_JNI_SHARED_LIBRARIES_ABI),) 63 jni_shared_libraries_abi := $(TARGET_$(LOCAL_2ND_ARCH_VAR_PREFIX)CPU_ABI) 64else 65 jni_shared_libraries_abi := $(LOCAL_JNI_SHARED_LIBRARIES_ABI) 66endif 67 68else # not my_embed_jni 69 70jni_shared_libraries := $(strip $(jni_shared_libraries)) 71ifneq ($(jni_shared_libraries),) 72# The jni libaries will be installed to the system.img. 73my_jni_filenames := $(notdir $(jni_shared_libraries)) 74# Make sure the JNI libraries get installed 75$(LOCAL_INSTALLED_MODULE) : | $(addprefix $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET$(partition_tag)_OUT_SHARED_LIBRARIES)/, $(my_jni_filenames)) 76 77# Create symlink in the app specific lib path 78ifdef LOCAL_POST_INSTALL_CMD 79my_leading_separator := ; 80else 81my_leading_separator := 82endif 83$(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD += \ 84 $(my_leading_separator)mkdir -p $(my_app_lib_path) \ 85 $(foreach lib, $(my_jni_filenames), ;ln -sf ../$(lib) $(my_app_lib_path)/$(lib)) 86 87# Clear jni_shared_libraries to not embed it into the apk. 88jni_shared_libraries := 89endif # $(jni_shared_libraries) not empty 90endif # my_embed_jni 91 92ifdef LOCAL_PREBUILT_JNI_LIBS 93# Install prebuilt JNI libs to the app specific lib path. 94# Files like @path/to/libfoo.so (path inside the apk) are JNI libs extracted from the prebuilt apk; 95# Files like path/to/libfoo.so (path relative to LOCAL_PATH) are prebuilts in the source tree. 96my_extracted_jni_libs := $(patsubst @%,%, \ 97 $(filter @%, $(LOCAL_PREBUILT_JNI_LIBS))) 98ifdef my_extracted_jni_libs 99ifndef my_prebuilt_src_file 100$(error No prebuilt apk to extract prebuilt jni libraries $(my_extracted_jni_libs)) 101endif 102# We use the first jni lib file as dependency. 103my_installed_prebuilt_jni := $(my_app_lib_path)/$(notdir $(firstword $(my_extracted_jni_libs))) 104$(my_installed_prebuilt_jni): PRIVATE_JNI_LIBS := $(my_extracted_jni_libs) 105$(my_installed_prebuilt_jni): $(my_prebuilt_src_file) 106 @echo "Extract JNI libs ($@ <- $<)" 107 @mkdir -p $(dir $@) 108 $(hide) unzip -j -o -d $(dir $@) $< $(PRIVATE_JNI_LIBS) && touch $@ 109 110$(LOCAL_INSTALLED_MODULE) : | $(my_installed_prebuilt_jni) 111endif 112 113my_prebulit_jni_libs := $(addprefix $(LOCAL_PATH)/, \ 114 $(filter-out @%, $(LOCAL_PREBUILT_JNI_LIBS))) 115ifdef my_prebulit_jni_libs 116$(foreach lib, $(my_prebulit_jni_libs), \ 117 $(eval $(call copy-one-file, $(lib), $(my_app_lib_path)/$(notdir $(lib))))) 118 119$(LOCAL_INSTALLED_MODULE) : | $(addprefix $(my_app_lib_path)/, $(notdir $(my_prebulit_jni_libs))) 120endif 121endif # LOCAL_PREBULT_JNI_LIBS 122