<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Android NDK 常見面試題

          共 1990字,需瀏覽 4分鐘

           ·

          2022-07-11 13:16

          Android 面試涉及到底層開發(fā)總是繞不開 NDK 的,一些常見的面試題也是幫忙大家加深印象和理解?。?!

          一、談?wù)勀銓?duì) JNI 和 NDK 的理解

          JNI:
          JNI 是 Java Native Interface 的縮寫,即 Java 的本地接口。
          目的是使得 Java 與本地其他語言(如 C/C++)進(jìn)行交互。
          JNI 是屬于 Java 的,與 Android 無直接關(guān)系。
          NDK:
          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)系。
          總結(jié):
          JNI 是實(shí)現(xiàn)的目的,NDK 是 Android 中實(shí)現(xiàn) JNI 的手段。

          二、談?wù)勀銓?duì) JNIEnv 和 JavaVM 理解

          JavaVM
          JavaVM 是虛擬機(jī)在 JNI 層的代表。
          一個(gè)進(jìn)程只有一個(gè) JavaVM。(重要?。?/section>
          所有的線程共用一個(gè) JavaVM。(重要!)
          JNIEnv
          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)存過度使用。
          擴(kuò)展:弱全局引用
          通過 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)
          其它還可以使用 C/C++ 的一些分析工具。

          六、靜態(tài)注冊和動(dòng)態(tài)注冊

          靜態(tài)注冊:
          通過 JNIEXPORT 和 JNICALL 兩個(gè)宏定義聲明,Java + 包名 + 類名 + 方法名 形式的函數(shù)名。不好的地方就是方法名太長了。
          動(dòng)態(tài)注冊:
          通常在 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è)在看唄~

          瀏覽 62
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久黄色大片 | 亚洲AAA电影 | 国产乱伦影音先锋 | 日韩黄色电影在线观看 | 99久热在线精品视频播放 |