欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Android開發(fā)實踐:如何設(shè)置NDK的編譯選項

本文是我的《Android NDK開發(fā)》系列的又一篇文章,上篇文章中,我分享了一個可以自動添加源文件列表的 Android.mk 示例模板,方便大家快速地搭建起完整的 NDK 開發(fā)工程框架,本文則主要探究幾個主要的 NDK 編譯選項的配置,其中包括:APP_ABI、LOCAL_LDLIBS、LOCAL_CFLAGS、APP_STL 這幾項,讓你從此不再對 NDK 的編譯參數(shù)望而生卻。

我們提供的服務(wù)有:成都網(wǎng)站設(shè)計、做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、城東ssl等。為成百上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學管理、有技術(shù)的城東網(wǎng)站制作公司

1. 概述 

首先回顧一下 Android NDK 開發(fā)中,Android.mk 和 Application.mk 各自的職責。

Android.mk,負責配置如下內(nèi)容:

(1) 模塊名(LOCAL_MODULE)

(2) 需要編譯的源文件(LOCAL_SRC_FILES)

(3) 依賴的第三方庫(LOCAL_STATIC_LIBRARIES,LOCAL_SHARED_LIBRARIES)

(4) 編譯/鏈接選項(LOCAL_LDLIBS、LOCAL_CFLAGS)

Application.mk,負責配置如下內(nèi)容:

(1) 目標平臺的ABI類型(默認值:armeabi)(APP_ABI)

(2) Toolchains(默認值:GCC 4.8)

(3) C++標準庫類型(默認值:system)(APP_STL)

(4) release/debug模式(默認值:release)

由此我們可以看到,本文所涉及的編譯選項在Android.mk和Application.mk中均有出現(xiàn),下面我們將一個個詳細介紹。

2. APP_ABI

ABI全稱是:Application binary interface,即:應(yīng)用程序二進制接口,它定義了一套規(guī)則,允許編譯好的二進制目標代碼在所有兼容該ABI的操作系統(tǒng)和硬件平臺中無需改動就能運行。(具體的定義請參考 百度百科 或者 維基百科 )

由上述定義可以判斷,ABI定義了規(guī)則,而具體的實現(xiàn)則是由編譯器、CPU、操作系統(tǒng)共同來完成的。不同的CPU芯片(如:ARM、Intel x86、MIPS)支持不同的ABI架構(gòu),常見的ABI類型包括:armeabi,armeabi-v7a,x86,x86_64,mips,mips64,arm64-v8a等。

這就是為什么我們編譯出來的可以運行于Windows的二進制程序不能運行于Mac OS/Linux/Android平臺了,因為CPU芯片和操作系統(tǒng)均不相同,支持的ABI類型也不一樣,因此無法識別對方的二進制程序。

而我們所說的“交叉編譯”的核心原理也跟這些密切相關(guān),交叉編譯,就是使用交叉編譯工具,在一個平臺上編譯生成另一個平臺上的二進制可執(zhí)行程序,為什么可以做到?因為交叉編譯工具實現(xiàn)了另一個平臺所定義的ABI規(guī)則。我們在Windows/Linux平臺使用Android NDK交叉編譯工具來編譯出Android平臺的庫也是這個道理。

這里給出最新 Android NDK 所支持的ABI類型及區(qū)別:

Android開發(fā)實踐:如何設(shè)置NDK的編譯選項

那么,如何指定ABI類型呢?在 Application.mk 文件中添加一行即可:

APP_ABI := armeabi-v7a //只編譯armeabi-v7a版本

APP_ABI := armeabi armeabi-v7a //同時編譯armeabi,armeabi-v7a版本

APP_ABI := all //編譯所有版本

3. LOCAL_LDLIBS

Android NDK 除了提供了Bionic libc庫,還提供了一些其他的庫,可以在 Android.mk 文件中通過如下方式添加依賴:

LOCAL_LDLIBS := -lfoo

其中,如下幾個庫在 Android NDK 編譯時就默認鏈接了,不需要額外添加在 LOCAL_LDLIBS 中:

(1) Bionic libc庫

(2) pthread庫(-lpthread)

(3) math(-lmath)

(4) C++ support library (-lstdc++)

下面我列了一個表,給出了可以添加到“LOCAL_LDLIBS”中的不同版本的Android NDK所支持的庫:

Android開發(fā)實踐:如何設(shè)置NDK的編譯選項

4. LOCAL_CFLAGS

我們可以在 Android.mk 文件中設(shè)置 LOCAL_CFLAGS 來為編譯源代碼添加額外的編譯選項,由于NDK實際上也是調(diào)用GCC命令來完成編譯和鏈接的,因此,LOCAL_CFLAGS 的可選參數(shù)配置大家可以參考GCC的官方文檔,鏈接如下:

《GCC 4.8.4 Manual》

《GCC Command Options》

下面是我總結(jié)的一些常用的CFLAGS編譯選項:

(1)通用的編譯選項

-O2  編譯優(yōu)化選項,一般選擇O2,兼顧了優(yōu)化程度與目標大小

-Wall  打開所有編譯過程中的Warning

-fPIC  編譯位置無關(guān)的代碼,一般用于編譯動態(tài)庫

-shared 編譯動態(tài)庫

-fopenmp 打開多核并行計算,

-Idir 配置頭文件搜索路徑,如果有多個-I選項,則路徑的搜索先后順序是從左到右的,即在前面的路徑會被選搜索

-nostdinc 該選項指示不要標準路徑下的搜索頭文件,而只搜索-I選項指定的路徑和當前路徑。

--sysroot=dir 用dir作為頭文件和庫文件的邏輯根目錄,例如,正常情況下,如果編譯器在/usr/include搜索頭文件,在/usr/lib下搜索庫文件,它將用dir/usr/include和dir/usr/lib替代原來的相應(yīng)路徑。

-llibrary 查找名為library的庫進行鏈接

-Ldir 增加-l選項指定的庫文件的搜索路徑,即編譯器會到dir路徑下搜索-l指定的庫文件。

-nostdlib 該選項指示鏈接的時候不要使用標準路徑下的庫文件

(2) ARM平臺相關(guān)的編譯選項

-marm -mthumb 二選一,指定編譯thumb指令集還是arm指令集

-march=name  指定特定的ARM架構(gòu),常用的包括:-march=armv6, -march=armv7-a

-mfpu=name   給出目標平臺的浮點運算處理器類型,常用的包括:-mfpu=neon,-mfpu=vfpv3-d16

-mfloat-abi=name 給出目標平臺的浮點預算ABI,支持的參數(shù)包括:“soft”, “softfp” and “hard”

5. APP_STL

從Android NDK r5 開始支持 STL 了,只需要在 Application.mk 文件中添加對 APP_STL 的定義即可:

APP_STL := gnustl_static

默認情況下,system 庫只支持部分 STL 的功能,不支持C++異常,不支持RTTI,不過,NDK 集成了一系列其他的C++運行時庫,可以提供這些功能,這些庫的特性如下所示:

Android開發(fā)實踐:如何設(shè)置NDK的編譯選項

我們可以通過修改 Application.mk文件中的 APP_STL 來配置到底選擇使用哪一種C++支持庫:

system         -> Use the default minimal system C++ runtime library.  

gabi++_static  -> Use the GAbi++ runtime as a static library.  

gabi++_shared  -> Use the GAbi++ runtime as a shared library.  

stlport_static  -> Use the STLport runtime as a static library.  

stlport_shared  -> Use the STLport runtime as a shared library.  

gnustl_static   -> Use the GNU STL as a static library.  

gnustl_shared   -> Use the GNU STL as a shared library.

 

6. 小結(jié)


關(guān)于如何設(shè)置NDK的編譯選項就介紹到這兒了,有任何疑問,歡迎留言或者來信lujun.hust@gmail.com交流,也可以關(guān)注我的新浪微博 @盧_俊 或者微信公眾號 @Jhuster 獲取最新的文章和資訊。


網(wǎng)站標題:Android開發(fā)實踐:如何設(shè)置NDK的編譯選項
轉(zhuǎn)載來于:http://aaarwkj.com/article44/iipphe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、移動網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、建站公司、App開發(fā)、微信公眾號

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)
亚洲中文字幕少妇熟女美妇| 亚洲精品欧美激情专区| 在线一区二区三区高清视频| 调教亚洲另类唯美第二页| 中文字幕有码在线朋友| 久久久精品在线免费视频| 亚洲三级伦理在线视频| 久久成人av一区二区三区| 女人的天堂啪啪啪av| 国产片精品一区在线观看| 精品视频一区二区三区中文字幕| 国产精品视频黄色一区| 男人午夜影视在线观看| 日本午夜专区一区二区| 日本av天堂中文字幕| 91免费在线观看国产精品| 日本一区二区三区日本| 97人妻精品一区二区三区六| 门国产av一区二区三区| 我的极品小姨在线观看| 91日韩人妻一区二区三区| 国产高清不卡午夜福利| 欧美精品一区二区久久不卡| 久久精品亚洲国产成人av| 人妻丰满熟妇九九久久| 亚洲天堂毛片在线观看| 激情五月综合开心五月| 日本韩国一级黄色免费| 亚洲精品一区久久狠狠欧美| 亚洲精品主播一区二区三区| 久久精品国产久精国产爱| 91成人伦理在线观看| 国产在线精品不卡一区| 日韩av黄色大片在线播看| 91免费在线观看国产精品| 亚洲综合日韩精品在线| 久久精品欧美日韩视频| 美女高潮呻吟免费观看久久久 | 国产精品亚洲国产精品| 国产精品国产三级国产av丨| 国产美女被狂操到高潮|