田海立@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對應,
二、程式中指定STL
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 verion
stl: "" / "c++_shared" / "c++_static" / "libc++" / "libc++_static" / "none"
"" -> "ndk_system"
"c++_shared" -> "ndk_libc++_shared"
"c++_static" -> "ndk_libc++_static"
"libc++" -> "ndk_libc++_shared"
"libc++_static" -> "ndk_libc++_static"
"none" -> ""
上面第一行是stl可以指定的標示;下面是stl標示又對應的stl,
【注】指定了sdk verson,并用stl指定c++ stl時:
- c++_shared和libc++都是使用了NDK里的llvm動態庫;c++_static和libc++_static都是使用了NDK里的llvm靜態庫
- 如果指定了空,使用的是NDK里的system庫
2) 未指定sdk verion
stl: "libc++" / "libc++_static" / "none" / ""
"libc++" -> "libc++"
"libc++_static" -> "libc++static"
"none" -> ""
"" -> "libc++_static" for static
-> "libc++" for shared
同樣,上面第一行是stl可以指定的標示;下面是stl標示又對應的stl,
【注】未指定sdk verson,并用stl指定c++ stl時:
- libc++和libc++_static指定的是android source中的stl,并非NDK里的stl
- 如果指定了空,會根據所要編譯的模塊是動態庫還是靜態庫而選擇android source中libc++和libc++_static,
三、總結
總結一下:
- Android Source中的STL:內置的libc++/libc++_static/system;內置的NDK版本中的libc++_shared/libc++_static/system(system也就是android source中的libstdc++);
- Android.mk中通過LOCAL_NDK_STL_VARIANT指定NDK里的STL;
- Android.bp中指定了sdk_version,通過stl指定的stl是NDK里的STL;
- Android.bp中未指定sdk_version,通過stl指定的stl是android系統里的STL;且stl未指定的情況下,默認也會用android系統里的對應的STL,
CSDN認證博客專家
系統分析師
Android
人工智能
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/226261.html
標籤:其他
下一篇:Activity的四種啟動模式
