Android gnustl_static VS gnustl_share
0. 前言
使用gnustl_static
,儘量避免使用gnustl_share
。此外gnustl將逐步廢棄!
1. gnustl
1.1 簡介
gnustl: Android上的GNU C++庫,對應GNU/Linux系統中的libstdc++。
- 這個庫和GCC僅僅繫結,但是後期不再更新,最新NDK不再支援
- 此庫和Clang存在部分衝突
Note: 新版NDK將會刪除此庫,從NDK16開始,被libc++替代。
靜態庫:libgnustl_static.a
動態庫:libgnustl_shared.so
1.2 設定
只能在Application.mk設定
APP_STL := gnustl_shared
or
APP_STL := gnustl_static
2. gnustl_static
VS gnustl_share
2.1 gnustl_static
當使用static library時,相關程式碼被連線到編譯輸出庫中,這會造成目標檔案變大。
優點:
- 目標檔案已經包含所依賴的程式碼,不受執行環境的影響。
缺點:
- 目標檔案變大,不利於複用
優缺點同標準靜態連線庫相同。
2.2 gnustl_share
動態連結庫:依賴程式碼不編譯到目標檔案中。
優點:
- 目標檔案體積小。
缺點:
- 需要動態連結依賴庫,由於gnustl是系統庫,所以不需要額外輸出
libgnustl_share.so
。但是由於Android系統的碎片化,各個版本的libgnustl_share.so
不一致,就導致崩潰或者執行異常問題。
2.3 結論
鑑於gnustl_share存在諸多不穩定問題,所以儘量採用gnustl_static替代gnustl_share。
3. gnustl_share
崩潰解決方案
統一採用NDK10中的gnustl_share
的庫,然後在Android.mk和程式碼中顯示載入此庫。具體步驟如下:
- 使用NDKr9c或者r10e
- Copy:
libgnustl_shared.so <= /sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi/
- 顯示載入複製出來的
gnustl_share
System.loadLibrary("gnustl_shared")
4. 補充
APP_STL的取值:
system(default)系統預設的C++執行庫
stlport_static以靜態連結方式使用的sttport版本的STL
stlport_shared以動態連結方式使用的sttport版本的STL
gnustl_static以靜態連結方式使用的gnustl版本的STL
gnustl_shared以動態連結方式使用的gnustl版本的STL
gabi++_static以靜態連結方式使用的gabi++
gabi++_shared以動態連結方式使用的gabi++
c++_static以靜態連結方式使用的LLVM libc++
c++_shared以動態連結方式使用的LLVM libc++
就目前的情況,LLVM的支援要優於GNU,所以推薦使用“c++_static”
5. Reference
[1] https://developer.android.google.cn/ndk/guides/cpp-support.html?hl=zh-cn#gn
[2] http://forum.cocos.com/t/gnustl/44779/3
[3] https://stackoverflow.com/questions/43089065/what-is-the-difference-between-gnustl-shared-and-gnustl-static-in-android-ndk-li
相關文章
- Genymotion vs Android 模擬器Android
- vs2015 Android SDKAndroid
- Android開發中的Kotlin Coroutine VS RxJavaAndroidKotlinRxJava
- Android元件化之(路由 vs 元件匯流排)Android元件化路由
- android.support.v4.app.Fragment vs android.app.Fragment 的區別AndroidAPPFragment
- Android 虛擬機器 Vs Java 虛擬機器Android虛擬機Java
- iOS 11 vs Android O:誰才是更讚的OS?iOSAndroid
- 誰更快?Android6.0.1vsiOS9.2速度對決AndroidiOS
- Android-Kotlin VS Flutter-Dart - 自定義控制搖桿AndroidKotlinFlutterDart
- Android Studio vs Eclipse:你需要知道的那些事AndroidEclipse
- NOSQL資料庫大比拼:Cassandra vs MongoDB vs CouchDB vs Redis vs Riak vs HBaseSQL資料庫MongoDBRedis
- RDBMS VS XML VS NoSQLXMLSQL
- Axum vs Actix vs Rocket
- 探討針對iOS VS. Android開發遊戲的優劣iOSAndroid開發遊戲
- TensorFlowVSTensorFlowMobileVSTensorFlowLite
- vs 2017 vs code
- EncodedvsLiteral,RPCvsDocumentRPC
- The SQL vs NoSQL Difference: MySQL vs MongoDBMySqlMongoDB
- Redux vs Mobx系列(-):immutable vs mutableRedux
- MVC vs. MVP vs. MVVMMVCMVPMVVM
- 轉:malloc VS new, free VS deletedelete
- Java&Android 基礎知識梳理(11) - 淺拷貝 Vs 深拷貝JavaAndroid
- JavaScript 的 4 種陣列遍歷方法: for VS forEach() VS for/in VS for/ofJavaScript陣列
- Python Flask vs Ruby Sinatra vs Go Martini vs Node ExpressPythonFlaskGoExpress
- spring vs yii2 vs LaravelSpringLaravel
- ABAP vs Java, 蛙泳 vs 自由泳Java
- Java 集合 ArrayList VS LinkedList VS VectorJava
- 普通Webview vs X5 vs sonicWebView
- IVs提取合併工具ivstools
- 如何選擇前端框架:ANGULARVSEMBERVSREACT前端框架AngularReact
- javascript — == vs ===JavaScript
- Android 12(S) 影像顯示系統 - SurfaceFlinger 之 VSync - 中篇(十七)Android
- VSCodium:100% 開源的 VS Code
- [譯]await VS return VS return awaitAI
- When to use var vs let vs const in JavaScriptJavaScript
- LVS - ipvsadm命令參考
- c語言初學者用vs還是vscode vs和vscode哪個適合初學者C語言VSCode
- 如何實現 “defer”:Go vs Java vs C/CPPGoJava