2013-06-23 53 views
2

我一直在研究一個Android項目,它有幾個本地C++庫。使用Eclipse和ADT插件進行編譯和調試非常有效。很明顯,Android NDK使用某個版本的arm-linux-gnueabi-gcc來編譯本地庫。使用ARMCC編譯Android本機庫

因爲我一直在大量使用NEON內部函數,所以我想嘗試使用ARM的官方編譯器armcc編譯本機庫。我在處處讀到armcc在使用內在函數時應該給出更好的優化代碼。所以我從ARM網站下載了DS-5的試用版,只是爲了試試看看是否有真正的速度差異。

DS-5似乎只是使用ARMCC工具鏈的Eclipse的修改版本,所以我安裝了ADT插件。但是當我使用DS-5進行編譯時,似乎代碼仍然使用gcc而不是armcc生成。

您是否知道如何強制DS-5或Eclipse使用armcc構建Android本機代碼?或者是否有可能(以及如何)從命令行構建靜態NDK庫,然後替換我的項目中的庫,以便將它們部署到測試電話中?

回答

2

ARM DS-5 Community Edition不包括ARM compilerarmcc)。

如果你能得到armcc,最好的辦法就是將處理繁重的算法分離爲單獨的編譯單元(單獨的C文件),然後像編譯單元一樣使用armcc編譯它們。當你得到目標文件時,convert them into an archive然後使用Android.mk中的那個作爲LOCAL_STATIC_LIBRARIES += <your_archive>

您不能使用armcc明顯地構建Android兼容庫,主要是因爲Bionic依賴關係,我認爲。

+0

謝謝,我會試試看。我沒有社區版本,但是完整的DS-5版本的30天試用版。 – NumberFour

+0

如果我只有一個用armcc編譯的編譯單元,我是否仍然需要將這個單個.o文件放入存檔中? – NumberFour

+0

@NumberFour我環顧四周,看到幾個職位抱怨,共識是創建一個檔案。 HTTPS://android.googlesource。com/platform/ndk/+/master/docs/text/PREBUILTS.text http://stackoverflow.com/questions/7587965/android-add-prebuild-object-files – auselen

0

即使Android具有不同的C庫(bionic),也可以使用armcc構建與Android兼容的靜態庫。關鍵是armcc--library_interface標誌。根據the documentation

在與符合ABI的C庫鏈接時,使用形式選項--library_interface = aeabi_ *。形式選項--library_interface = aeabi_ *確保編譯器不會生成對由ARM C庫提供的任何優化函數的調用。

此外,還有幾個標誌,以確保與Android EABI導致下面的命令在Android armeabi-v7a目標兼容性:
armcc --library_interface=aeabi_clib --wchar32 --enum_is_int --no_hide_all --cpu=7-A --fpu=softvfp+vfpv3 -c -o libfunc.o libfunc.c

然後可以使用armar --create libfunc.a libfunc.o創建靜態庫可以將其與Android NDK鏈接爲LOCAL_STATIC_LIBRARIES

我已經在Android KitKat 4.4.2上成功通過Android NDK r10d進行了測試。