如何通过命令行构建并校验适配Android 16KB内存页的NDK库
如何通过命令行构建并校验适配Android 16KB内存页的NDK库
嘿,我完全懂你对命令行的偏爱——IDE那些层层嵌套的构建系统确实容易让人摸不着头脑,咱们直接用NDK命令行一步步搞定16KB内存页适配的问题,简单直接:
一、构建时添加链接器参数
要让共享库支持16KB内存页,核心是告诉链接器设置正确的页大小参数。目前只有ARM64架构的Android设备会采用16KB内存页,所以咱们针对这个架构做调整,给链接器传递两个关键参数:max-page-size=16384和common-page-size=16384(16384就是16KB对应的字节数)。
1. 直接调用clang工具链编译
如果你习惯手动调用NDK的clang编译链接,命令可以这么写:
# 替换成你的NDK路径、主机架构标签和目标API等级 $ ${NDK_PATH}/toolchains/llvm/prebuilt/${HOST_TAG}/bin/aarch64-linux-android21-clang \ -shared -fPIC \ -Wl,-z,max-page-size=16384,-z,common-page-size=16384 \ your_source.c your_other_source.cpp \ -o libyourlib.so
${NDK_PATH}:你的NDK安装路径,比如~/android-ndk-r26${HOST_TAG}:根据操作系统选择,Linux用linux-x86_64,macOS用darwin-x86_64或darwin-aarch64aarch64-linux-android21:这里的21是目标Android API等级,可根据你的需求调整
2. 用ndk-build构建(Android.mk配置)
如果你用ndk-build而不是直接调用clang,只需要在Android.mk里给目标库添加链接器参数:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := yourlib LOCAL_SRC_FILES := your_source.c your_other_source.cpp # 加入16KB内存页适配参数 LOCAL_LDFLAGS += -Wl,-z,max-page-size=16384,-z,common-page-size=16384 include $(BUILD_SHARED_LIBRARY)
然后正常运行ndk-build命令即可:
$ ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk
二、校验库是否成功适配
构建完成后,咱们用NDK自带的工具验证一下,确保页大小参数已经生效:
用readelf查看库的ELF头信息,直接过滤关键内容:
$ ${NDK_PATH}/toolchains/llvm/prebuilt/${HOST_TAG}/bin/aarch64-linux-android-readelf -Wl libyourlib.so | grep -E "(MaxPageSize|CommonPageSize|Align)"
如果输出里显示MaxPageSize和CommonPageSize都是16384,或者各个程序段的Align值为16384,就说明你的库已经完美适配16KB内存页了。
小提醒
- 只有ARM64架构需要做这个适配,32位ARM或x86架构的设备不会用16KB内存页,编译这些架构时不用加该参数。
- 确保你的NDK版本不低于r21,更早的版本可能不支持这个链接器参数。
这样全程都用命令行操作,完全不用碰那些让人头疼的IDE构建配置,是不是清爽多了?
内容来源于stack exchange




