JNI (Java Native Interface)

 







JNI (Java Native Interface) 是一種JAVA原生介面(本地接口)
也是JAVA去呼叫其他語言,例如:C/C++一個十分重要的橋樑。


藉由JNI技術可實踐
1.java程式中函數可以去呼叫Native語言(C/C++)寫的函數
2.Native語言(C/C++)寫的函數也可以呼叫JAVA層級的函數


JNI一開始要達成的目的就是
1.統一兩者間的Data Type
所有引用的類型於JNI中都被定義為jobject的類型,在C中則都被定義為void*


關於Java數組類型映射到JNI的類型,比如,
Java端的int[]類型對應於JNI側的jintArray
Java端的char[]類型對應於JNI側的jcharArray
Java端的String[]類型則對應於JNI側的jobjectArray類型。






2.函數簽章(名)
JNI層提供了一套類型簽名(type signature)機制
有了類型之間的映射關係之後還不夠,因為我們知道Java中的方法是可被重載的(overloadable),為了要準確描述一個方法,既要獲得該方法的種類(類方法還是實例方法),還要獲得它的名稱(即方法標識符)以及類型(包括參數類型以及返回類型)。在JNI層可以通過後續要描述的接口來指定訪問的是類方法還是實例方法。
而要表示方法或屬性的類型


Java端的long類型,其簽名為:J;
(備註:這裡的前綴大寫字母L,最後的分號也注意別漏,
簽名中包名與類名的分隔符用的是/符號)
Java端的String類型,其簽名為:Ljava/lang/String;
Java端的short[]類型,其簽名為:[S;
Java中的String[]類型,其簽名為:[Ljava/lang/String;


而對於Java的方法類型簽名,則需要其完整的參數類型與返回類型。
如果沒有參數列表,則直接用()來表示。

Java端的() -> void類型,其簽名為:()V;
Java端的(int) -> void類型,其簽名為:(I)V;
Java端的(int, boolean) -> String類型,其簽名為:(IZ)Ljava/lang/String;
Java端的(int, String, int) -> int[]類型,其簽名為:(ILjava/lang/String;I)[I


一些常見的舉例

(1)
JAVA端的函數簽章
boolean isLedOn(void);
轉為JNI後
()Z


(2)
JAVA端的函數簽章
void setLedOn(int ledNo);
轉為JNI後
(I)


(3)
JAVA端的函數簽章
String substr(string str,int idx,int count);
轉為JNI後
(Ljava/lang/String;II)Ljava/lang/String


(4)
JAVA端的函數簽章
char fun(int n,String s,int[] value);
轉為JNI後
(ILjava/lang/String;[I)C






















Ref:
https://programmer.ink/think/perfect-combination-of-java-and-c-through-jni-chinese-garbled-code-processing.html

https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html

https://slidetodoc.com/lecture-5-ndk-integration-jni-this-work-is/

https://slidetodoc.com/lecture-6-ndk-integration-jni-this-work-is/

https://slidetodoc.com/java-native-interface-jni-jni-linking-java-and/

https://blog.csdn.net/jlgcumt/article/details/105055344


留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header