Android開發(fā)之JNI基礎(chǔ)知識

帶著問題入場:

  • 什么是JNI,NDK, 與Java是什么關(guān)系,有什么應(yīng)用場景?
  • JNI提供了哪些基本數(shù)據(jù)類型徽诲?

接下來會針對這兩個問題森瘪,一一道來牡属。

  1. 什么是JNI, NDK, 有什么應(yīng)用場景?

    • JNI是Oracle提供的用于Java調(diào)用C/C++或C/C++調(diào)用Java的一套機(jī)制, 有自己的一套API扼睬,并且與C/C++或者匯編混合使用JNI逮栅,Java Native Interface,是 native code 的編程接口窗宇。JNI 使 Java 代碼程序可以與 native code 交互——在 Java 程序中調(diào)用 native code措伐;在 native code 中嵌入 Java 虛擬機(jī)調(diào)用 Java 的代碼。

    • NDK提供了一系列的工具军俊,幫助開發(fā)者快速開發(fā)C(或C++)的動態(tài)庫侥加,并能自動將so和java應(yīng)用一起打包成apk。這些工具對開發(fā)者的幫助是巨大的粪躬。

    • NDK集成了交叉編譯器担败,并提供了相應(yīng)的mk文件隔離CPU、平臺镰官、ABI等差異提前,開發(fā)人員只需要簡單修改mk文件(指出"哪些文件需要編譯"、"編譯特性要求"等)泳唠,就可以創(chuàng)建出so.

    • NDK可以自動地將so和Java應(yīng)用一起打包狈网,極大地減輕了開發(fā)人員的打包工作.

    • 應(yīng)用場景:

      • 可以將要求高性能的應(yīng)用邏輯使用C開發(fā),從而提高應(yīng)用程序的執(zhí)行效率
      • 可以將需要保密的應(yīng)用邏輯使用C開發(fā)笨腥。畢竟孙援,Java包都是可以反編譯的
      • 之前C/C++語言開發(fā)的基礎(chǔ)功能模塊復(fù)用到Android JNI環(huán)境下。
  2. JNI提供了哪些基本數(shù)據(jù)類型扇雕,提供了哪些API拓售?

    • JNI基本數(shù)據(jù)類型與Java數(shù)據(jù)類型的對應(yīng)關(guān)系

      basic_type_sign.png
    • JNI引用類型與Java數(shù)據(jù)類型的對應(yīng)關(guān)系

      reference_type.png
    • 提供的特有的類, jfieldID, jmethodID, JNIEnv等

      1. jfielID 是JNI提供的JNI 字段類

      2. jmethodID 是JNI提供的JNI方法類

      3. JNIEnv是JNI 接口的全局指針類镶奉,類似于JNI的上下文對象

    • Global and Local References
      為啥會用到這兩類引用础淤?

      先說LocalReference,比如平時通過New操作得到的引用類型的對象崭放,都屬于Local Reference,看上去像是一個局部變量鸽凶,其實(shí)不是币砂,它與局部變量有這本質(zhì)區(qū)別,在用完變量后需要手動釋放玻侥,而局部變量卻不需要决摧。

      Global Reference 是全局的引用,在New Global后一定要Release 這個全局引用凑兰。

      關(guān)于這兩類引用的使用過程中如何進(jìn)行內(nèi)存管理掌桩,在"JNI內(nèi)存管理模型”中會詳細(xì)描述。

    • 提供哪幾類API姑食,作用分別是什么波岛?

      -- 類操作 FindClass()
      -- 全局引用與局部引用相關(guān)操作

        NewGlobalRef()
        DeleteGlobalRef()
        NewWeakGlobalRef()
        DeleteWeakGlobalRef()
        NewLocalRef()
        DeleteLocalRef()
      

      -- 對象操作 不知道有什么用?
      -- 訪問對象的成員
      GetFieldID() Get<type>Field() 先拿fieldID,在獲取字段值
      Set<type>Field()

      -- 訪問靜態(tài)成員
      GetStaticFieldID()
      GetStatic<type>Fiel SetStatic<type>Field
      -- 對象成員函數(shù)調(diào)用
      GetMethodID()
      Call<type>Method
      Call<type>MethodA
      Call<type>MethodV
      CallNonvirtual<type>Method
      CallNonvirtual<type>MethodA
      CallNonvirtual<type>MethodV
      -- 靜態(tài)函數(shù)調(diào)用
      GetStaticMethodID()
      CallStatic<type>Method
      CallStatic<type>MethodA
      CallStatic<type>MethodV
      -- 字符串操作
      NewString() NewStringUTF()
      GetStringLength()
      GetStringChars()
      ReleaseStringChars()
      GetStringUTFLength()
      GetStringUTFChars()
      ReleaseStringUTFChars()
      GetStringRegion()
      GetStringUTFRegion()
      -- 數(shù)組操作
      GetArrayLength()
      NewObjectArray(JNIEnv *env, jsize length,jclass elementClass, jobject initialElement);
      jobject GetObjectArrayElement()
      SetObjectArrayElement()

       基本數(shù)據(jù)類型的數(shù)組操作
       New<PrimitiveType>Array()
       Get<PrimitiveType>ArrayElements()
       Release<PrimitiveType>ArrayElements(JNIEnv *env, ArrayType array, NativeType *elems, jint mode)
       參數(shù)對應(yīng)關(guān)系圖
       
       void Get<PrimitiveType>ArrayRegion(JNIEnv *env, ArrayType array,jsize start, jsize len, NativeType *buf);
       void Set<PrimitiveType>ArrayRegion(JNIEnv *env, ArrayType array,jsize start, jsize len, const NativeType *buf)
      

      -- 函數(shù)注冊于反注冊
      jint RegisterNatives(JNIEnv *env, jclass clazz,const JNINativeMethod *methods, jint nMethods);
      jint UnregisterNatives(JNIEnv *env, jclass clazz);
      -- 反射函數(shù) 還不知道如何使用
      jmethodID FromReflectedMethod(JNIEnv *env, jobject method);
      jfieldID FromReflectedField(JNIEnv *env, jobject field);
      jobject ToReflectedMethod(JNIEnv *env, jclass cls,jmethodID methodID, jboolean isStatic);
      jobject ToReflectedField(JNIEnv *env, jclass cls,jfieldID fieldID, jboolean isStatic);

    • JNI 類型簽名

      • 基本數(shù)據(jù)類型的類型簽名

        basic_type_sign.png
        • 引用數(shù)據(jù)類型的類型簽名

          reference_type_sign.png
      • 方法的描述符

method_descriptor.png
  • JNI Exception

    • 三個函數(shù)ExceptionOccured()音半,ExceptionClear()则拷,ThrownNew()。

    • 首先使用ExceptionOccured()函數(shù)判斷是否發(fā)生異常曹鸠,如果發(fā)生異常煌茬,可以在JNI處理也可以通過ThrowNew將異常拋出到Java層處理。但是在實(shí)際的使用中發(fā)現(xiàn)JNI的Exception有兼容性問題彻桃,不推薦使用宣旱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市叛薯,隨后出現(xiàn)的幾起案子浑吟,更是在濱河造成了極大的恐慌,老刑警劉巖耗溜,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件组力,死亡現(xiàn)場離奇詭異,居然都是意外死亡抖拴,警方通過查閱死者的電腦和手機(jī)燎字,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阿宅,“玉大人候衍,你說我怎么就攤上這事∪鞣牛” “怎么了蛉鹿?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長往湿。 經(jīng)常有香客問我妖异,道長惋戏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任他膳,我火速辦了婚禮响逢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘棕孙。我一直安慰自己舔亭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布蟀俊。 她就那樣靜靜地躺著钦铺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪欧漱。 梳的紋絲不亂的頭發(fā)上职抡,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天葬燎,我揣著相機(jī)與錄音误甚,去河邊找鬼。 笑死谱净,一個胖子當(dāng)著我的面吹牛窑邦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播壕探,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼冈钦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了李请?” 一聲冷哼從身側(cè)響起瞧筛,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎导盅,沒想到半個月后较幌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡白翻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年乍炉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滤馍。...
    茶點(diǎn)故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡岛琼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出巢株,到底是詐尸還是另有隱情槐瑞,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布阁苞,位于F島的核電站随珠,受9級特大地震影響灭袁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜窗看,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一茸歧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧显沈,春花似錦软瞎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至魔慷,卻和暖如春只锭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背院尔。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工蜻展, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人邀摆。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓纵顾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親栋盹。 傳聞我的和親對象是個殘疾皇子施逾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容