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