-
靜態(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)綁定流程:
在Native層調用FindClass方法獲取到需要綁定的Java類。
在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) |

