内容简介:C/C++语言基础 –> JNI编程 –> NDK编程 –> 音视频处理 –> 图像处理等等 ,从零到一 , 零基础学习NDK开发 。学习本专题 , 你需要具备一定的Android开发知识 C/C++基础, 知道如何创建一个Android工程 , 有一定的开发经验更佳 。Android的Android.mk就是一段段的MakeFile单元,在早期eclipse 上NDK开发用到的,很多第三方库直接提供makefile文件,我们需要能够大致读懂makefile文件,比如增量更新库的bsdiff库提供的make
C/C++语言基础 –> JNI编程 –> NDK编程 –> 音视频处理 –> 图像处理等等 ,从零到一 , 零基础学习NDK开发 。学习本专题 , 你需要具备一定的Android开发知识 C/C++基础, 知道如何创建一个Android工程 , 有一定的开发经验更佳 。
前言
为什么需要了解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文件
此时cpp文件并没有像 java 文件变亮.
然后最重要的是配置gradle文件,这是早期的写法,使用makefile文件,后面会讲到cmake的配置
APP_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库文件
下一篇,讲解MakeFile的详细配置
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。