随着Android的蓬勃发展, CPU的架构也愈来愈多. 早期只支持ARMv5, 截至目前, 支持的架构已达三类七种: ARM(ARMv5,ARMv7 (从2010年起),ARMv8), x86(x86 (从2011年起),x86_64 (从2014年起)) ,MIPS(MIPS (从2012年起),MIPS64). 众多架构使用的指令集不尽相同, 与相应的ABI关联: armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips, mips64. 因此, NDK编译不一样架构的库要选择不一样的ABI.linux
不一样ABI的分支节点在NDK根目录的toolchains目录和不一样版本SDK目录中 (个人NDK根目录为/home/ndk/android-ndk-r10e), 选择不一样的ABI主要涉及如下几点:android
$NDK: NDK根目录架构
$ABI: 相应的ABI目录名ide
$PLATFORM: SDK版本目录名工具
- 不一样的gcc编译器
- 在$NDK/toolchains/$ABI/prebuilt/linux-x86_64/bin, 例如ARMv7为 /home/ndk/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
- 不一样的g++编译器
- 在$NDK/toolchains/$ABI/prebuilt/linux-x86_64/bin, 例如ARMv7为 /home/ndk/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++
- 其余相应的工具
- 都在$NDK/toolchains/$ABI/prebuilt/linux-x86_64/bin, 寻找相应的后缀, 例如nm则是 arm-linux-androideabi-nm
- 不一样的include路径
- 包括两个部分: 架构目录 和 SDK目录
- 架构头目录: 在$NDK/toolchains/$ABI/prebuilt/linux-x86_64/include, 例如ARMv7为 /home/ndk/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/include
- SDK头目录: 在$NDK/platforms/$PLATFORM/$ABI/usr/include, 例如ARMv7,SDK版本21为 /home/ndk/android-ndk-r10e/platforms/android-21/arch-arm/usr/include
- 不一样的lib路径
- 包括两个部分: 架构目录 和 SDK目录
- 架构库目录: 在$NDK/toolchains/$ABI/prebuilt/linux-x86_64/lib, 例如ARMv7为 /home/ndk/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib
- SDK库目录: 在$NDK/platforms/$PLATFORM/$ABI/usr/lib, 例如ARMv7,SDK版本21为 /home/ndk/android-ndk-r10e/platforms/android-21/arch-arm/usr/lib
- gcc编译寻找头文件和库文件的根目录
- 在$NDK/platforms/$PLATFORM/$ABI, 例如ARMv7,SDK版本21为 /home/ndk/android-ndk-r10e/platforms/android-21/arch-arm
以上为编译过多个NDK库的总结, 属于广泛性, 但各个库又具备特殊性, 具体还要添加什么参数, 还需特殊状况特殊处理ui
学术浅薄, 不足之处, 望请指出idea
参考:spa
Android NDK 工具链的使用方法(Standalone Toolchain) .net
Android开发实践:如何设置NDK的编译选项orm