2012-02-07 124 views
4

我正在使用NDK(jni)在Android上編寫一些本機代碼。 我想關閉gcc編譯器優化。 現在我將LOCAL_CFLAGS += -O0添加到Android.mk,我不確定它是否正常工作。如何知道ndk-build的gcc優化級別

我寫了一些代碼來測試循環的開銷是這樣的:

// gettime 
for(int i = 0 ; i<10000;i++) 
{ 

} 
// gettime 

的時間差太小,我敢肯定的是,環已被刪除的編譯器。 我可以將i更改爲volatile變量,但我想測試是否已正確關閉編譯器優化。

如何知道gcc(ndk-build)使用的優化級別,我可以設置make以獲取所有消息?

在此先感謝。

+0

10K'inc's很可能在10k個時鐘週期內完成。即使在「慢」處理器上,這也是非常快的。 – Mat 2012-02-07 08:34:05

回答

8

這裏瞭解如何禁用優化:Android NDK assert.h problems

基本上你需要做的是

APP_OPTIM := debug 

添加到您的Application.mk文件

+0

它的工作原理!好感謝! – 2012-02-07 22:17:03

6

當啓用優化時,編譯器定義名爲__OPTIMIZE__的宏。

如果將這些行插入到任何C文件中,那麼如果make標誌對該文件不起作用,則編譯將失敗。

#ifdef __OPTIMIZE__ 
#error Optimization enabled. That's not right! 
#endif 

另一種可能性是檢查一個內置的二進制文件(.o或可執行文件)的具體拱形標誌。

readelf -A myfile.o 

ARM有一個標誌,指示優化級別,但我認爲在Android工具鏈可能有點老要正確使用,所以因人而異。

+0

是的,我檢查你的代碼,'-O0'不工作,編譯器只是拋出錯誤信息。那麼如何正確關閉android-jni項目的優化? – 2012-02-07 17:09:32