Android NDK中C++ STL

  • Post author:
  • Post category:其他

一、概述

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)。


版权声明:本文为weixin_42600398原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。