Java Native方法與Native函數綁定的方式

  • 靜態(tài)綁定

    以打開串口的方法為例:

    • JIN


      JNI打開串口方法.jpg
    • Java


      JNI打開串口對應的Java方法.jpg
  • JNIEXPORT,強制Native函數可見。

  • jobject,表示方法返回類型為一個對象,如果不返回則為void

  • JNICALL,表示了函數的調用規(guī)范,比如參數入棧方式是從左往右,還是從右往左等。

  • Native函數中的以Java_開頭后跟的com_pfg_mallstore_serialport與Java類包名對應,只是將.換成了_

  • Native函數中包名后緊跟類名,與Java方法所在類對應

  • Native函數參數

    • JNIEnv,指Java本地接口環(huán)境(Java Native Interface Environment),指向了本地方法的一個函數表。

    • jclass、jobject,jclass表示當前方法是靜態(tài)方法,jobject表示當前方法是非靜態(tài)方法。

    • jstring、jint...等,與Java中String、int類型一一對應。

  • 動態(tài)綁定

    • 動態(tài)綁定流程:

      1. 在Native層調用FindClass方法獲取到需要綁定的Java類。

      2. 在Native層調用RegisterNatives 方法傳入Java類、方法列表和綁定方法數量。

  • 動態(tài)綁定優(yōu)點:
    • 可以在任意時刻觸發(fā)。
    • 綁定之前根據靜態(tài)規(guī)則查找Native函數。
    • 可以在綁定后的任意時刻取消。

靜態(tài)綁定和動態(tài)綁定對比

靜態(tài)綁定 動態(tài)綁定
Native函數名 按照固有規(guī)則編寫并采用C的命名規(guī)則 無要求
Native函數可見性 可見 無要求
動態(tài)更換
調用性能 額外查找開銷 無需查找
開發(fā)影響 重構繁瑣(例如:修改函數名,需兩邊同時改) 幾乎無副作用
AndroidStudio支持 自動關聯(lián)Native函數跳轉 不能自動關聯(lián)
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容