我有一个小型 C++ 库,必须为armeabi 和armeabi7a 进行编译。我还有一个非常大的c++库,只需要为armeabi编译。现在,它们正在针对两种架构进行编译(使用 NDK),但这使得我的 .apk 非常大。是否可以针对只为armeabi编译的大库?我该怎么做?
我的文件夹结构是这样的:
/jni/biglib/
/jni/smalllib/
/jni/Application.mk
/jni/Android.mk
我的/jni/Application.mk 文件包含:
APP_ABI := armeabi-v7a armeabi
APP_OPTIM := release
我的根/jni/Android.mk 文件组合了每个库的 Android.mk 文件:
LOCAL_PATH := $(call my-dir)
LOCAL_C_INCLUDE := $(LOCAL_PATH)/include
include $(addprefix $(LOCAL_PATH)/, $(addsuffix /Android.mk, \
biglib \
smalllib \
))
最佳答案
这绝对是可能的。有一些代码 fragment 可以帮助您继续(没有 biglib 和smallib 的 Android.mk 的确切内容,我无法为您提供更多帮助)。
1) 将 Application.mk
中的 APP_ABI
顺序更改为 APP_ABI :=armeabi armeabi-v7a
。
2) 修改您的根Android.mk
:
LOCAL_PATH := $(call my-dir)
LOCAL_C_INCLUDE := $(LOCAL_PATH)/include
# biglib is not built for armeabi-v7a
ifneq "$(TARGET_ARCH_ABI)" "armeabi-v7a"
include $(LOCAL_PATH)/biglib/Android.mk
endif
# ----- cut here -----
# Place this snippet to every module which needs biglib, or where convenient.
# Now you will link against armeabi version of biglib.
ifeq "$(TARGET_ARCH_ABI)" "armeabi-v7a"
LOCAL_LDFLAGS += $(LOCAL_PATH)/../obj/local/armeabi/libbigLib.so
endif
# ----- cut here -----
include $(LOCAL_PATH)/smalllib/Android.mk
仅此而已 - 您的 apk
文件现在不包含 armeabi-v7a 的 libbiglib.so
关于安卓NDK : Compiling different libraries for different architectures,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19358130/