Android ndk學習必要性?學習方法?

學校開發團隊隊長在暑假建議我們學習ndk,具體是寫一個在底層調用腳本語言lua語句的程序,記不太清,嘗試失敗就沒有關注了。但是看見知乎上很多大牛的回答都有ndk的身影,在此想再次加深下對ndk開發的理解,尋求學習ndk的可行之道


如果連大頭鬼Github都找不到,還是轉行吧,編程不適合你。

----------------------------原答案---------------------------

謝邀。

完全贊同 @hi大頭鬼hi 的回答,這方面的想法在我之前的回答

android程序員有必要學習c++嗎? - M.A.G.I 的回答 中就表達過:

如果只是做個普通的Android碼農,那Java夠用;但如果你的理想比這個還要大一點,C++是你進階的必備技能。

說的是C++,但放到NDK上也是一樣。

說點題外話,出於開發成本,周期的考慮以及快速迭代的需求,這兩年終端開發越來越明顯的開始向大前端演進,前端的各項技術開始不斷融合。前兩年流行的Hybird在工程實踐中被證明有非常多的問題,於是各方都在探索新方案,直到今年出現了恐怖的React Native Android.RN基於Js超強的靈活性和高代碼復用,通過Java擴展App的終端能力,用NDK榨乾系統的性能,我認為在一定程度上代表了終端開發未來的方向。

不知道大家是不是還記得耗子和玉伯關於團隊的那場討論,在條件允許的情況下,全棧團隊確實能提高生產力。特別是對於終端開發,在大前端技術融合的背景下,以後對於終端開發者的要求將會是一定意義上的通才,門檻比現在只高不低。對於開發者來說,我們需要做的是擁抱變化,不斷主動拓展自己在技術上的深度和廣度,而不是在這裡提問,猶豫應不應該去學,沒有學習能力的終端開發者,之後的道路也會更艱難。

如果想了解什麼是大前端開發者,可以去看一下大頭鬼的Github.


想看frsco源碼么,想看ReactNative源碼么,想看framework源碼么,想的話,就要學。

當然不學也並不妨礙你坐開發,但是想要晉級成為高級開發,NDK必須要學習的。


感覺題主的ndk指的不是實際的那個ndk。

NDK全稱Native Development Kit,因而NDK本身主要是一套工具鏈。NDK裡面包含了交叉編譯、鏈接、調試等的工具,以及一些比較基本的函數庫,如STL、標準C庫等,一些圖形的glue介面等,還有JNI的一些機制。

感覺題主所稱的NDK在實際的NDK之外,似乎還包含JNI機制和C/C++編程語言。

JNI是一種讓Java層代碼和C/C++層代碼可以相互調用的機制,也就是Java層代碼可以調用C/C++,反過來也可以。不僅僅是Android開發可以用JNI這種機制,普通的PC機上的JAVA開發也可以用這種機制。

在Android app開發中使用C/C++語言,如同其他朋友所言,能帶來的好處很多,如利用遺留的相關庫,訪問底層操作系統介面等等。C/C++是這種開發中的核心。

至於說到有沒有必要,當然是具體看情況了。如果Android的Java層開發的知識的積累還非常少,當然應該先積累這方面的東西。對於許多對性能要求比較苛刻的應用領域,如其他朋友提到的音視頻編解碼,還有遊戲的圖形什麼的使用NDK寫一些C/C++代碼可能比較好。要看別人優秀的使用了JNI機制和C/C++的開源項目,學一下一定是很有幫助的。

學習方法嘛,主要是分成NDK工具、JNI和 C/C++編程語言3個部分來看。

C/C++編程語言,自不必多說,和常規的 C/C++編程語言又沒有什麼特別的地方,主要的差別可能也就在可用的函數庫等方面了。

JNI的話,有一份叫 《The Java Native Interface Programmer"s Guide and Specification》的文檔非常好,比較清楚的講解了Java代碼如何與C/C++代碼相互訪問的方法。

至於NDK,可以參考NDK自帶的文檔,或者android aosp項目中來了解如何編寫Android.mk。 參考NDK自帶的文檔來了解如何編譯,鏈接,調試,如何編寫Application.mk,如何使用STL等。還可以搜一下如何把NDK集成進自己使用的IDE中,如Eclipse,Android Studio等等。


入門階段 基本用不到ndk 也不推薦直接學 了解下基礎怎麼調用jni啥的

等有了一定的基礎 由向中高級過度時候推薦這個時候來學


然而ndk開發卻需要如此多的知識。c/c++至少熟練掌握一個吧(注意是熟練),Linux得懂吧,ndk開發涉及很多底層的調用,連Linux常用介面都沒聽說過,內存,進程調度都不理解,談何ndk開發啊。這是一個相當漫長的過程啊


少年,首先NDK是用來幹嘛的,你需要有所了解。

NDK一般是用來:

1. 避免多平台重複編寫代碼

2. 用一些前人留下的C/C++的輪子

3. 安全性考慮,增加拆包難度

4. 公司人才貯備、技術選型之類的理由

NDK說白了是給你application層調用C/C++代碼的方法,我認為不是一個需要學的玩意。最後還是看你演算法、數據結構、操作系統的基本功,看你的業務到底要做什麼。如果你想探索整個Android底層的實現,你需要去讀Android源碼,那是另外一碼事,不叫「學NDK」。

「在底層調用腳本語言lua語句」,我猜學長是想要搞個手游,讓你幫忙造造輪子...


本來我以為不用的,我以為java就夠用了。進了這家直播公司才發現,想java真的很有限。


第一次學習jni是在深入理解安卓1那本書中,第一次見根本不懂,隨便看了一遍,只懂點java調用c++,順帶學了點c++,第二次學jni是在安卓內核剖析中,這次知道了c++調用java知識點挺多的,再次學習在安卓框架揭秘,這次知道了在c++應用程序中調用java,叫invocation api,然後就ndk入門了。


如果想要了解安卓的底層,如果想要開發非常高效的應用,不學習ndk是不行的。畢竟安卓的虛擬機是用c++寫的,許多對性能要求很高的模塊也是底層用c寫出來的。如果只用個java那這個系統是沒法用的


NDK是一整套的工具鏈,Android的內核是Linux。NDK的開發說到底就是Linux C的開發,建議買一本Linux C語言開發的書,推薦《Unix環境高級編程》。學習文件I/O, 套接字,內存管理,多線程,進程間通信,計時器……,當然了NDK也包含了OpenGL ES和Vulkan,學習計算機圖形學也是必不可少的。還有OpenSL ES,音頻知識也要學點吧。

NDK最後還要和Java層進行互相調用,那麼JNI(Java本地調用)也得學

嗯,最後是對工具的使用,學會使用gcc編譯源碼,用makefile寫源碼構建腳本(Anndroid是Android.mk),不然你用cmake也行。會用gdb調試程序。當然谷歌在NDK中添加了clang編譯器,

總之,你有Linux下C語言開發的經驗,那麼學習NDK不是一件很難的事


我也想學,我也學過,但學了不知道幹嘛,就停了。。。


前端的各項技術開始不斷融合


就是一個toolchain,把ndk自帶的文檔看一遍,會寫makefile就行了。不過最好還是先把Linux上的Makefile簡單看看,原理上一樣的。陳皓的那個 跟我一起寫Makefile


學習一下還是很有好處的


推薦閱讀:

Zine 的目標用戶是什麼人?它的產品邏輯是什麼?
為什麼沒有把手機變成暖寶寶的APP?
dp 這個單位是安卓發明的么?為什麼 px=dp*(dpi/160)?
你見過哪些令你瞠目結舌的 Objective-C 代碼技巧?
APICloud是免費用的嗎?

TAG:Android開發 | 移動開發 |