NDK是什么
專注于為中小企業(yè)提供成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營銷網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)城中免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
NDK是Native Development Kit的簡稱,即本地開發(fā)工具包。通過NDK,Android允許開發(fā)人員使用本地代碼語言(例如C/C++)來完成應(yīng)用的部分(甚至全部)功能。注意:由于翻譯原因,有些地方也把Native翻譯為“原生”。
NDK是SDK的一個(gè)補(bǔ)充,可以幫助你做這些事情:
生成可以在ARM CPU,Android 1.5(及以上)平臺(tái)運(yùn)行的JNI兼容的共享庫。
將生成的共享庫放置在應(yīng)用程序項(xiàng)目路徑的合適位置,使其能自動(dòng)地添加進(jìn)你最終的(和經(jīng)過簽名的)apk包。
在后續(xù)NDK版本中,我們希望提供這樣的工具,通過遠(yuǎn)程的GDB連接和盡可能多的源/符號(hào)信息來協(xié)助調(diào)試本地代碼。
此外,NDK還提供:
一個(gè)交叉工具鏈集合(編譯器、鏈接器、etc),可以在Linux、OS X、Windows上生成本地ARM 二進(jìn)制代碼(Windows上需要使用Cygwin)。
一個(gè)系統(tǒng)API頭文件集合,這些API被保證向后兼容和穩(wěn)定支持。
一個(gè)構(gòu)建系統(tǒng),允許開發(fā)者僅僅編寫非常短的構(gòu)建文件來描述哪些文件需要被編譯、如何編譯。構(gòu)建系統(tǒng)會(huì)負(fù)責(zé)處理工具鏈、Android平臺(tái)、CPU、ABI的繁冗的區(qū)別。此外,NDK的后續(xù)更新會(huì)增加更多的工具鏈、平臺(tái)、系統(tǒng)接口的支持,而不需要改變開發(fā)者的構(gòu)建文件。
正確理解NDK
NDK是一個(gè)工具包,但圍繞這個(gè)工具包有很多誤解。作為初學(xué)者,我們應(yīng)該對(duì)這些誤解有清醒的認(rèn)識(shí),避免掉進(jìn)各種“坑”。
誤解一:NDK發(fā)布之前,Android不支持C/C++開發(fā)
眾所周知,Android的SDK基于Java實(shí)現(xiàn),這意味著基于Android SDK進(jìn)行開發(fā)的第三方應(yīng)用都必須使用Java語言。但這并不等同于“第三方應(yīng)用只能使用Java”。在Android SDK首次發(fā)布時(shí),Google就宣稱其虛擬機(jī)Dalvik支持JNI編程方式,也就是第三方應(yīng)用完全可以通過JNI調(diào)用自己的C動(dòng)態(tài)庫,即在Android平臺(tái)上,“Java+C”的編程方式是一直都可以實(shí)現(xiàn)的。
當(dāng)然這種誤解的產(chǎn)生是有根源的:在Android SDK文檔里,找不到任何JNI方面的幫助。即使第三方應(yīng)用開發(fā)者使用JNI完成了自己的C動(dòng)態(tài)鏈接庫(so)開發(fā),但是so如何和應(yīng)用程序一起打包成apk并發(fā)布?這里面也存在技術(shù)障礙。有的開發(fā)者安裝交叉編譯器創(chuàng)建so,并通過assets方式,實(shí)現(xiàn)捆綁so發(fā)布。但這種方式只能屬于投機(jī)取巧,并非官方支持。所以,在NDK出來之前,我們將“Java+C”的開發(fā)模式稱之為灰色模式,即官方既不聲明“支持這種方式”,也不聲明“不支持這種方式”。
誤解二:有了NDK,就可以完全使用C開發(fā)應(yīng)用
在NDKr5之前,NDK并沒有提供各種系統(tǒng)事件處理支持,也沒有提供應(yīng)用程序生命周期維護(hù)和應(yīng)用程序UI方面的API,因此幾乎不可能做出一個(gè)完整的應(yīng)用。但是,自從ndk r5發(fā)布以后,已經(jīng)允許你完全用C/C++ 來開發(fā)應(yīng)用或者游戲,而不再需要編寫任何Java 的代碼。
誤解三:使用NDK開發(fā)可以極大提高性能
業(yè)界對(duì)于Java的歧視由來已久,以致很多人對(duì)Java代碼不屑一顧,而對(duì)C/C++代碼有著狂熱的崇拜,認(rèn)為C/C++寫的程序一定比Java跑得快。但是,經(jīng)驗(yàn)證明,糟糕的性能通常應(yīng)該歸咎于混亂的數(shù)據(jù)結(jié)構(gòu)和緩慢的算法,而不是編程語言本身。實(shí)際上,扣除虛擬機(jī)的必要消費(fèi),Java代碼并不比C/C++慢,有時(shí)甚至?xí)煲恍?。Google的官方文檔里面也有說明:在Android上使用原生代碼通常不會(huì)帶來顯著的性能提升,但總是會(huì)增加應(yīng)用程序的復(fù)雜度。一般來說,應(yīng)該只在對(duì)你的應(yīng)用程序很有必要的時(shí)候才使用NDK,而不是簡單的因?yàn)槟阆矚g使用C/C++編程。
誤解四:使用NDK開發(fā)應(yīng)用不用擔(dān)心反編譯
很多人都知道Java代碼可以很容易進(jìn)行反編譯,因此需要保密的業(yè)務(wù)邏輯放在so中去實(shí)現(xiàn)。這本身并無不妥,但很多人卻把這一點(diǎn)夸大了,認(rèn)為只要使用原生代碼放進(jìn)共享庫,就可以高枕無憂,不用擔(dān)心反編譯了。實(shí)際上,在百度和Google上搜索“反編譯so文件”,都可以得出數(shù)十萬條結(jié)果。如果只是單純地為了代碼安全,完全可以考慮SDK提供的代碼混淆工具,詳情可自行查閱相關(guān)資料,這里不作贅述。一句話:NDK并不能保證代碼安全!
NDK的適用范圍
Google官方推薦了一些CPU密集型任務(wù),對(duì)于這些任務(wù)可以考慮使用NDK:
游戲引擎
信號(hào)處理
物理仿真
最后,Google對(duì)開發(fā)者的提醒:當(dāng)你考慮是否需要使用NDK的時(shí)候,請(qǐng)先想想你的需求,并檢查在Android Framework API中是否已經(jīng)提供你需要的功能。