Java中的接口是一系列方法的聲明,是一些方法特征的集合,一個(gè)接口只有方法的特征沒有方法的實(shí)現(xiàn),因此這些方法可以在不同的地方被不同的類實(shí)現(xiàn),而這些實(shí)現(xiàn)可以具有不同的行為(功能)。下面西安達(dá)內(nèi)培訓(xùn)(http://www.xatarena.cn/java/index.jhtml)講師就Java的外部函數(shù)接口詳細(xì)為大家介紹,希望對(duì)同學(xué)們有所幫助。
JEP 191在Java級(jí)別提供了類似于JNA或JNR的外部函數(shù)接口。開發(fā)人員可以通過它輕松地訪問本地函數(shù),以及在JVM級(jí)別管理本地內(nèi)存。它還將支持未來針對(duì)標(biāo)準(zhǔn)Java FFI的JSR。Java FFI API可用于實(shí)現(xiàn)本地支持的功能,像NIO、高級(jí)文件系統(tǒng)元數(shù)據(jù)、進(jìn)程管理。使用FFI API而不是JNI綁定本地代碼和內(nèi)存將成為開發(fā)人員更喜歡的方式。JEP 191并不包含對(duì)JNI的增強(qiáng),不過這些可能會(huì)加入到JSR進(jìn)程中。
目前,JNI是編寫Java本地方法以及將Java虛擬機(jī)嵌入本地應(yīng)用程序的標(biāo)準(zhǔn)編程接口。它管理著JVM和非托管的本地環(huán)境之間的邊界,提供數(shù)據(jù)編組和對(duì)象生命周期管理協(xié)議。根據(jù)JEP 191,JNI在下列幾個(gè)方面最令開發(fā)人員痛苦:
需要開發(fā)人員編寫C代碼,這意味著他們需要具備一個(gè)完全不同于Java的世界的專業(yè)知識(shí)。
由于開發(fā)人員必須對(duì)JVM如何管理內(nèi)存和代碼多少有一些了解,所以典型的C和Java開發(fā)人員通常并不具備使用JNI所需的專業(yè)知識(shí)。
開發(fā)人員必須能夠?yàn)樗麄兿胍С值拿總(gè)平臺(tái)構(gòu)建代碼,或者為終端用戶提供適當(dāng)?shù)墓ぞ撸伤麄儊硗瓿蛇@項(xiàng)工作。
相比于相同的庫(kù)綁定到本地應(yīng)用程序,基于JNI的庫(kù)性能通常較差。
JNI充當(dāng)了一個(gè)不透明的安全邊界。JDK并不知道庫(kù)中的函數(shù)可能會(huì)調(diào)用什么,或者庫(kù)中的代碼是否會(huì)損害JVM的穩(wěn)定或安全。
JNI的問題可以通過在JDK中內(nèi)建FFI API來解決。Java FFI將更容易實(shí)現(xiàn),而且不需要太多關(guān)于JVM內(nèi)部原理和各種宿主平臺(tái)的專業(yè)知識(shí)。FFI API將提供下列特性:
一個(gè)描述本地庫(kù)調(diào)用和本地內(nèi)存結(jié)構(gòu)的元數(shù)據(jù)系統(tǒng)。
發(fā)現(xiàn)和加載本地庫(kù)的機(jī)制。
基于元數(shù)據(jù)將庫(kù)/函數(shù)或內(nèi)存結(jié)構(gòu)綁定到Java端點(diǎn)的機(jī)制。
用于Java數(shù)據(jù)類型和本地?cái)?shù)據(jù)類型之間編組和解組的代碼。 |
 |
|