JNI是Java Native Interface的縮寫,它提供了若干的API實現了Java和其他語言的通信(主要是C&C++)。
JNI原理
JVM將JNI接口指針傳遞給本地方法,本地方法只能在當前線程中訪問該接口指針,不能將接口指針傳遞給其它線程使用。在VM中 JNI接口指針指向的區域用來分配和存儲線程本地數據。當Java代碼調用本地方法時,VM將JNI接口指針作爲參數傳遞給本地方法,當同一個Java線程調用本地方法時VM保證傳遞給本地方法的參數是相同的。不過,不同的Java線程調用本地方法時,本地方法接收到的JNI接口指針是不同的。
JNI副作用
一旦使用JNI,JAVA程序就喪失了JAVA平臺的兩個優點:
1、程序不再跨平臺。要想跨平臺,必須在不同的系統環境下重新編譯本地語言部分。
2、程序不再是絕對安全的,本地代碼的不當使用可能導致整個程序崩潰。一個通用規則是,你應該讓本地方法集中在少數幾個類當中。這樣就降低了JAVA和C之間的耦合性。
JNI設計目的
標準的java類庫可能不支持你的程序所需的特性。或許你已經有了一個用其他語言寫成的庫或程序,而你希望在java程序中使用它。
你可能需要用底層語言實現一個小型的時間敏感代碼,比如彙編,然後在你的java程序中調用這些功能。
細節
用Java代碼調用C\C++代碼時候,肯定會有參數數據的傳遞。兩者屬於不同的編程語言,在數據類型上有很多差別,應該要知道他們彼此之間的對應類型。例如,儘管C擁有int和long的數據類型,但是他們的實現卻是取決於具體的平臺。
參考:
http://blog.csdn.net/jiangwei0910410003/article/details/17465085
http://www.cnblogs.com/shaweng/p/4013320.html