android 小白不敢觸及 NDK?

自學android一年左右。由於在校,也是沒有接觸過實質性項目,都是做些小的demo。Java能看懂,C/C++就有點頭暈。一直未敢碰觸NDK、OpenGL ES等,但是眼看要進入公司,想惡補,但是又不知從何入手。各位大神有什麼可以為小弟指點迷津嗎?尤其是那些剛步入工作崗位的猿們。壓力好大。


可能沒有接觸過NDK的Android開發者多少都會有點這個疑惑吧,至少我曾經也有過,真的很佩服有些人能精通那麼多方面的知識,可以構建出一些很牛逼很「高大上」的應用。

我覺得,要想消除心中的疑惑,最簡單的方法就是去嘗試它!設想你面前有扇門,你看著這扇門很高很笨重,感覺不容易推開,但是沒準這些都只是表象,我們不去嘗試的話怎麼知道呢?

說下我的經歷,我剛讀研那會在三星中國研究院實習過一段日子,當時就是從零開始自己摸索NDK,功夫不負有心,可算是和師兄一起做出了一個能夠追蹤人眼球在手機屏幕上的聚焦點的應用。其中,native層的演算法是師兄利用之前做好的PC端的演算法移植出來的,而我的工作只是簡單的jni調用而已,但是那次實習讓我感覺NDK挺有意思的。再後來,學校某實驗室有個老師需要做一個Android端的人臉識別應用,我在朋友的推薦下開始了自己的第二次NDK開發經歷,花了一周時間寫了一個demo,老師很高興,所以後來一直支持我繼續做。但是,繼續做下去就會發現很多知識上的不足,一方面C++功底不夠,另一方面Android功底也不深,所以基本上就是一路踩坑的過程。參加工作後,在Flyme系統組的時候發現之前折騰的這些NDK對於我理解Android系統的構建、Android的核心模塊原理都有不少幫助呢。

總而言之,我覺得你需要消除這方面的疑惑,而消除疑惑最簡單的辦法就是去嘗試下,首先你可以看下其他幾位高分答題者推薦的資源,確定下你是否感興趣,是否有時間和精力,如果已經具備了一定的基礎之後,不防看些優秀的項目,下面推薦兩個:

1.renard314/textfairy

這是一個Android端的OCR應用,完成度相當高,而且比較複雜,希望你能成功編過它

2.MasteringOpenCV/code

原書的第一個項目是和NDK有關的:Cartoonifier and Skin Changer for Android,將攝像頭捕捉的畫面動漫化。

看完這個可以接著看後面的第8個項目:Face Recognition using Eigenfaces or Fisherfaces,使用經典的Eigenfaces和Fisherfaces來做人臉識別,這章其實不是一個Android應用,但是,你可以將其移植到Android端,加油吧!

我自己以前折騰的時候寫過一些總結,但是年代可能有點久遠,參考意義不大了,如有需要請移步閱讀 Android · Hujiawei Bujidao

**下面的二維碼是我個人維護的微信公眾號「瀟澗技術專欄」,會不定期分享移動開發的核心技術,歡迎關注!**

http://weixin.qq.com/r/snUsNEzEfhEBrQhX9yCg (二維碼自動識別)


推薦簡書上的這個給你:Android NDK 開發之旅

從C語言講到C++,又講到JNI,用的還是Android Studio+CMake,最後手把手教你實現一個demo。

整個系列通俗易懂也不啰嗦,有經驗的程序員一天就看完了,NDK也就輕鬆入門了。

更多相關內容:我的知乎導航 - 知乎專欄


如果想在 Android 這個方向走的更遠,C++ 是遲早都會碰到的坎。無論是 App 性能優化,ROM 定製還是 Android 安全相關方向都必須深入到 Native C/C++ Libraries Android Runtime 這一層才會有所收穫。Java API Framework 的調用只是很淺的一層。C++ 相關內容學習曲線是比較陡峭,但技能的習得難度往往和受益程度成正比。本來,學習這件事「只有累過,煩過,咬牙切齒過,山窮水盡過,柳暗花明過,才會是你的。」

不妨一起來再看一下這張大家已經熟視無睹的圖,數一數自己已經解鎖了哪些技能


如果你看C/C++就有點頭暈的話,還真沒辦法。


初學安卓開發的人大多有這個誤解,就是NDK是技術高手必須會的,是通往成神之路上的必經節點,然後花費大量的時間去學習。其實並不這樣。

NDK開發,本質上離不開C/C++開發,是屬於這兩個語言的開發範疇的,而你作為一個安卓程序員,只需要知道如何用jni的方式寫膠水層代碼,並編譯成為so庫就可以了——這部分的知識點很少,基本快的兩三天,慢的一周就能做到編譯和載入了。

而假如說你要載入一個大的庫,比如FFmpeg或者OpenGL這類,那麼這個編譯過程一般也不會在Android studio里完成,而是單獨拿出來用編譯工具鏈來完成——這是C/C++語言開發者的強項,而不是安卓開發者的強項。所以不用糾結要不要學NDK,沒多少東西,要學也是學C/C++開發,這才是重點。


我說句實話,一般的App開發,根本不需要什麼NDK知識。

其他答主說jni/C++/NDK是做性能搞底層或者學習Android的必由之路這沒錯,但你還沒到這個階段。一個一年,自學,沒有任何工程經驗的人,能把Java寫好就不錯了,我估計你Framework都沒弄清楚。現在你去搞NDK開發,除了寫helloworld只能寫BUG。

沒有任何挖苦題主的意思,搞技術真的需要積累和沉澱,沒有辦法一步登天。也許你覺得現在學會了NDK會更牛逼,其實並沒有——你只是多挖了一個很淺的坑而已。相信我,先把Java層以及Framework搞清楚,積累一些實際經驗,一兩年(或者更短)之後,通過C++深入Framework然後順便學會NDK是水到渠成的事情。


其實當 C/C++ 和 NDK 並列被提及時,你可能會覺得 C/C++ 相對容易些,畢竟大學裡都或多或少學過,所以說 NDK 中難的並不是語言本身(當然,C++ 中的各種黑魔法除外)而是其如何與 Android 的各類應用層或系統層框架交互,以及 Java JNI 的各種坑和知識點。另外,一般的應用里 NDK 或 JNI 應用得並不是十分多,使用到的場景基本都是音視頻處理、3D 圖形圖像、遊戲或者一些性能敏感的複雜演算法。所以與其說不敢接觸 NDK 還不如說不敢接觸 C++ 或這些高級領域。


難的不是語言,而是有沒有足夠的興趣往下走,你若有足夠的決心,就不會暈了。借@肥肥魚之前說的。

ServiceManager、ActivityManager、PackageManager 、*****Manager 都弄懂了?

Binder 也搞清楚了?

IPC 也弄明白了?

FrameWork 層的每個類都折騰了?

Hook 會玩了?

各種 SystemService 也知道怎麼運行的了?

View 的渲染你明白是怎麼回事了?

Intent 是如何實現 Activity、Service 等之間的解耦合的?

單元測試會寫了?Monkey 能跑多長時間?性能測試通過了?

ClassLoader 和 DexLoader 會玩了?

Context 是個啥你也知道了?

許可權機制也弄清楚了?

觸屏事件的分發呢?

Handler 、Message 和 Looper 是怎麼跑起來的?

如果上面超過一半的東西題主還沒有弄清楚,別搞NDK了, 洗洗睡,明天早點起來看書。


這個問題不能一概而論,還是得分分科班和非科班討論;

如果科班出身,學過一些C C++的東西,至少看得懂代碼並不會很排斥NDK。如果不是科班出身,就知道怎麼寫JAVA,對他來說NDK單怕就像學一個新的語言一樣麻煩。

個人認為android非系統應用可以以是可以簡單的分三層

一,展示型-霸天虎(各種新聞客戶端,含第三方即時通訊以及視頻展示),技術包括不限於:基本控制項使用,後台介面交互,資料庫操作,H5交互,播放器,內存優化少量涉及socket,加密演算法,熱更新,插件化等

二,工具型-大黃蜂 (各種計算器,記事本等),技術包括但不限於;多線程操作,自定義View等

三,功能型-擎天柱(各種打車和直播等),核心技術一般通過NDK實現

當然,渲染以及交互難度可以作為劃分的另外一個維度。

在這三層劃分中,從數量上來說,第一類包含了大部分市面上的應用。從技術來說,第一類包含了小白必須掌握的大部分技能。也就是說除了一些大廠,小白在開發過程中很可能沒有接觸NDK的機會,最關鍵的是遇到NDK的問題沒有大牛可以帶。這對於小白是致命的,越來越感覺在說自己了,就此打住。


那就進了公司再被迫補吧,雖然會壓力大一點,但是真的你到時候會發現看c/c++不暈了!需求才是第一生產力


這個其實沒多大必要,除非特定的項目要求,比如你要寫一個播放器,那你肯定要會用ndk,要不然平常項目直接java就好,而且c/c++寫的話你還要考慮很多底層的東西,但如果想當一名高級android開發人員,這個ndk肯定要了解一些。初中級能獨立完成項目就已經不錯了,很多人雖然是掛職初中級,但能做到的有幾個?而且現在很多項目乾脆直接react native和weex來解決了。。。

其實說白了練技術最好的辦法就是多敲代碼,你可以自己寫個app放安卓應用市場,在寫的過程,你會一步步解決遇到的問題,一步步優化自己的代碼和界面,不懂的東西立馬學,立馬用。當你寫完以後放上去,你的水平也就差不多了,如果有很多人下載,也是很有成就感的,多的話放上admob,弄不好又是一筆額外小收入。


關鍵在c/c++,不在jni


你說ndk,不如說C++/C,可是你會C/C++了,還做什麼安卓,做C++多好。別擔心,底層庫有專門做底層庫的,輪不到安卓程序員來做。

jni就那些東西,中間層很簡單的。難得東西C++,是不需要安卓程序員來做的。


因為Java寫多了人就不願意去碰C++了。

更別提一開始就學Java的,C++太底層會讓人有些難以接受。

就像學了C++的也不太願意學彙編一樣,然而為了性能的話,有時候還離不開彙編(至少要能看懂……)

自底向上,很容易被底層牽制住;自頂向下,又很難接受底層的條條框框。


沒關係當你BOSS非要你把祖傳的C庫用來開發App的時候,一下就學會了~


額,現在寫 Native 代碼沒啥門檻啊,跟寫 Java 沒差…用AS開啟一個工程,然後添加 C++ 支持就好了,還用學么?


或許你可以去看看cocos2d-x構建安卓工程


搞安卓,不搞NDK,那你薪水也會有瓶頸的。


Jni的語法像屎一樣,相比oc無縫對接c/c++,android搞native就是給自己找不痛快,既然google要拋棄java,將來早晚找別的方法對接native


除了特殊有求,android技能樹沒有ndk的,它屬於高級技能樹的旁支技能,等你android學個兩年無聊了想搞隨便搞,工作除非特殊工種,否則都不需要的


推薦閱讀:

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

TAG:軟體開發 | Android開發 | 軟體設計 | OpenGLES | AndroidNDK |