欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
使用JNA替代JNI調用本地方法
JNA全稱(chēng)是Java Native Access,Sun推出的一種調用本地方法技術(shù),比起它的同門(mén)師兄JNI,JNA大大簡(jiǎn)化了調用本地方法的過(guò)程,使用也比較方便, JNA是在JNI的基礎上完善的,用青出于藍而勝于藍來(lái)形容一點(diǎn)不為過(guò),下面看一下JNI的調用過(guò)程:    

      

      使用JNI你得完成上面這些步驟,比較麻煩,而是用JNA就省事多了,基本上不需要脫離Java環(huán)境就可以完成。
  
   JNA項目主頁(yè)是https://jna.dev.java.net/, 目前最新的版本是3.2.4 。下載時(shí)記得將自帶的Example.jar 也下載下來(lái),這個(gè)里面提供了一些JNA的例子,通過(guò)這個(gè)能夠更快的了解JNA。

    使用JNA的調用本地方法的時(shí)候需要自定義數據結構,下面我們通過(guò)調用Windows提供的的鎖定工作站方法來(lái)了解一下JNA。

    1、首先查詢(xún)Windows API知道鎖定工作站的方法在user32.dll中定義,接下來(lái)定義一個(gè)接口來(lái)繼承JNALibrary.java接口,用作聲明DLL庫文件,這里我們就把它命名為User32:      

 public interface User32 extends Library {
}

    2、查詢(xún)user32.dll提供的API得知鎖定工作方法是LockWorkStation,返回類(lèi)型是boolean型,在User32.java中新增相應的方法:

boolean LockWorkStation();

         這樣我們的User32.java這個(gè)類(lèi)就定義好了。接下來(lái)我們寫(xiě)測試程序進(jìn)行調用。

    3、編寫(xiě)測試類(lèi)比如LockWorkStation.java,首先通過(guò)JNANative類(lèi)加載對應的dll:     

User32 user32 = (User32) Native.loadLibrary("user32", User32.class);

        然后就可以調用LockWorkStation方法了,完整代碼如下:      

public class LockWorkStation {
    
public static void main(String[] args) {
       User32 user32 
= (User32) Native.loadLibrary("user32", User32.class);
       user32.LockWorkStation();
    }
}

  這里說(shuō)明一下loadLibrary方法中第一個(gè)參數是需要加載的dll文件名稱(chēng),第二個(gè)參數的作用是讓JNA使用這個(gè)類(lèi)的加載器去加載DLL文件,加載順序是,先從Users.class類(lèi)的當前文件夾找,如果沒(méi)有找到,再在工程當前文件夾下面找win32/win64文件夾,找到后搜索對應的dll文件,如果找不到再到WINDOWS下面去搜索,再找不到就會(huì )拋異常了。以TWAINDSM.dll將文件放到工程的根文件夾可以按照下面這個(gè)格式放:

   上面的User32定義的是dll庫文件,有時(shí)會(huì )碰到比如HANDLE、POINT、WORD和MSG等數據類(lèi)型,有些數據類(lèi)型JNA中沒(méi)有提供,需要自己定義,根據作用的不同,定義的時(shí)候繼承的父類(lèi)也不一樣,比如HANDLE定義方法是:
 class HANDLE extends PointerType {
        
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);
        }
    }
    HANDLE被定義為類(lèi)型安全的指針。而POINT用作表示坐標,不需要這么復雜,定義方式為:
 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ì )拋出”非法內存訪(fǎng)問(wèn)”,這時(shí)候檢查一下變量是否==null。還有內存對齊的問(wèn)題,當從內存中獲取圖片信息進(jìn)行保存的時(shí)候,如果內存對齊處理不好,就會(huì )拋出很?chē)乐氐漠惓?導致JVM異常退出,JNA提供了四種內存對齊的方式,分別是:ALIGN_DEFAULT、ALIGN_NONE、ALIGN_GNUCALIGN_MSVC。ALIGN_DEFAULT采用平臺默認的對齊方式(推薦);ALIGN_NONE是不采用對齊方式;ALIGN_GNUC為針對linux/gcc操作系統的對齊方式。ALIGN_MSVC為針對win32/msvc架構的內存對齊方式。

     JNA也提供了一種保護機制.比如防止JNA出現異常不會(huì )導致JVM異常退出,默認是開(kāi)啟這個(gè)功能的,開(kāi)啟方式為System.setProperty(“jna.protected”,”true”); 記得要在JNA加載dll文件之前調用,然后try {...} catch(Throwable e)異常,不過(guò)你也不要期望過(guò)高,不要以為加上這個(gè)就萬(wàn)事大吉,出現”非法內存訪(fǎng)問(wèn)”的時(shí)候還是會(huì )束手無(wú)策。JNA也提供了一種保護機制.比如防止JNA出現異常不會(huì )導致JVM異常退出,默認是開(kāi)啟這個(gè)功能的,開(kāi)啟方式為System.setProperty(“jna.protected”,”true”); 記得要在JNA加載dll文件之前調用,然后try {...} catch(Throwable e)異常,不過(guò)你也不要期望過(guò)高,不要以為加上這個(gè)就萬(wàn)事大吉,出現”非法內存訪(fǎng)問(wèn)”的時(shí)候還是會(huì )束手無(wú)策。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
JNA—JNI終結者
幾種java調用dll的方式
【轉】如何在android上支持JNA <一>知識準備
java調用底層的幾種方法
JNA示例
JNI的替代者
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久