前言
为什么需要了解MakeFile文件?
Android的Android.mk就是一段段的MakeFile单元,在早期eclipse 上NDK开发用到的,很多第三方库直接提供makefile文件,我们需要能够大致读懂makefile文件,比如增量更新库的bsdiff库提供的makefile文件。现如今Google推荐使用cmake,但是有些库使用的makefile,比如我们需要维护Android.mk或者切换到cmake.
如何将一个不是NDK的工程配置NDK开发环境?
armeabi armeabi-v7a arm64-v8a的区别?
环境
AS 3.0.1
NDK - 16(这里为什么使用16?因为NDK17版本不支持armeabi,只支持(armeabi-v7a arm64-v8a x86 x86_64),用ndk17编译出来的so库,在armeabi的手机上是运行不了的)
如何将一个不是NDK的工程配置NDK开发环境?
首先要在项目的main目录下创建cpp文件夹,然后在cpp下面创建test.c文件
image.png此时cpp文件并没有像java文件变亮.
然后最重要的是配置gradle文件,这是早期的写法,使用makefile文件,后面会讲到cmake的配置
image.pngAPP_ABI 介绍
需要生成的cpu架构(ndk r17 只支持:armeabi-v7a, arm64-v8a, x86, x86_64)
指令集 | 值 |
---|---|
基于 ARMv7 的设备上的硬件 FPU 指令 | APP_ABI := armeabi-v7a |
ARMv8 AArch64 | APP_ABI := arm64-v8a |
IA-32 | APP_ABI := x86 |
Intel64 | APP_ABI := x86_64 |
MIPS32 | APP_ABI := mips |
MIPS64 (r6) | APP_ABI := mips64 |
所有支持的指令集 | APP_ABI := all |
不同 Android 手机使用不同的 CPU,因此支持不同的指令集
armeabi
此 ABI 适用于基于 ARM、至少支持 ARMv5TE 指令集的 CPU。此 ABI 不支持硬件辅助的浮点计算。 相反,所有浮点运算都使用编译器 libgcc.a 静态库中的软件帮助程序函数。
armeabi-v7a
armeabi-v7a ABI 使用 -mfloat-abi=softfp 开关强制实施规则,要求编译器在函数调用时必须传递核心寄存器对中的所有双精度值,而不是专用浮点值。 系统可以使用 FP 寄存器执行所有内部计算。 这样可极大地加速计算。
如果要以 armeabi-v7a ABI 为目标,则必须设置下列标志:
CFLAGS= -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16
arm64-v8a
此 ABI 适用于基于 ARMv8、支持 AArch64 的 CPU。它还包含 NEON 和 VFPv4 指令集。
现在手机主要是armeabi-v7a。查看手机cpu:
adb shell cat /proc/cpuinfo
adb shell getprop ro.product.cpu.abi
apk在安装的时候,如果手机是armeabi-v7a的,则会首先查看apk中是否存在armeabi-v7a目录,如果没有就会查找armeabi。
ABI(横)/CPU(竖) | armani | armeabi-v7a | arm64-v8a | x86 | x86_64 |
---|---|---|---|---|---|
ARMV5 | 支持 | ||||
ARMV7 | 支持 | 支持 | |||
ARMV8 | 支持 | 支持 | 支持 | ||
X86 | 支持 | ||||
X86_64 | 支持 | 支持 |
在cpp文件夹下创建Android.mk文件
#源文件在的位置。宏函数 my-dir 返回当前目录(包含 Android.mk 文件本身的目录)的路径。
LOCAL_PATH := $(call my-dir)
#引入其他makefile文件。CLEAR_VARS 变量指向特殊 GNU Makefile,可为您清除许多 LOCAL_XXX 变量
#不会清理 LOCAL_PATH 变量
include $(CLEAR_VARS)
#存储您要构建的模块的名称 每个模块名称必须唯一,且不含任何空格
#如果模块名称的开头已是 lib,则构建系统不会附加额外的前缀 lib;而是按原样采用模块名称,并添加 .so 扩展名。
LOCAL_MODULE := test
#包含要构建到模块中的 C 和/或 C++ 源文件列表 以空格分开
LOCAL_SRC_FILES := test.cpp
#构建动态库
include $(BUILD_SHARED_LIBRARY)
如果在cpp下,新建了一个源文件,a.c
Android.mk 需要改成如下,将a.c 加入进去
LOCAL_SRC_FILES := test.cpp a.c
build 一下,可以看到会生成对应的arm so库文件
image.png下一篇,讲解MakeFile的详细配置
网友评论