|
JNA全稱是Java Native Access,是Sun推出的一種調(diào)用本地方法技術(shù),比起它的同門師兄JNI,JNA大大簡(jiǎn)化了調(diào)用本地方法的過(guò)程,使用也比較方便, JNA是在JNI的基礎(chǔ)上完善的,用青出于藍(lán)而勝于藍(lán)來(lái)形容一點(diǎn)不為過(guò),下面看一下JNI的調(diào)用過(guò)程:
使用JNI你得完成上面這些步驟,比較麻煩,而是用JNA就省事多了,基本上不需要脫離Java環(huán)境就可以完成。 public interface User32 extends Library {
} 2、查詢user32.dll提供的API得知鎖定工作方法是LockWorkStation,返回類型是boolean型,在User32.java中新增相應(yīng)的方法: boolean LockWorkStation();
這樣我們的User32.java這個(gè)類就定義好了。接下來(lái)我們寫測(cè)試程序進(jìn)行調(diào)用。 3、編寫測(cè)試類比如LockWorkStation.java,首先通過(guò)JNA的Native類加載對(duì)應(yīng)的dll: User32 user32 = (User32) Native.loadLibrary("user32", User32.class);
然后就可以調(diào)用LockWorkStation方法了,完整代碼如下: public class LockWorkStation {
public static void main(String[] args) { User32 user32 = (User32) Native.loadLibrary("user32", User32.class); user32.LockWorkStation(); } } 這里說(shuō)明一下loadLibrary方法中第一個(gè)參數(shù)是需要加載的dll文件名稱,第二個(gè)參數(shù)的作用是讓JNA使用這個(gè)類的加載器去加載DLL文件,加載順序是,先從Users.class類的當(dāng)前文件夾找,如果沒(méi)有找到,再在工程當(dāng)前文件夾下面找win32/win64文件夾,找到后搜索對(duì)應(yīng)的dll文件,如果找不到再到WINDOWS下面去搜索,再找不到就會(huì)拋異常了。以TWAINDSM.dll將文件放到工程的根文件夾可以按照下面這個(gè)格式放: class HANDLE extends PointerType { HANDLE被定義為類型安全的指針。而POINT用作表示坐標(biāo),不需要這么復(fù)雜,定義方式為:private boolean immutable; public HANDLE() { } public HANDLE(Pointer p) { setPointer(p); immutable = true; } public Object fromNative(Object nativeValue, FromNativeContext context) { Object o = super.fromNative(nativeValue, context); if (INVALID_HANDLE_VALUE.equals(o)) return INVALID_HANDLE_VALUE; return o; } public void setPointer(Pointer p) { if (immutable) throw new UnsupportedOperationException("immutable reference"); super.setPointer(p); } } class POINT extends Structure { public int x, y; public POINT() { } public POINT(int x, int y) { this.x = x; this.y = y; } } 使用JNA的過(guò)程中也不一定會(huì)一帆風(fēng)順,比如會(huì)拋出”非法內(nèi)存訪問(wèn)”,這時(shí)候檢查一下變量是否==null。還有內(nèi)存對(duì)齊的問(wèn)題,當(dāng)從內(nèi)存中獲取圖片信息進(jìn)行保存的時(shí)候,如果內(nèi)存對(duì)齊處理不好,就會(huì)拋出很嚴(yán)重的異常,導(dǎo)致JVM異常退出,JNA提供了四種內(nèi)存對(duì)齊的方式,分別是:ALIGN_DEFAULT、ALIGN_NONE、ALIGN_GNUC和ALIGN_MSVC。ALIGN_DEFAULT采用平臺(tái)默認(rèn)的對(duì)齊方式(推薦);ALIGN_NONE是不采用對(duì)齊方式;ALIGN_GNUC為針對(duì)linux/gcc操作系統(tǒng)的對(duì)齊方式。ALIGN_MSVC為針對(duì)win32/msvc架構(gòu)的內(nèi)存對(duì)齊方式。 JNA也提供了一種保護(hù)機(jī)制.比如防止JNA出現(xiàn)異常不會(huì)導(dǎo)致JVM異常退出,默認(rèn)是開(kāi)啟這個(gè)功能的,開(kāi)啟方式為System.setProperty(“jna.protected”,”true”); 記得要在JNA加載dll文件之前調(diào)用,然后try {...} catch(Throwable e)異常,不過(guò)你也不要期望過(guò)高,不要以為加上這個(gè)就萬(wàn)事大吉,出現(xiàn)”非法內(nèi)存訪問(wèn)”的時(shí)候還是會(huì)束手無(wú)策。JNA也提供了一種保護(hù)機(jī)制.比如防止JNA出現(xiàn)異常不會(huì)導(dǎo)致JVM異常退出,默認(rèn)是開(kāi)啟這個(gè)功能的,開(kāi)啟方式為System.setProperty(“jna.protected”,”true”); 記得要在JNA加載dll文件之前調(diào)用,然后try {...} catch(Throwable e)異常,不過(guò)你也不要期望過(guò)高,不要以為加上這個(gè)就萬(wàn)事大吉,出現(xiàn)”非法內(nèi)存訪問(wèn)”的時(shí)候還是會(huì)束手無(wú)策。 |
|
|
來(lái)自: qiujingLib > 《JNA》