01-05 NDK 开发必知必会2⃣️NDK开发环境配置与MakeFile

栏目: C++ · 发布时间: 5年前

内容简介: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文件

01-05 NDK 开发必知必会2⃣️NDK开发环境配置与MakeFile

此时cpp文件并没有像 java 文件变亮.

然后最重要的是配置gradle文件,这是早期的写法,使用makefile文件,后面会讲到cmake的配置

01-05 NDK 开发必知必会2⃣️NDK开发环境配置与MakeFile

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库文件

01-05 NDK 开发必知必会2⃣️NDK开发环境配置与MakeFile

下一篇,讲解MakeFile的详细配置


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法竞赛入门经典

算法竞赛入门经典

刘汝佳、陈锋 / 2012-10 / 52.80元

《算法竞赛入门经典:训练指南》是《算法竞赛入门经典》的重要补充,旨在补充原书中没有涉及或者讲解得不够详细的内容,从而构建一个较完整的知识体系,并且用大量有针对性的题目,让抽象复杂的算法和数学具体化、实用化。《算法竞赛入门经典:训练指南》共6章,分别为算法设计基础、数学基础、实用数据结构、几何问题、图论算法与模型和更多算法专题,全书通过近200道例题深入浅出地介绍了上述领域的各个知识点、经典思维方式......一起来看看 《算法竞赛入门经典》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具