Android如何打印std::cout/printf(重定向stdout)


Android應用調試時沒有stdout和stderr的輸出,網上看到的解釋都是下面這個樣子:

#################################################

Android系統在默認情況下,將stdout和stderr(Java中的System.out 和 System.err)重定向到/dev/null。

如果一個進程運行了 Dalvik VM,那么就可以把上面兩個輸出拷貝到日志文件中去,這種情況下,系統會把stdout

和stderr輸出到標簽為“stdout”和“stderr”的日志中。

 

具體做法如下:

$ adb shell stop

$ adb shell setprop log.redirect-stdio true

$ adb shell start

(以上命令執行之后立即生效,不過,如果重啟手機,則上面的設置就消失了。

可以在 /data/local.prop 文件中加入命令,從而無需重新執行以上命令。)

##################################################

 

經過實驗,這個方法可以輸出JAVA代碼中的System.out/err。但是現在很多應用為了跨平台用C/C++開發(特別是游戲,我調試的也是游戲),C/C++中的std::cout/printf用這種方法並不能輸出,網上有些解釋說需要先root設備($adb root),再執行上面的語句。由於我的情況不允許root,所以就沒有驗證。

繼續網上搜索資料,發現一個方法:

freopen函數。

這個函數是用來重定向的,具體用法可以可以自行google。

我在我項目C/C++代碼執行的入口地方加入了下面代碼:

freopen("/sdcard/tmp/loglog.txt", "w", stdout);

重新編譯執行,所有std::cout/printf的輸出都輸出到了指定文件中。需要注意的是:參數一指定的路徑必須是存在的,而且必須有這個路徑的寫權限。否則,這個代碼“沒有任何效果”。

 

這個方法很好解決了我的問題,特此記錄一下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM