Android Studio NDK开发-其他编译选项

NDK即要支持交叉编译,还需要支持各个Android版本的编译,还有一些其他情况的编译,比如c和c++等。NDK提供了一些编译选项,用来支持不同的编译需求。
以前的NDK开发都是在Android.mkAppliction.mk中设置,现在在gradle-experimentalandroid.ndk{}设置编译选项。
其中包含了设置:编译器配置,NDK版本,Header头文件位置,gcc编译器选项等...
下面介绍下几个常用的编译选项。

platformVersion

大部分的App需要向下兼容,会设置minSdkVersion,从一个低版本的Sdk开始支持。同样的在低SDK版本上面运行的NDK也必须使用对应的NDK,就需要设置platformVersion
设置minSdkVersion为14,对应的也需要设置platformVersion也是14:

model{
    android{
        ndk{
            ....
            platfromVersion=14
        }
    }
}

也可以使用paltformVersion "android-14"设置NDK的版本。

toolchain

toolchain是NDK下的一套文件系统和工具链,主要有GCC,编译adnroid的库和工具等,是本机编译工具或交叉编译工具。
gradle中直接指定toolchaintoolchainVersion

model {
    android {
       ......
       ndk {
            ......
            toolchain "clang"
            toolchainVersion "3.5"
           }
           ......
       }
     }    

ABI

Android系统目前支持其中七种不同的CPU架构:ARMv5,ARMv7,x86,MIPS,ARMv8,MIP64,x86_64,每一种都关联着一个相应的ABI。
Application Binary interface应用程序二进制接口,定义了二进制文件(尤其是.so文件)是如何运行在相应的系统平台上的,从使用的指令集,内存到对齐到可用的系统函数库。在Android系统上,每一CPU架构对应一个ABI。
对应的.so文件会放在对应的ABI文件下面:

ABI-文件夹

一般情况下,考虑到x86系统的市场份额还太小,还有为了减少apk包的大小,可以指定支持的平台,使用abiFilters,可以选择项目支持的平台,比如只支持armabiarmeabi-v7a的配置:

...

ndk {
        ...
        abiFilters.addAll(['armabi', 'armeabi-v7a'])
        ...  
     }

 ...

ldLibs

使用NDK开发Android应用时,会使用到系统自带的库,在之前的*.mk中的LOCAL_LDLIBS就是用来引用系统库的,现在使用在Android studio中可以配置ldLibs引用系统库。
例如在项目中链接android的log:

ndk {
       ...
        ldLibs.addAll(['log'])
   }

CFlags和CppFlags

CFlag表示用于C编译器的选项。
CppFlags用来表示用于c++的编译器选项.
使用ldLibs告诉了链接器要链接那些库文件,而在CFlags和CppFlags可以用来指定.h文件的路径。
例如指定一个.h文件的目录:

 ndk {
            ...
            CFlags.addAll(['-I/usr/local/ssl/android-14/include'])
            ...
        }

CFlag也是gcc的编译选项,比如使用-Wall表示打开警告开发,-g是要生成调试信用,生成的可执行文件具有和源代码关联的可调试信息。

stl

stl是设置c++的运行时库的选项,默认使用的是libstdc++最小支持的c++库。
如果要使用gnustl_static(静态链接gnustl版本的stl)可以设置为:

 ndk {
            ...
            stl = 'gnustl_static'
            cppFlags.addAll(['-std=c++11'])
            ...
      }

这里可以看到NDK支持的对应的c++运行库,建议使用动态方法链接stl,这样可以减少apk的大小。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在Android NDK开发中,有两个重要的文件:Android.mk和Application.mk,各尽其责,指...
    f9dd77add98e阅读 14,774评论 6 15
  • Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI...
    AlphaGL阅读 9,160评论 0 24
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,734评论 25 709
  • 要说起我的老家陕西乾县,就不得不说下乾县的著名小吃—乾州四宝。乾州是乾县的旧称,这里地域辽阔,民风淳朴,物产丰富。...
    阿宝来了阅读 6,182评论 1 4
  • 气质之于女生,恬静如水,淡淡的妆容使人如沐春风;气质之于女人,一身职业装,干练的外形,走路带风,人人为之侧目。 气...
    蜗牛up666阅读 1,937评论 0 0