android studio 调试c/c++代码小记
使用的android studio3.0.1版本,sdk 27.
新建的測試程序,勾選了c++支持,默認有native_lib.cpp。
1.在cpp中添加了測試的native代碼,提示No implementation found for錯誤,怎么看都跟之前的默認函數沒啥區別啊,于是盯著簡單cpp代碼逐行掃描。。。。。5分鐘后,我去,自動生成的代碼extern c竟然沒有跟{},所以默認函數享受了extern c,而我添加的測試代碼被認為沒有實現,這絕對是個坑啊。以上,添加{}問題解決。
2.executing external native build for cmake 錯誤,由于添加了其他的測試代碼,準備進行一些模塊功能測試,所以有了目錄分層,所以相當于調整了CMakeLists.txt,然后就是各種錯誤,之前只關注了這個錯誤,并不太熟悉android studio的操作,然后就各種點點點,終于發現了在messages窗口,gradle sync中有CMake Error的提示,比如我的錯誤是提示cmakelists.txt中的哪一行出錯的,在gradle console中有具體的錯誤,提示我好多cpp文件找不到,而這些文件正是我后添加在其他目錄的文件,所以問題明顯,源文件目錄錯誤,編譯器找不到。。。。。。以上,修改正確的目錄層級,問題解決。
3.將已有c++代碼導入,編譯時提示各種標準庫函數無法使用,比如std::to_string、make_unique等等,分兩步,一個是因為沒有使用c++標準庫,需要參數arguments "-DANDROID_STL=c++_shared",一個是因為需要c++14支持,cppFlags "-std=c++14",這兩問題個是查了資料:https://stackoverflow.com/questions/22774009/android-ndk-stdto-string-support
4.想要添加另一個依賴庫代碼,編譯為android平臺的so,報錯:error: linker command failed with exit code 1 (use -v to see invocation),發現是生成的so與最終依賴庫的位置寫的名字不一致導致的。
5.因為之前的c++代碼中有很多同事的中文注釋,直接用到android studio中會提示encoding問題,這時候就需要在Settings--->Editor--->File Encodings中指定編碼格式,點擊右邊的小加號,選擇c++代碼目錄,出現在path中,后面的encoding中選擇GBK,apply-->ok,會發現都能正確顯示中文了。
6.需要release版本的庫,選擇窗口左下角的Build Variants,然后選擇對應的Variant,當然,選擇release之后會提示錯誤,需要配置簽名,這個大家可以查查,有很多教程。
7.關于debug進入c/c++代碼,找到了一個方法,edit configurations-->debugger-->symbol directories界面里,點擊右邊的小加號,將項目生成的中間.o文件目錄添加進來,之后在c/c++代碼加斷點就可以進入調試了。
8.如果調試的手機或者平板沒有全部的打印信息,讓你無法調試自己的程序,可以網上查找對應型號的設備如何打開工程模式,因為工程模式可以打開log級別的設置,很多設備都將默認logcat級別設置的高一點,提高性能。
9.編譯出來的so庫比較大,查找資料,發現需要在cmakelists.txt中設置strip參數:
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")
參考了https://stackoverflow.com/questions/38675403/how-to-config-cmake-for-strip-file,瞬間變小了。
10.使用的so庫接口api,在jni接口中調用竟然提示error: undefined reference to,明明已經連接進去了為什么會出現這個問題呢,然后將接口extern到jni接口中,編譯,依然報這個錯誤,查看與其他接口差異,發現問題:沒有使用extern c屬性,所以編譯時不認識去哪里找接口,添加之后解決問題。
11.有一些平臺差異的東西,希望在一份源碼中同時維護,在cmakelist.txt中添加宏,方式就是:
add_definitions(-DANDROID),代表ANDROID宏,-D代表是defined12.不同庫函數有重名沖突的,可以在Cmakelists.txt中使用:
SET_TARGET_PROPERTIES (libxxx PROPERTIES LINK_FLAGS -Wl,--no-undefined,--version-script,${PROJECT_SOURCE_DIR}/xxx/export.map)
SET_TARGET_PROPERTIES (libxxx PROPERTIES LINK_FLAGS -Wl,--no-undefined,--retain-symbols-file,${PROJECT_SOURCE_DIR}/xxx/export.sym)
參考:https://www.2cto.com/kf/201703/610953.html
13.build variant無法切換debug和release的問題,應該是緩存問題,我嘗試刪除了.idea目錄重新打開android studio就可以切換了。
?
?
?
?
?
總結
以上是生活随笔為你收集整理的android studio 调试c/c++代码小记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python怎么输入两个数然后求差值_p
- 下一篇: c语言课设报告时钟vc环境,C语言课程设