JNA(Java Native Access)框架是一個(gè)開(kāi)源的Java框架,是SUN公司主導開(kāi)發(fā)的,建立在經(jīng)典的JNI的基礎之上的一個(gè)框架.
相比于jni,jna的優(yōu)勢有如下兩點(diǎn):
1)使用方便,如果有一個(gè)現有的.dll/.so文件,如果使用JNI技術(shù)調用,我們首先需要另外使用C語(yǔ)言寫(xiě)一個(gè).dll/.so共享庫,使用SUN規定的數據結構替代C語(yǔ)言的數據結構,調用已有的 dll/so中公布的函數。
JNA中,它提供了一個(gè)動(dòng)態(tài)的C語(yǔ)言編寫(xiě)的轉發(fā)器,不需要再編寫(xiě)適配用的.dll/.so,只需要在Java中編寫(xiě)一個(gè)接口和一些代碼,作為.dll/.so的代理,就可以在Java程序中調用dll/so。
2)比較好地處理不同語(yǔ)言之間數據類(lèi)型不一致造成的問(wèn)題,減輕了上層開(kāi)發(fā)者的負擔。
但是JNA畢竟是為上層開(kāi)發(fā)者考慮的,注意它是一個(gè)“Java框架”,它有兩大缺點(diǎn)為下層開(kāi)發(fā)者不滿(mǎn):
1)使用JNA技術(shù)比使用JNI技術(shù)調用動(dòng)態(tài)鏈接庫會(huì )有些微的性能損失??赡芩俣葧?huì )降低幾倍,這對桌面系統無(wú)所謂, 可對于本身資源緊張的嵌入式系統,尤其是要求實(shí)時(shí)性高的通訊類(lèi)應用(一般協(xié)議層都是C架構的)可能就是致命缺陷。
2)使用JNI技術(shù),不僅可以實(shí)現Java訪(fǎng)問(wèn)C函數,也可以實(shí)現C語(yǔ)言調用Java代碼。
而JNA只能實(shí)現Java訪(fǎng)問(wèn)C函數,作為一個(gè)Java框架,自然不能實(shí)現C語(yǔ)言調用Java代碼。此時(shí),你還是需要使用JNI技術(shù)。聯(lián)系客服