美文网首页Android-NDK/JNINDK
NDK 开发必知必会2⃣️NDK开发环境配置与MakeFile

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

作者: 289346a467da | 来源:发表于2018-10-30 23:25 被阅读17次

    前言

    为什么需要了解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.png

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

    image.png

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

    相关文章

      网友评论

        本文标题:NDK 开发必知必会2⃣️NDK开发环境配置与MakeFile

        本文链接:https://www.haomeiwen.com/subject/bntotqtx.html