新聞中心
Android NDK(Native Development Kit)是 Android 平臺(tái)上開發(fā)本地代碼的工具包。它包含了一組用于生成和處理原生庫的工具和一組針對(duì)每個(gè)支持的 ABI(應(yīng)用二進(jìn)制接口)的 C/C++ 庫,并提供了在 Java 代碼中使用本地方法的框架。

NDK 默認(rèn)使用 GCC 工具鏈,它是一個(gè)流行的編譯器,可用于編譯 C/C++ 代碼。在 ARM Linux 架構(gòu)下使用 GCC 編譯器時(shí),有一些技巧可以提高編譯效率和代碼質(zhì)量。
本文將介紹在 NDK 架構(gòu)下使用 ARM Linux GCC 編譯器的一些技巧和注意事項(xiàng),包括編譯參數(shù)、編譯優(yōu)化、代碼規(guī)范等。
一、 編譯參數(shù)
1.1 -march=armv7-a
-march 參數(shù)指定了目標(biāo)構(gòu)架,并啟用一組默認(rèn)的 CFLAGS(編譯選項(xiàng))。在 ARM 架構(gòu)下,-march=armv7-a 意味著生成針對(duì) ARMv7 架構(gòu)的代碼。
啟用 -march=armv7-a 可以提高代碼執(zhí)行效率,但會(huì)增加代碼大小和生成的二進(jìn)制文件大小。如果您的應(yīng)用需要在多個(gè) ARM 架構(gòu)下運(yùn)行,建議使用 -march=armv5te,這將生成兼容 ARMv5 架構(gòu)的代碼。
1.2 -mthumb
-mthumb 可以生成使用 Thumb 指令集的代碼,這將大大減小代碼大小并提高執(zhí)行效率。
Thumb 是 ARM 架構(gòu)下的一種指令集,其中的指令比普通 ARM 指令短,可以減小代碼大小。但是,Thumb 與 ARM 指令不兼容,所以需要在編譯時(shí)指定使用 Thumb。
1.3 -O2
啟用 -O2 可以生成優(yōu)化的代碼,以提高執(zhí)行效率。但是,此選項(xiàng)可能會(huì)導(dǎo)致編譯時(shí)間增加,生成的代碼變大,而且在某些情況下,可能會(huì)影響代碼的正確性。如果發(fā)現(xiàn)問題,可以嘗試禁用此選項(xiàng)。
二、 編譯優(yōu)化
2.1 函數(shù)內(nèi)聯(lián)
函數(shù)內(nèi)聯(lián)可以減少函數(shù)調(diào)用的開銷,并提高執(zhí)行效率。但是應(yīng)該謹(jǐn)慎使用,因?yàn)檫^度使用會(huì)導(dǎo)致代碼膨脹和緩存不命中。
在使用 GCC 編譯器時(shí),可以使用 inline 關(guān)鍵字將函數(shù)聲明為內(nèi)聯(lián)函數(shù)。GCC 會(huì)根據(jù)函數(shù)的使用情況來決定是否將其內(nèi)聯(lián)。
2.2 變量聲明
變量的聲明應(yīng)該放在函數(shù)的開頭,而不是在函數(shù)中間或結(jié)尾。這可以減小??臻g的使用,提高代碼執(zhí)行效率。
2.3 -fno-common
在 C 語言中,如果多個(gè)源文件中定義了同名的變量,它們會(huì)被鏈接在一起,形成一個(gè)全局變量。這種定義方式也稱為“common symbol”。
-fno-common 選項(xiàng)可以避免 common symbol 的產(chǎn)生。這將強(qiáng)制編譯器將每個(gè)實(shí)例都視為獨(dú)立變量,而不是全局共享變量。
三、 代碼規(guī)范
3.1 使用 const 關(guān)鍵字
使用 const 關(guān)鍵字可以幫助編譯器優(yōu)化代碼,并減少由于變量被錯(cuò)誤地更改而引起的錯(cuò)誤。在聲明變量時(shí),應(yīng)該盡量使用 const 關(guān)鍵字。
3.2 減少全局變量
全局變量可以使代碼更易于編寫,但是它們也會(huì)增加數(shù)據(jù)訪問的開銷,并帶來隱藏的依賴關(guān)系和副作用。
應(yīng)該盡可能減少全局變量的使用,并使用局部變量來代替它們。
3.3 避免指針操作
指針操作可以使代碼更靈活,但也會(huì)帶來額外的開銷和難以排查的問題。
對(duì)于不需要指針的代碼,應(yīng)該避免使用指針。對(duì)于需要使用指針的代碼,應(yīng)該盡可能使用 const 指針來避免變量被修改。
結(jié)論
在 NDK 架構(gòu)下使用 ARM Linux GCC 編譯器可以優(yōu)化代碼的執(zhí)行效率和質(zhì)量。本文介紹了一些可選的編譯參數(shù)、編譯優(yōu)化和代碼規(guī)范,可以幫助開發(fā)人員編寫更高效、更健壯的 C/C++ 代碼。
但是需要注意的是,這些技巧并不是普適的,只有在具體的開發(fā)場(chǎng)景下才能生效。因此,建議開發(fā)人員在實(shí)踐中根據(jù)具體需要選擇技巧,并進(jìn)行適當(dāng)?shù)臏y(cè)試和優(yōu)化。
相關(guān)問題拓展閱讀:
- android NDK編譯問題,在將項(xiàng)目中的JNI部分編譯時(shí),報(bào)出了錯(cuò)誤,不能成功生成SO文件,
- 用NDK編譯生成動(dòng)態(tài)庫的時(shí)候 出現(xiàn)這個(gè)錯(cuò)誤 怎么解決,libmyAdd.so是我在linux下生成的動(dòng)態(tài)庫
android NDK編譯問題,在將項(xiàng)目中的JNI部分編譯時(shí),報(bào)出了錯(cuò)誤,不能成功生成SO文件,
錯(cuò)誤不一定在罩隱之一空廳行提示,看看斗悶隱undefined reference to ‘BN_bn2hex’,沒有太多信息無法準(zhǔn)確判斷
-lcrypto是缺少庫libcrypto.so吧
你局帆這用什么系統(tǒng)編的啊為什么執(zhí)行命令看是linux 底和閉下還有D盤
程喚臘裂序里也有錯(cuò)誤啊
jni/OpensslWapper.cpp:102: error: undefined reference to ‘BN_bn2hex’
看著想少包了。
進(jìn)群?jiǎn)柊桑?/p>
用的cygwin+NDK編譯的,你差豎的cygwin的編洞顫譯環(huán)境裝好了嗎?還有你這個(gè)ndk-build你build的哪?沒進(jìn)工程虛顫大目錄就build了?
用NDK編譯生成動(dòng)態(tài)庫的時(shí)候 出現(xiàn)這個(gè)錯(cuò)誤 怎么解決,libmyAdd.so是我在linux下生成的動(dòng)態(tài)庫
交叉編譯不對(duì),不兼容的目標(biāo)
linux生成的so不能被NDK使用,編譯所使用的指令集不一樣
把 程序文件 改為 chengxuwenjia試試。
你試一下 把文件放在英文目錄下。
交叉編譯不對(duì),不兼容的目標(biāo)
ndk arm linux gcc的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于ndk arm linux gcc,NDK 架構(gòu)下的 ARM Linux GCC 編譯技巧,android NDK編譯問題,在將項(xiàng)目中的JNI部分編譯時(shí),報(bào)出了錯(cuò)誤,不能成功生成SO文件,,用NDK編譯生成動(dòng)態(tài)庫的時(shí)候 出現(xiàn)這個(gè)錯(cuò)誤 怎么解決,libmyAdd.so是我在linux下生成的動(dòng)態(tài)庫的信息別忘了在本站進(jìn)行查找喔。
成都創(chuàng)新互聯(lián)科技有限公司,是一家專注于互聯(lián)網(wǎng)、IDC服務(wù)、應(yīng)用軟件開發(fā)、網(wǎng)站建設(shè)推廣的公司,為客戶提供互聯(lián)網(wǎng)基礎(chǔ)服務(wù)!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡(jiǎn)單好用,價(jià)格厚道的香港/美國云服務(wù)器和獨(dú)立服務(wù)器。創(chuàng)新互聯(lián)——四川成都IDC機(jī)房服務(wù)器托管/機(jī)柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機(jī)房租用、服務(wù)器托管、機(jī)柜租賃、大帶寬租用,高電服務(wù)器托管,算力服務(wù)器租用,可選線路電信、移動(dòng)、聯(lián)通機(jī)房等。
網(wǎng)頁題目:NDK架構(gòu)下的ARMLinuxGCC編譯技巧(ndkarmlinuxgcc)
當(dāng)前URL:http://fisionsoft.com.cn/article/dhcdseh.html


咨詢
建站咨詢
