<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    好好生活,努力工作,天天向上!

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      46 Posts :: 1 Stories :: 178 Comments :: 0 Trackbacks
          JNA全稱是Java Native Access,Sun推出的一種調用本地方法技術,比起它的同門師兄JNI,JNA大大簡化了調用本地方法的過程,使用也比較方便, JNA是在JNI的基礎上完善的,用青出于藍而勝于藍來形容一點不為過,下面看一下JNI的調用過程:    

          

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

        使用JNA的調用本地方法的時候需要自定義數據結構,下面我們通過調用Windows提供的的鎖定工作站方法來了解一下JNA

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

     public interface User32 extends Library {}

        2查詢user32.dll提供的API得知鎖定工作方法是LockWorkStation,返回類型是boolean型,在User32.java中新增相應的方法:

    boolean LockWorkStation();

             這樣我們的User32.java這個類就定義好了。接下來我們寫測試程序進行調用。

        3、編寫測試類比如LockWorkStation.java,首先通過JNANative類加載對應的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();
        }
    }

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

       上面的User32定義的是dll庫文件,有時會碰到比如HANDLE、POINT、WORD和MSG等數據類型,有些數據類型JNA中沒有提供,需要自己定義,根據作用的不同,定義的時候繼承的父類也不一樣,比如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被定義為類型安全的指針。而POINT用作表示坐標,不需要這么復雜,定義方式為:
     class POINT extends Structure {
            
    public int x, y;
            
    public POINT() { }
            
    public POINT(int x, int y) { this.x = x; this.y = y; }
      }
       
         使用JNA的過程中也不一定會一帆風順,比如會拋出”非法內存訪問”,這時候檢查一下變量是否==null。還有內存對齊的問題,當從內存中獲取圖片信息進行保存的時候,如果內存對齊處理不好,就會拋出很嚴重的異常,導致JVM異常退出,JNA提供了四種內存對齊的方式,分別是:ALIGN_DEFAULTALIGN_NONEALIGN_GNUCALIGN_MSVCALIGN_DEFAULT采用平臺默認的對齊方式(推薦);ALIGN_NONE是不采用對齊方式;ALIGN_GNUC為針對linux/gcc操作系統的對齊方式。ALIGN_MSVC為針對win32/msvc架構的內存對齊方式。

         JNA也提供了一種保護機制.比如防止JNA出現異常不會導致JVM異常退出,默認是開啟這個功能的,開啟方式為System.setProperty(“jna.protected”,”true”); 記得要在JNA加載dll文件之前調用,然后try {...} catch(Throwable e)異常,不過你也不要期望過高,不要以為加上這個就萬事大吉,出現”非法內存訪問”的時候還是會束手無策。JNA也提供了一種保護機制.比如防止JNA出現異常不會導致JVM異常退出,默認是開啟這個功能的,開啟方式為System.setProperty(“jna.protected”,”true”); 記得要在JNA加載dll文件之前調用,然后try {...} catch(Throwable e)異常,不過你也不要期望過高,不要以為加上這個就萬事大吉,出現”非法內存訪問”的時候還是會束手無策。
        
    posted on 2010-05-06 22:35 VWPOLO 閱讀(7975) 評論(5)  編輯  收藏 所屬分類: Java 技術

    Feedback

    # re: 使用JNA替代JNI調用本地方法 2010-05-06 22:55 草屋主人
    非常實用  回復  更多評論
      

    # re: 使用JNA替代JNI調用本地方法 2010-05-07 01:13 隔葉黃鶯
    JNA 應該是個不錯的東西,當初研究 JNative 的時候關注過它。  回復  更多評論
      

    # re: 使用JNA替代JNI調用本地方法 2010-05-07 13:53 99書城
    圣誕節開發商空間的肌膚  回復  更多評論
      

    # re: 使用JNA替代JNI調用本地方法 2010-05-08 09:32 BeanSoft
    感謝分享!  回復  更多評論
      

    # re: 使用JNA替代JNI調用本地方法 2010-06-18 10:32 飛熊
    同感@草屋主人
      回復  更多評論
      

    主站蜘蛛池模板: 免费中文字幕不卡视频| 亚洲综合视频在线| 国产精品免费AV片在线观看| 亚洲白色白色在线播放| 国产大片免费观看中文字幕| 国产免费无码AV片在线观看不卡| 亚洲伊人久久大香线蕉结合| 又粗又硬又黄又爽的免费视频| 日韩免费的视频在线观看香蕉| 亚洲Av无码一区二区二三区| 亚洲黄片手机免费观看| 最近中文字幕大全中文字幕免费| 亚洲区日韩精品中文字幕| 亚洲一区二区三区偷拍女厕| 扒开双腿猛进入爽爽免费视频| 美女无遮挡拍拍拍免费视频| 亚洲精品福利你懂| 亚洲AV永久青草无码精品| 青青青国产免费一夜七次郎| 日韩精品极品视频在线观看免费| 美美女高清毛片视频黄的一免费| 4444亚洲国产成人精品| 亚洲国产专区一区| 最近的免费中文字幕视频| a级毛片黄免费a级毛片| 色天使亚洲综合一区二区| 亚洲色偷偷偷网站色偷一区| 亚洲性久久久影院| 午夜视频在线观看免费完整版| 无码精品人妻一区二区三区免费看| 国产精品亚洲小说专区| 亚洲国产日韩视频观看| 亚洲Av熟妇高潮30p| 亚洲午夜精品久久久久久浪潮 | 最新69国产成人精品免费视频动漫| 久久国产乱子伦精品免费强| 日韩大片在线永久免费观看网站| 亚洲国产91在线| 亚洲成人一级电影| 亚洲午夜未满十八勿入| 亚洲女久久久噜噜噜熟女|