1、基本概念
??? JNI是Java Native Interface(Java本地接口)的縮寫。所謂本地接口,是相對運行在Java虛擬機(jī)“沙箱”中的Java程序而言的,指直接運行在操作系統(tǒng)之上,與操作系統(tǒng)直接交互的程序。
???
JNI技術(shù)架構(gòu)
???? 可以形象直觀地把JNI看做是Java和本地應(yīng)用程序的黏合劑。
????????
??? 缺點:JNI犧牲了Java的平臺移植性、JNI提高了應(yīng)用系統(tǒng)之間的耦合度。
??? 使用JNI調(diào)用本地程序接口的情況:
?????? -- 為了實現(xiàn)Java語言所不能實現(xiàn)的功能:例如關(guān)閉系統(tǒng)、獲取CPU繁忙程度等。
?????? -- 為了獲取更好的程序運行性能:和其他語言一樣,Java程序運行的性能很大程度上取決于程序代碼的編寫質(zhì)量,但? 是在一些實時性要求高的應(yīng)用場合,以“半編譯”形態(tài)出現(xiàn)的Java語言是難以勝任的,這時借助運行性能更佳的本地程序來完成這些關(guān)鍵任務(wù)更為合理。
?????? -- 為了保護(hù)歷史投資
2、調(diào)用C程序
??? 步驟:
??? (1) 編寫主調(diào)方的Java類。該類要聲明將調(diào)用的C函數(shù),一方面載入本地的動態(tài)鏈接庫文件(即.dll文件)。
??? (2) 使用javac命令編譯Java類。
??? (3) 使用javah命令為C程序生成頭文件(即.h文件)。在自動生成的頭文件中將聲明有待實現(xiàn)的C函數(shù)。
??? (4) 編寫C程序。在C程序中實現(xiàn)頭文件中聲明的函數(shù)。
??? (5) 將C程序文件編譯成動態(tài)鏈接庫文件。
public class HelloWorld { public native void displayHelloWorld();// 定義本地方法 public native void displayMyName();// 定義本地方法 /* * 調(diào)入本地庫,Java程序?qū)⒃趈ava.library.path參數(shù)所指向的路徑,以及PATH環(huán)境變量所指向的路徑中尋找并載入hello.dll文件。 * 可以使用System.load()以絕對路徑的方式載入動態(tài)鏈接庫, * 例如:System.load("e:/somelibrary.dll")。在采用System.load()的情況下,不必設(shè)置環(huán)境變量和參數(shù)。 */ static { System.loadLibrary("hello"); } public static void main(String[] args) { new HelloWorld().displayHelloWorld(); new HelloWorld().displayMyName(); } }
??本地方法和接口方法:
????? Interface中聲明的只是方法的結(jié)構(gòu)而已,可以認(rèn)為是對方法做出的定義,Interface自身并不實現(xiàn)方法,更沒有能力提供方法;而native方法卻可以認(rèn)為是Class自身提供的方法,只不過這種方法不是由自身來實現(xiàn)的,而是依靠本地動態(tài)鏈接庫輸出的函數(shù)。
????? 在Java中調(diào)用native方法和調(diào)用普通方法是完全相同的。
參考:
http://book.csdn.net/bookfiles/606/10060619592.shtml
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
