一、概述
Android NDK(Native Development Kit)提供了一套基于c/c++开发Android应用的工具。基于c/c++开发需要STL (Standard Template Library/标准模版库)。
Android NDK开发是基于Android的,但是不绑定具体某一个Android版本,一个NDK发布版可以支持多个Android版本。
NDK开发无论静态库还是动态库,libc++都是用NDK里的发布版本打包在应用里:动态库直接在apk里带上libc++_shared.so;静态库已经把程序需要的STL的代码直接打到应用程序或其所用的native库里。
二、各个运行库
1.libc++
是LLVM c++标准库。从NDK r18之后是唯一的STL
NDK里提供了libc++的动态库和静态库:
-
动态库: libc++_shared.so
-
静态库: libc++_static.a
注意: 虽然都是LLVM的c++ STL,此处NDK里的libc++不是Android源码中编译出的c++系统STL(libc++.so),此处的libc++是基于NDK开发时,NDK中已经编译好的库。如果NDK开发的应用用到libc++_shared.so, .so会被打包到编译出的APK里;用到libc++_static.a, .a里被用到的程序会被打到使用者的程序中的。也就是发布应用时,会带着stl一起发布,不依赖Android版本内部的stl。
2.system
非完全stl,完全stl需使用上面的libc++。这是与Android发布绑定的库。
System运行库指的是Android版本里的/system/lib/libstdc++.so,提供基本的c++运行支持, 提供new/delete支持,仅提供c标准库的c++封装。
3.none
没有标准库支持。
三、NDK开发时选择STL
NDK开发时,可以用下面方式指定c++运行库。
运行库在“c++_shared”,“c++_static”,“none”或“system”中选择其一,其中“c++_shared”,“c++_static”分别对应libc++的动态库和静态库。
1.cmake编译指定STL
可以在Module级别的build.gradle文件中通过变量ANDROID_STL变量指定一个运行库:“c++_shared”,“c++_static”,“none”或“system”中选择其一。
不通过ANDROID_STL指定STL的情况下缺省是c++_static。
2.ndk-build里指定STL
可以在Application.mk文件中通过变量APP_STL变量指定一个运行库:“c++_shared”,“c++_static”,“none”或“system”中选择其一。
如果未设置,默认为none
3.clang编译指定STL
clang编译可以直接指定link flag。默认是c++_shared。如果要指定静态库,用“-static-libstdc++”(这里只是链接选项,不是源码编译时的libstdc++,这里选择的实际是c++_static)。