-
靜態(tài)綁定
以打開串口的方法為例:
-
JIN
JNI打開串口方法.jpg -
Java
JNI打開串口對應(yīng)的Java方法.jpg
-
JNIEXPORT姐帚,強制Native函數(shù)可見器一。
jobject,表示方法返回類型為一個對象纵朋,如果不返回則為
void
柿顶。JNICALL,表示了函數(shù)的調(diào)用規(guī)范操软,比如參數(shù)入棧方式是從左往右嘁锯,還是從右往左等。
Native函數(shù)中的以
Java_
開頭后跟的com_pfg_mallstore_serialport
與Java類包名對應(yīng)聂薪,只是將.
換成了_
Native函數(shù)中包名后緊跟類名家乘,與Java方法所在類對應(yīng)
-
Native函數(shù)參數(shù)
JNIEnv,指Java本地接口環(huán)境(Java Native Interface Environment)藏澳,指向了本地方法的一個函數(shù)表仁锯。
jclass、jobject翔悠,jclass表示當前方法是靜態(tài)方法业崖,jobject表示當前方法是非靜態(tài)方法。
jstring蓄愁、jint...等双炕,與Java中String、int類型一一對應(yīng)撮抓。
-
動態(tài)綁定
-
動態(tài)綁定流程:
在Native層調(diào)用FindClass方法獲取到需要綁定的Java類妇斤。
在Native層調(diào)用RegisterNatives 方法傳入Java類、方法列表和綁定方法數(shù)量。
-
- 動態(tài)綁定優(yōu)點:
- 可以在任意時刻觸發(fā)站超。
- 綁定之前根據(jù)靜態(tài)規(guī)則查找Native函數(shù)荸恕。
- 可以在綁定后的任意時刻取消。
靜態(tài)綁定和動態(tài)綁定對比
靜態(tài)綁定 | 動態(tài)綁定 | |
---|---|---|
Native函數(shù)名 | 按照固有規(guī)則編寫并采用C的命名規(guī)則 | 無要求 |
Native函數(shù)可見性 | 可見 | 無要求 |
動態(tài)更換 | 否 | 能 |
調(diào)用性能 | 額外查找開銷 | 無需查找 |
開發(fā)影響 | 重構(gòu)繁瑣(例如:修改函數(shù)名顷编,需兩邊同時改) | 幾乎無副作用 |
AndroidStudio支持 | 自動關(guān)聯(lián)Native函數(shù)跳轉(zhuǎn) | 不能自動關(guān)聯(lián) |