Android源码中的c++ STL

本文详细介绍了Android源码中内置的LLVM c++ STL和libstdc++标准库,包括libc++、libc++abi、libstdc++等模块的区别及使用方式。并通过Android.mk和Android.bp文件展示了如何指定使用特定的STL版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

田海立@CSDN 2020-11-20

Android源码中有内置的LLVM c++ STL和libstdc++标准库,为了支持内置的应用,也会选取NDK的标准库内置其中,本文介绍这些STL以及Android Source模块如何来指定其所要使用的标准库。

一、STL相关的模块

Android source中的编译单位是模块/Module,下面看stl相关的Module。

1) libc++ [Shared]
2) libc++_static [Static]
external/libcxx/Android.bp
  libc++_static.a --(whole_static_libs)--> libc++abi.a
  libc++.so       --(whole_static_libs)--> libc++_static.a

3) libc++abi [Static]
external/libcxxabi/Android.bp
  libc++abi.a

4) libstdc++.so
5) libstdc++.a
bionic/libc/Android.bp
  libstdc++.so
  libstdc++.a

6) c++_static
7) c++_shared
prebuilts/ndk/current/sources/cxx-stl/llvm-libc++/Android.mk
  c++_static
  c++_shared

libc++abi被打包在libc++中,一般不单独使用。所以,Android Source中有下列stl库相关的Module:

  • libc++/libc++_static: llvm c++ stl库。这是Android版本内置的与Android发布绑定的库
  • libstdc++:仅仅包含new/delete的库,非完全stl,完全stl需使用上面的libc++。这是与Android发布绑定的库
  • c++_static/c++_shared:这内置的NDK里的stl,与NDK发布版本里的stl对应

】虽然Android源码里的stl与内置的NDK stl都是llvm c++ stl,是llvm的某一个Build,但它们并不相同:Android版本里的跟随Android build发布;NDK发布的是要支持多个Android版本的。而且,它们的namespace是不同的,具体可参考《Android源码中c++ STL的namespace

二、程序中指定STL

Android源码中编译是通过Android.mk或Android.bp里指定

2.1 Android.mk中通过LOCAL_NDK_STL_VARIANT指定NDK STL

LOCAL_NDK_STL_VARIANT
  可选:none / system / c++_static / c++_shared
  如果未设置,默认为system
  指定了该变量,需要设置 LOCAL_SDK_VERSION
指定system
  lib: libstdc++
  include: $(my_ndk_source_root)/cxx-stl/system/include
指定c++(c++_static/c++shared)
  include: $(my_ndk_source_root)/cxx-stl/llvm-libc++/include \
           $(my_ndk_source_root)/cxx-stl/llvm-libc++abi/include \
           $(my_ndk_source_root)/android/support/include \
  lib
    c++_static:
           $(my_ndk_source_root)/cxx-stl/llvm-libc++/libs/$(my_cpu_variant)/libc++_static.a \
           $(my_ndk_source_root)/cxx-stl/llvm-libc++/libs/$(my_cpu_variant)/libc++abi.a
    c++_shared:
           $(my_ndk_source_root)/cxx-stl/llvm-libc++/libs/$(my_cpu_variant)/libc++_shared.so
           
    += $(my_ndk_source_root)/cxx-stl/llvm-libc++/libs/$(my_cpu_variant)/libandroid_support.a
    for armeabi armeabi-v7a
      += $(my_ndk_source_root)/cxx-stl/llvm-libc++/libs/$(my_cpu_variant)/libunwind.a

2.2 Android.bp里指定STL

在Android.bp中指定使用的STL,按是否指定sdk version分两种情况:

1) 指定了sdk version

stl: "" / "system" / "c++_shared" / "c++_static" / "libc++" / "libc++_static" / "none"
    ""              -> "ndk_system"
    "system"        -> "ndk_system"
    "c++_shared"    -> "ndk_libc++_shared"
    "c++_static"    -> "ndk_libc++_static"
    "libc++"        -> "ndk_libc++_shared"
    "libc++_static" -> "ndk_libc++_static"
    "none"          -> ""

:2022/03/31: 增加“system”

上面第一行是stl可以指定的标示;下面是stl标示又对应的stl。

【注】指定了sdk version,并用stl指定c++ stl时:

  1. c++_shared和libc++都是使用了NDK里的llvm动态库;c++_static和libc++_static都是使用了NDK里的llvm静态库
  2. 如果指定了空,使用的是NDK里的system库

2) 未指定sdk version

stl: "libc++" / "libc++_static" / “c++_shared” / “c++_static” / "none" / "" / "
system"
    "libc++"        -> "libc++"
    "libc++_static" -> "libc++static"
    "c++_shared"    -> "libc++"
    "c++_static"    -> "libc++static"
    "none"          -> ""
    "" / "system"   -> "libc++_static"  for static
                    -> "libc++"         for shared

:2022/03/31: 增加“c++_shared”,“c++_static”和“system”

同样,上面第一行是stl可以指定的标示;下面是stl标示又对应的stl。

【注】未指定sdk verson,并用stl指定c++ stl时:

  1. libc++和libc++_static指定的是android source中的stl,并非NDK里的stl
  2. 如果指定了空,会根据所要编译的模块是动态库还是静态库而选择android source中libc++和libc++_static。

三、总结

总结一下:

  1. Android Source中的STL:内置的libc++/libc++_static/system;内置的NDK版本中的libc++_shared/libc++_static/system(system也就是android source中的libstdc++);
  2. Android.mk中通过LOCAL_NDK_STL_VARIANT指定NDK里的STL;
  3. Android.bp中指定了sdk_version,通过stl指定的stl是NDK里的STL;
  4. Android.bp中未指定sdk_version,
  •     通过stl指定的stl是android系统里的STL;
  •     stl未指定的情况下,默认也会用android系统里的对应的STL。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值