從 Android 應用層轉到 NDK 開發的學習路線是怎樣的?

如果只有Java水平,沒有學過C/C++的要怎麼進軍NDK


基本同意賀同學的觀點,以下是我補充的一些東西:

我覺得你提的這個問題的範圍太寬泛了,如果你現在的開發水平僅僅是會一門語言的話,那別說NDK開發了,恐怕連Android的高層應用開發需要補充的東西都很多。

下面就拋開一些領域知識和業務邏輯的問題不說,僅僅提一下NDK相關內容:

1.指針!指針!還是指針!

2.如何避免內存泄露

3.JNI編碼規範,特別注意理解其中的local和global對象的創建和釋放,學會native call java、java call native。

4.makefile和MK文件的編寫方法。

5.基本的shell知識,少許的Perl/Python知識,因為大型項目中難免會有通過腳本自動生成代碼的地方。

6.編譯和鏈接的基本知識,可以以GCC為例來學習,動態庫和靜態庫的相關知識。

7.熟讀NDK自帶的文檔,第一,文檔本身不多,第二,NDK方面的資料本來就少。

8.跑完NDK中自帶的例子,本來就不多,也比較簡單,但很權威。

9.根據需求,學習native activity的相關內容,這其中還包含了對Android本身架構和執行流程的理解,就不展開了,反正是一堆東西。

說實話,如果你不是想做對性能要求特別高的遊戲,不是想兼容大量的C/C++遺留基礎代碼,其實是沒有必要對ndk做太過深入的學習的,因為到現在都Android 4.2了,開放的native介面還是有限,想操作一些高階的手機特有功能還是只有走Java。

到最後,你想檢驗一下你的NDK學習成果,你可以把android源碼中的webkit部分以及相關庫拿出來,通過ndk方式編譯、鏈接通過,把Baidu給跑出來,拋開一些C/C++的編碼水平不說,你的NDK開發就算是基本學會了。


因為自己並沒有真正地在項目中完全使用NDK完成某個獨立地項目,在之前的一些項目中確實有使用到NDK來完成一些基礎類庫的開發工作,但是畢竟還是比較片面的,所以回答僅供參考,並沒有特別嚴肅的驗證。

NDK的開發確實支持C/C++,目前Android在NDK層面也開放了很多系統的介面,通常大家選擇NDK的原因有三個:

  1. 性能
  2. 防破解,二進位加密
  3. 利用已有的庫

目前有比較多的遊戲引擎在Android上的實現採用了通過NDK的方式來實現,通過直接封裝OpenGL ES來實現。因為並不是非常清楚題主具體的方向是什麼,很難有確定性的東西。

如果是轉向做遊戲的話,那麼還是先熟悉C/C++的基礎語法,然後深入學習遊戲開發相關的圖形學,3D數學,物理引擎等等吧。

如果轉向是繼續做應用的話,說實在的很難想像會有什麼具體的東西,同樣是熟悉C/C++語法,然後根據自己需要做的領域再深入學習對應的東西吧,例如音頻和視頻解碼等等。

大體的思路就是,先成為一個基礎水平的C/C++開發者,然後嘗試成為一個Linux下C/C++開發者,然後再回到Android平台,結合自己具體的領域(例如OpenGL ES,音視頻解碼,網路等等)上下功夫吧。


我一直做linux應用,後來被強行弄過去做android多媒體框架的擴展,我感覺,做ndk的話,還是linux和c、c++的東西得懂,還不能是入門水平


推薦閱讀:

android 小白不敢觸及 NDK?
為什麼 Google Android 不全面推進 NDK,反而用一個全新,但性能提升有限的 ART 來代替 Dalvik 虛擬機?

TAG:Android開發 | AndroidNDK |