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 15 my_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. 21 my_app_lib_path := $(dir $(LOCAL_INSTALLED_MODULE))lib/$(TARGET_$(my_2nd_arch_prefix)ARCH) 22 my_embedded_prebuilt_jni_libs := 23 24 ifdef 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. 27 ifneq ($(filter $(LOCAL_NDK_STL_VARIANT), stlport_shared c++_shared),) 28 ifndef LOCAL_SDK_VERSION 29 $(error LOCAL_SDK_VERSION must be defined with LOCAL_NDK_STL_VARIANT, \ 30 LOCAL_PACKAGE_NAME=$(LOCAL_PACKAGE_NAME)) 31 endif 32 endif 33 ifeq (stlport_shared,$(LOCAL_NDK_STL_VARIANT)) 34 my_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 36 else ifeq (c++_shared,$(LOCAL_NDK_STL_VARIANT)) 37 my_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 39 endif 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.) 44 ifeq ($(LOCAL_JNI_SHARED_LIBRARIES_ABI),) 45 my_jni_shared_libraries_abi := $(TARGET_$(my_2nd_arch_prefix)CPU_ABI) 46 else 47 my_jni_shared_libraries_abi := $(LOCAL_JNI_SHARED_LIBRARIES_ABI) 48 endif 49 50 else # not my_embed_jni 51 52 my_jni_shared_libraries := $(strip $(my_jni_shared_libraries)) 53 ifneq ($(my_jni_shared_libraries),) 54 # The jni libaries will be installed to the system.img. 55 my_jni_filenames := $(notdir $(my_jni_shared_libraries)) 56 # Make sure the JNI libraries get installed 57 my_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. 63 ifndef SANITIZE_TARGET 64 ifdef LOCAL_POST_INSTALL_CMD 65 # Add a shell command separator 66 LOCAL_POST_INSTALL_CMD += ; 67 endif 68 69 my_symlink_target_dir := $(patsubst $(PRODUCT_OUT)%,%,\ 70 $(my_shared_library_path)) 71 LOCAL_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) 75 else 76 ifdef LOCAL_POST_INSTALL_CMD 77 $(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD := $(LOCAL_POST_INSTALL_CMD) 78 endif 79 endif 80 81 # Clear jni_shared_libraries to not embed it into the apk. 82 my_jni_shared_libraries := 83 endif # $(my_jni_shared_libraries) not empty 84 endif # my_embed_jni 85 86 ifdef 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. 89 my_embedded_prebuilt_jni_libs := $(patsubst @%,%, \ 90 $(filter @%, $(my_prebuilt_jni_libs))) 91 92 # prebuilt JNI exsiting as separate source files. 93 my_prebuilt_jni_libs := $(addprefix $(LOCAL_PATH)/, \ 94 $(filter-out @%, $(my_prebuilt_jni_libs))) 95 ifdef my_prebuilt_jni_libs 96 ifdef my_embed_jni 97 # Embed my_prebuilt_jni_libs to the apk 98 my_jni_shared_libraries += $(my_prebuilt_jni_libs) 99 else # 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))) 105 endif # my_embed_jni 106 endif # inner my_prebuilt_jni_libs 107 endif # outer my_prebuilt_jni_libs 108 109 # Verify that all included libraries are built against the NDK 110 ifneq ($(strip $(LOCAL_JNI_SHARED_LIBRARIES)),) 111 my_link_type := $(call intermediates-dir-for,APPS,$(LOCAL_MODULE))/$(my_2nd_arch_prefix)jni_link_type 112 all_link_types: $(my_link_type) 113 my_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)) 116 ifneq ($(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 120 else 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 124 endif 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 135 my_link_type := 136 my_link_type_deps := 137 endif 138