@ltlovezh
2020-04-01T09:59:28.000000Z
字数 2284
阅读 2349
NDK Cmake
CMake与NDK搭配使用时,可以配置的部分变量:
1. ANDROID_PLATFORM:指定Android的目标版本,对应$NDK/platforms/目录下的版本。通常情况下是defaultConfig中的minSdkVersion,这样就能确保所有大于等于minSdkVersion的设备都可以使用编译生成的库。 但是也有例外,比如:当ANDROID_ABI=arm64-v8a时,即使minSdkVersion为18,但是ANDROID_PLATFORM=android-21,因为从API21开始才支持64位库。这里的版本直接决定了使用$NDK/platforms目录下哪个系统版本的库和头文件。
2. ANDROID_STL:指定使用的STL库,STL库不是Android系统自带的,若使用静态库(c++_static),则会链接进目标库;若使用动态库(c++_shared),Gradle会将动态库(libc++_shared.so)和目标库一起打包。详情可参考C++ 库支持。
3. ANDROID_ARM_NEON:指定CMake是否构建支持NEON的目标库。API大于等于23时,默认值为true,否则为false。
Cmake编译时,是通过$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin下的交叉编译工具进行编译和链接,arm-linux-androideabi-4.9表示对应abi架构和位数,例如:arm64就是aarch64-linux-android-4.9。
而链接时所依赖的系统库,则是在$NDK/platforms/${ANDROID_PLATFORM}/${abi}/usr/lib目录下。
用于Android CMake的关键构建参数。这些构建参数并非由开发者设置。相反,Android Plugin for Gradle会根据您项目的build.gradle配置,设置这些参数。
1. ANDROID_NDK:NDK的绝对目录,根据local.properties中的ndk.dir属性去设置。
上述-D的变量,都可以在CMakeLists.txt中直接访问,例如:${ANDROID_NDK}。
Ndk包含3部分内容:
一个Android Library,添加NDK的支持,仅需要在模块级build.gradle添加相关配置,然后剩下的事情就交给Cmake了,至于NDK的代码位置理论上可以在任何位置。
一个Android Library 包含的so文件由两部分组成,一个是该Library指定的CmakeList文件生成的so文件,另外一个是通过jniLibs.srcDirs
指定的目录中的so库文件。
cpufeatures模块位于$ANDROID_NDK/sources/android/cpufeatures目录下,可以用于判断设备的CPU信息,可参考cpufeatures。
/* A list of valid values returned by android_getCpuFamily().* They describe the CPU Architecture of the current process.*/typedef enum {ANDROID_CPU_FAMILY_UNKNOWN = 0,ANDROID_CPU_FAMILY_ARM,ANDROID_CPU_FAMILY_X86,ANDROID_CPU_FAMILY_MIPS,ANDROID_CPU_FAMILY_ARM64,ANDROID_CPU_FAMILY_X86_64,ANDROID_CPU_FAMILY_MIPS64,ANDROID_CPU_FAMILY_MAX /* do not remove */} AndroidCpuFamily;/* Return the CPU family of the current process.* 对于64位系统上的32位程序,此函数返回32位架构*/extern AndroidCpuFamily android_getCpuFamily(void);/* Return the number of CPU cores detected on this device.* 可能高于实际在线的核心数*/extern int android_getCpuCount(void);/** 返回一组位标记,每个标记代表一个CPU系列特定的功能,需要结合android_getCpuFamily的返回值来判断这些位标记,即不同的CPU架构,这里的位标记表示不同含义。*/extern uint64_t android_getCpuFeatures(void);
