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

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

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

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

    BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
      46 Posts :: 1 Stories :: 178 Comments :: 0 Trackbacks
          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)境就可以完成。
      
       JNA項(xiàng)目主頁(yè)是https://jna.dev.java.net/, 目前最新的版本是3.2.4 。下載時(shí)記得將自帶的Example.jar 也下載下來(lái),這個(gè)里面提供了一些JNA的例子,通過(guò)這個(gè)能夠更快的了解JNA

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

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

     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ò)JNANative類加載對(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è)格式放:

       上面的User32定義的是dll庫(kù)文件,有時(shí)會(huì)碰到比如HANDLE、POINT、WORD和MSG等數(shù)據(jù)類型,有些數(shù)據(jù)類型JNA中沒(méi)有提供,需要自己定義,根據(jù)作用的不同,定義的時(shí)候繼承的父類也不一樣,比如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用作表示坐標(biāo),不需要這么復(fù)雜,定義方式為:
     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_DEFAULTALIGN_NONEALIGN_GNUCALIGN_MSVCALIGN_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)是開啟這個(gè)功能的,開啟方式為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)是開啟這個(gè)功能的,開啟方式為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ú)策。
        
    posted on 2010-05-06 22:35 VWPOLO 閱讀(7975) 評(píng)論(5)  編輯  收藏 所屬分類: Java 技術(shù)

    Feedback

    # re: 使用JNA替代JNI調(diào)用本地方法 2010-05-06 22:55 草屋主人
    非常實(shí)用  回復(fù)  更多評(píng)論
      

    # re: 使用JNA替代JNI調(diào)用本地方法 2010-05-07 01:13 隔葉黃鶯
    JNA 應(yīng)該是個(gè)不錯(cuò)的東西,當(dāng)初研究 JNative 的時(shí)候關(guān)注過(guò)它。  回復(fù)  更多評(píng)論
      

    # re: 使用JNA替代JNI調(diào)用本地方法 2010-05-07 13:53 99書城
    圣誕節(jié)開發(fā)商空間的肌膚  回復(fù)  更多評(píng)論
      

    # re: 使用JNA替代JNI調(diào)用本地方法 2010-05-08 09:32 BeanSoft
    感謝分享!  回復(fù)  更多評(píng)論
      

    # re: 使用JNA替代JNI調(diào)用本地方法 2010-06-18 10:32 飛熊
    同感@草屋主人
      回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 亚洲sm另类一区二区三区| 好爽…又高潮了免费毛片| 亚洲av最新在线观看网址| 久久亚洲AV无码精品色午夜麻| 免费人成视频x8x8入口| 成年轻人网站色免费看| 真实国产乱子伦精品免费| 成人网站免费大全日韩国产| 国产偷国产偷亚洲高清人| 亚洲日韩精品国产3区| 亚洲第一男人天堂| 亚洲一区二区三区国产精品无码| 久久亚洲精品成人AV| 亚洲av日韩av无码黑人| 国产亚洲精AA在线观看SEE | 国内外成人免费视频| 手机在线看永久av片免费| 2015日韩永久免费视频播放| 日韩精品无码免费专区网站| 你是我的城池营垒免费看 | 全黄性性激高免费视频| 国产成人免费a在线资源| 四虎在线播放免费永久视频 | 亚洲国产精品成人综合久久久 | 在线综合亚洲欧洲综合网站| 亚洲五月综合网色九月色| 亚洲国产区男人本色| 亚洲heyzo专区无码综合| 国产亚洲精品美女久久久久久下载| 亚洲成在人线在线播放无码| 爱情岛论坛亚洲品质自拍视频网站| 婷婷国产偷v国产偷v亚洲| 国产va免费观看| 久久国产亚洲高清观看| 久久亚洲综合色一区二区三区| 亚洲综合伊人久久综合| 色噜噜综合亚洲av中文无码| 亚洲乱码日产精品BD在线观看| 色天使亚洲综合一区二区| 中国毛片免费观看| 999国内精品永久免费观看|