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