美文网首页
Application.mk 详解

Application.mk 详解

作者: 差点长成一枚帅哥 | 来源:发表于2020-04-06 15:27 被阅读0次

    Application.mk详解

    一.Application.mk简介

    要将C\C++代码编译为SO文件,光有Android.mk文件还不行,还需要一个Application.mk文件。

    本文将对Application.mk进行非常详细介绍。

    1.作用

    Application.mk是用来确定一些编译规则的,
    它规定的不是某一个文件某一行代码,而是所有文件相关

    2.存放位置

    Application.mk和Android.mk是放在同一个目录下的。

    一般是放在src/main/jni/下
    jni是新建的文件夹,用于存放C/C++相关的代码
    jni文件夹和java文件夹是同级目录,
    如果生成的.so也是在/main下创建文件夹jniLibs,把.so放在jniLibs文件夹下

    二.Application.mk写法用法

    Application.mk的写法

    key := value
    

    Application.mk文件中里面全都是标签key和值value来定义一些属性的,
    所有我们只需要看懂里面标签的意义就知道整个Application.mk的用法了。
    比如APP_ABI,是用来确定编译成什么样处理器平台下的so文件。

    1.最简单的文件格式:

    #注释:注解*****
    APP_ABI := arm64-v8a
    APP_PLATFORM := android-21
    
    • 1.上面的#是用来注释的,//双斜杠在mk文件中是不能用作于注释的。
      1. 0APP_ABI :=后面接的是需要生成的.so平台文件,正常手机使用arm64处理器的即可。
      1. APP_PLATFORM :=后面接的是使用SDK的最低等级

    2.Application.mk的所有标签详解

    标签书写顺序没有严格定义(随意就好)。

    (1)APP_PLATFORM(必选项)

    作用:定义使用的ndk库函数版本号。

    属性值可以是: android-,其中是ndk的版本。

    一般和SDK的版本(minSdkVersion 21)相对应,NDK版本的各个版本在NDK目录(sdk\ndk-bundle\)下的platforms文件夹中

    (2)APP_ABI (必选项)

    作用:编译成什么类型的cpu的so,
    拥有三个属性值armeabi armeabi-v7a x86,可以只用一个,也可以可以全选,如果全选也可以使用all.

    写法可以是:

    中间要变成的多个so版本用空格间隔开即可
    生成两种格式

    APP_ABI := armeabi-v7a arm64-v8a
    

    或者

    APP_ABI := all
    
    关于三种cpu处理器的介绍:

    目前主流的Android设备是armeabi-v7a架构的,然后就是x86和armeabi了。
    如果同时包含了 armeabi,armeabi-v7a和x86,所有设备都可以运行,程序在运行的时候去加载不同平台对应的so,这是较为完美的一种解决方案,但是同时也会导致包变大。
    armeabi-v7a是可以兼容armeabi的,而v7a的CPU支持硬件浮点运算,目前绝大对数设备已经是armeabi-v7a了,所以为了性能上的更优,就不要为了兼容放到armeabi下了。
    x86也是可以兼容armeabi平台运行的,另外需要指出的是,打出包的x86的so,总会比armeabi平台的体积更小,对于性能有洁癖的童鞋们,还是建议在打包so的时候支持x86。

    关于使用哪种cup的问题

    如果功能简单,并且希望自己的apk小一点,编一个x86版本的so即可。
    如果想为了适应所有机型可以添加一下armeabi-v7a的版本。

    一般来说正常手机使用x86版本的即可,
    对于模拟器的话,就要看创建模拟器设置的cpu类型了。如果不确定模拟器的cpu类型,就生成多个so库即可。

    (3)APP_STL (非必选项)

    作用:如何连接c++标准库 。
    属性值:
    stlport_static 静态链接
    stlport_shared 动态链接
    system 系统默认

    如果生成的so库包含静态.a文件,这个属性要写成stlport_static,否则可以不用写。

    (4)APP_OPTIM (非必选项)

    编译版本,如果是DEBUG版本就会带上调试信息。可以使用gdb-server进行动态断点低调试。
    debug 调试版本 so中带调试信息,
    release(默认) 发布版本 so不带调试信息

    相关文章

      网友评论

          本文标题:Application.mk 详解

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