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)/current/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)/current/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$(LOCAL_INSTALLED_MODULE) : | $(addprefix $(my_shared_library_path)/, $(my_jni_filenames)) 59 60# Create symlink in the app specific lib path 61ifdef LOCAL_POST_INSTALL_CMD 62# Add a shell command separator 63LOCAL_POST_INSTALL_CMD += ; 64endif 65 66my_symlink_target_dir := $(patsubst $(PRODUCT_OUT)%,%,\ 67 $(my_shared_library_path)) 68LOCAL_POST_INSTALL_CMD += \ 69 mkdir -p $(my_app_lib_path) \ 70 $(foreach lib, $(my_jni_filenames), ;ln -sf $(my_symlink_target_dir)/$(lib) $(my_app_lib_path)/$(lib)) 71$(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD := $(LOCAL_POST_INSTALL_CMD) 72 73# Clear jni_shared_libraries to not embed it into the apk. 74my_jni_shared_libraries := 75endif # $(my_jni_shared_libraries) not empty 76endif # my_embed_jni 77 78ifdef my_prebuilt_jni_libs 79# Files like @lib/<abi>/libfoo.so (path inside the apk) are JNI libs embedded prebuilt apk; 80# Files like path/to/libfoo.so (path relative to LOCAL_PATH) are prebuilts in the source tree. 81my_embedded_prebuilt_jni_libs := $(patsubst @%,%, \ 82 $(filter @%, $(my_prebuilt_jni_libs))) 83 84# prebuilt JNI exsiting as separate source files. 85my_prebuilt_jni_libs := $(addprefix $(LOCAL_PATH)/, \ 86 $(filter-out @%, $(my_prebuilt_jni_libs))) 87ifdef my_prebuilt_jni_libs 88ifdef my_embed_jni 89# Embed my_prebuilt_jni_libs to the apk 90my_jni_shared_libraries += $(my_prebuilt_jni_libs) 91else # not my_embed_jni 92# Install my_prebuilt_jni_libs as separate files. 93$(foreach lib, $(my_prebuilt_jni_libs), \ 94 $(eval $(call copy-one-file, $(lib), $(my_app_lib_path)/$(notdir $(lib))))) 95 96$(LOCAL_INSTALLED_MODULE) : | $(addprefix $(my_app_lib_path)/, $(notdir $(my_prebuilt_jni_libs))) 97endif # my_embed_jni 98endif # inner my_prebuilt_jni_libs 99endif # outer my_prebuilt_jni_libs 100