Android 面試涉及到底層開發(fā)總是繞不開 NDK 的,一些常見的面試題也是幫忙大家加深印象和理解?。?!
一、談?wù)勀銓?duì) JNI 和 NDK 的理解
JNI 是 Java Native Interface 的縮寫,即 Java 的本地接口。目的是使得 Java 與本地其他語言(如 C/C++)進(jìn)行交互。JNI 是屬于 Java 的,與 Android 無直接關(guān)系。NDK 是 Native Development Kit 的縮寫,是 Android 的工具開發(fā)包。作用是更方便和快速開發(fā) C/C++ 的動(dòng)態(tài)庫,并自動(dòng)將動(dòng)態(tài)庫與應(yīng)用一起打包到 apk。NDK 是屬于 Android 的,與 Java 無直接關(guān)系。JNI 是實(shí)現(xiàn)的目的,NDK 是 Android 中實(shí)現(xiàn) JNI 的手段。二、談?wù)勀銓?duì) JNIEnv 和 JavaVM 理解
JavaVM 是虛擬機(jī)在 JNI 層的代表。一個(gè)進(jìn)程只有一個(gè) JavaVM。(重要?。?/section>所有的線程共用一個(gè) JavaVM。(重要!)JNIEnv 表示 Java 調(diào)用 native 語言的環(huán)境,封裝了幾乎全部 JNI 方法的指針。JNIEnv 只在創(chuàng)建它的線程生效,不能跨線程傳遞,不同線程的 JNIEnv 彼此獨(dú)立。(重要!)在 native 環(huán)境下創(chuàng)建的線程,要想和 java 通信,即需要獲取一個(gè) JNIEnv 對(duì)象。我們通過 AttachCurrentThread 和 DetachCurrentThread 方法將 native 的線程與 JavaVM 關(guān)聯(lián)和解除關(guān)聯(lián)。三、解釋一下 JNI 中全局引用和局部引用的區(qū)別和使用
通過 NewGlobalRef 和 DeleteGlobalRef 方法創(chuàng)建和釋放一個(gè)全局引用。全局引用能在多個(gè)線程中被使用,且不會(huì)被 GC 回收,只能手動(dòng)釋放。通過 NewLocalRef 和 DeleteLocalRef 方法創(chuàng)建和釋放一個(gè)局部引用。局部引用只在創(chuàng)建它的 native 方法中有效,包括其調(diào)用的其它函數(shù)中有效。因此我們不能寄望于將一個(gè)局部引用直接保存在全局變量中下次使用(請使用全局引用實(shí)現(xiàn)該需求)。我們可以不用刪除局部引用,它們會(huì)在 native 方法返回時(shí)全部自動(dòng)釋放,但是建議對(duì)于不再使用的局部引用手動(dòng)釋放,避免內(nèi)存過度使用。通過 NewWeakGlobalRef 和 DeleteWeakGlobalRef 創(chuàng)建和釋放一個(gè)弱全局引用。弱全局引用類似于全局引用,唯一的區(qū)別是它不會(huì)阻止被 GC 回收。四、JNI 線程間數(shù)據(jù)怎么互相訪問
考察點(diǎn)和上體類似,線程本來就是共享內(nèi)存區(qū)域的,因此我們需要使用 全局引用。五、怎么定位 NDK 中的問題和錯(cuò)誤
一般在開發(fā)階段的話,我們可以通過 log 來定位和分析問題。如果是上線狀態(tài)(即關(guān)閉了基本的 log),我們可以借助 NDK 提供的 addr2line 工具和 objdump 工具來定位錯(cuò)誤。詳情:so 動(dòng)態(tài)庫崩潰問題定位(addr2line與objdump)六、靜態(tài)注冊和動(dòng)態(tài)注冊
通過 JNIEXPORT 和 JNICALL 兩個(gè)宏定義聲明,Java + 包名 + 類名 + 方法名 形式的函數(shù)名。不好的地方就是方法名太長了。通常在 JNI_OnLoad 方法中通過 RegisterNatives 方法注冊,可以不再遵從固定的命名寫法(當(dāng)然為了代碼容易理解,名稱還是盡量和 Java 中保持一致)。七、API
有的變態(tài)題目還是會(huì)考驗(yàn)?zāi)阋恍?API 的運(yùn)用,比如怎么在 JNI 里面調(diào)用 Java 的方法,怎么在 JNI 里面拋異常等等。所以一些 API 還是要熟悉一下的,大致都是什么功能,名字大致是啥呀,這個(gè)太多了,就不想詳細(xì)介紹了。原文鏈接:https://blog.csdn.net/afei__/article/details/84889135
最后歡迎大家加入 音視頻開發(fā)進(jìn)階 知識(shí)星球 ,這里有知識(shí)干貨、編程答疑、開發(fā)教程,還有很多精彩分享。
更多內(nèi)容可以在星球菜單中找到,隨著時(shí)間推移,干貨也會(huì)越來越多?。?!

給出 10元 優(yōu)惠券,漲價(jià)在即,目前還是白菜價(jià),基本上提幾個(gè)問題就回本,投資自己就是最好的投資?。?!

加我微信 ezglumes ,拉你進(jìn)技術(shù)交流群
推薦閱讀:
音視頻開發(fā)工作經(jīng)驗(yàn)分享 || 視頻版
OpenGL ES 學(xué)習(xí)資源分享
開通專輯 | 細(xì)數(shù)那些年寫過的技術(shù)文章專輯
Android NDK 免費(fèi)視頻在線學(xué)習(xí)!?。?/a>
你想要的音視頻開發(fā)資料庫來了
推薦幾個(gè)堪稱教科書級(jí)別的 Android 音視頻入門項(xiàng)目
覺得不錯(cuò),點(diǎn)個(gè)在看唄~