java調用dll動態庫方法

來源:互聯網
上載者:User

jnative的jar下載地址:

http://download.csdn.net/detail/heqinghua217/8865831


也可以去官網下載,地址如下

http://sourceforge.net/projects/jnative/


簡單點的說明步驟:

我的是 windows環境 ,步驟如下,

1、把jnative.jar解壓,  開啟lib-bin目錄,找到JNativeCpp.dll,把此檔案放入系統硬碟,我的是c盤,路徑如下, C:\Windows\System32 下

2、把自己要調用的動態庫,放入你指定的目錄,我這裡放入的是F:\\EhfscliaxDll.dll 

3、把jar匯入到web項目的lib目錄中,如果不是web項目,可以放入jdk的ext目錄中,

4、執行如下代碼:返回http://中文127.0.0.1:10087 表示成功


代碼如下

public static void exeDll1(){
try {

System.load("F:\\EhfscliaxDll.dll");
JNative getUrl = new JNative("EhfscliaxDll.dll", "getUrl");
getUrl.setRetVal(Type.STRING);
getUrl.setParameter(0, "127.0.0.1");
getUrl.setParameter(1, 10087);
getUrl.setParameter(2, 123);
getUrl.invoke();
System.out.println(getUrl.getRetVal());
} catch (Exception e) {
e.printStackTrace();
}

}

--輸出參數還是需要自己去定義的,比如我如下的列子,0-6是輸入參數,7是輸出參數,要擷取輸出參數,需要黑色字型的寫法

原來是這麼寫的,設定傳回值是getUrl.setRetVal(Type.String);擷取傳回值是:System.out.println(getUrl.getRetVal());  //,

然後輸出了一大堆日誌,報了一堆錯誤,改寫成現在這樣就好了,終於搞定了,

public static void exeDll2(){
try {
System.load("F:\\OnLineDll.dll");
JNative getUrl = new JNative("OnLineDll.dll", "OnlineSign");
getUrl.setRetVal(Type.INT);//返回狀態
getUrl.setParameter(0, 1);
getUrl.setParameter(1, "1202020709914498651");
getUrl.setParameter(2, "20150714");
getUrl.setParameter(3, "1");
getUrl.setParameter(4, "1234567890");
getUrl.setParameter(5, "79274");
getUrl.setParameter(6, "false");

MemoryBlock m = MemoryBlockFactory.createMemoryBlock(1024);
//指向記憶體塊的指標
Pointer pp = new Pointer(m);
getUrl.setParameter(7, pp); //輸出參數
getUrl.invoke();
System.out.println(getUrl.getRetVal());//調用狀態
System.out.println(pp.getAsString());//輸出參數

// 原來是這麼寫的,設定傳回值是getUrl.setRetVal(Type.String);擷取傳回值是:System.out.println(getUrl.getRetVal());  //,然後輸出了一大堆日誌,報了一堆錯誤,改寫成現在這樣就好了,終於搞定了

getUrl.dispose(); // 記得釋放 



} catch (Exception e) {
e.printStackTrace();
}

}


------------------------------   以下內容來自 http://tvjody.iteye.com/blog/125643  (他寫的很好)

因為項目的需求,要在JAVA項目中調用Windows的Dll(動態連結程式庫)檔案,之前用Jni調用過C寫的Dll檔案,比較麻煩,這裡不多說,網上也有很多這方面的文檔。

在網上找到一個開源的組件JNative,使用後感覺比較方便。


獲得三個檔案,分別是:JNativeCpp.dll,libJNativeCpp.so,JNative.jar 。 
JNativeCpp.dll Windows下用的,拷貝到windows / system32目錄下;
libJNativeCpp.so Linux下的,拷貝到系統目錄下;
JNative.jar 這是一個擴充包,匯入工程LIB中或將其拷貝到jdk\jre\lib\ext 下,系統會自動載入。

使用說明

我的項目將使用JNative組件調用一個測試應用伺服器狀態的TestAppSvr.dll檔案,Dll檔案中包含一個TestConnect()方法,返回一個整形的結果(1或0)

首先配置好JNative組件的windows環境:
將Native要用到JNativeCpp.dll放在系統硬碟的\WINDOWS\system32下

將JNative.jar匯入工程中,建立一個調用類: java 代碼 package com.tvjody;       import java.io.File;    import java.io.FileOutputStream;    import java.io.IOException;    import java.io.InputStream;       import org.xvolks.jnative.JNative;    import org.xvolks.jnative.Type;    import org.xvolks.jnative.exceptions.NativeException;       public class AppSvrTestConnect {           public AppSvrTestConnect() {           }                /**        * 測試應用伺服器串連狀態        *         *  TestConnect         * @param ip 應用伺服器IP        * @param port 連接埠        * @param intrcpt  是否採用資料壓縮方式 1 :true 0:false        * @return int 1 :成功 0:失敗        * @throws NativeException        * @throws IllegalAccessException        */       private static final int TestConnect(String ip, int port, int intrcpt)throws NativeException, IllegalAccessException {            JNative n = null;            try {                           n = new JNative("TestAppSvr.dll", "TestConnect");                n.setRetVal(Type.INT);                int i = 0;                n.setParameter(i++, Type.STRING, ip);                n.setParameter(i++, Type.INT, "" + port);                n.setParameter(i++, Type.INT, "" + intrcpt);                n.invoke();                return Integer.parseInt(n.getRetVal());            } finally {                if (n != null)                    n.dispose();            }        }        /**        * 指定Dll檔案路徑,動態載入本地連結庫,測試應用伺服器串連狀態        * setDllPath        * @param path Dll檔案的路徑,不包含DLL名稱 例如:windows - d:\test\test\ unix - root/test/test/        * @param ip 應用伺服器IP        * @param port 連接埠        * @param intrcpt  是否採用資料壓縮方式 1 :true 0:false        * @return int 1 :成功 0:失敗        * @throws NativeException        * @throws IllegalAccessException        */       public static final int TestConnectFromDllPath(String path,String ip, int port, int intrcpt) throws NativeException, IllegalAccessException{            path += "TestAppSvr.dll";            System.load(path);            return TestConnect(ip,port,intrcpt);        }        /**        * Dll檔案放在JRE\bin目錄下面,ClassLoader就能通過System.loadLibrary()動態載入本地連結庫        * TestConnectFromDllPath        * @param ip 應用伺服器IP        * @param port 連接埠        * @param intrcpt  是否採用資料壓縮方式 1 :true 0:false        * @return int 1 :成功 0:失敗        * @throws NativeException        * @throws IllegalAccessException        */       public static final int TestConnectFromDllPath(String ip, int port, int intrcpt) throws NativeException, IllegalAccessException{            System.loadLibrary("TestAppSvr");            return TestConnect(ip,port,intrcpt);        }    }  
這個類實現了一個靜態私人方法,用來調用Dll檔案中的方法返回結果

private static final int TestConnect(String ip, int port, int intrcpt)

兩個靜態公用方法,分兩種方式裝載DLL檔案

public static final int TestConnectFromDllPath(String path,String ip, int port, int intrcpt)  //通過DLL檔案的路徑
public static final int TestConnectFromDllPath(String ip, int port, int intrcpt) //通過ClassLoader

             然後建立一個類,調用AppSvrTestConnect.java,實現方法一調用,我是將TestAppSvr.dll檔案與Demo.java放在一個目錄下 ,所以得到Demo.java的路徑後就可以得到TestAppSvr.dll的路徑,調用AppSvrTestConnect.TestConnectFromDllPath()方法後就能返回正確的資訊.方法二是已經將TestAppSvr.dll放在了Jre\bin目錄下,在JVM的Classloader的時候會自動載入,然後通過System.loadLibrary("TestAppSvr")就可以裝配DLL檔案. java 代碼 public class Demo {        public int getInfo() throws NativeException, IllegalAccessException{                        String path=getClass().getResource(File.separator).getPath();                   path = path.substring(1,path.length());            System.out.println(path);   //得到DLL檔案的路徑                        String ip = "192.168.0.48"; //伺服器IP            int port = 221;             //連接埠            int intrcpt = 1;            //資料壓縮方式傳送,1為採用;0為不採用            //方法1 傳入Dll檔案的路徑            //int info = AppSvrTestConnect.TestConnectFromDllPath(path, ip, port, intrcpt);                       //方法2 Dll檔案已經放在JRE\bin目錄下面            int info = AppSvrTestConnect.TestConnectFromDllPath(ip, port, intrcpt);                        //1為成功,0為失敗            if (info == 1)                System.out.println("應用伺服器可用。");            else               System.out.println("應用伺服器不可用,請檢查IP地址和連接埠是否正確。");                        return info;        }          


 System.loadLibrary():裝載Windows\System32下或jre\bin或Tomcat\bin目錄下的本地連結庫

System.load():根據具體的目錄來加截本地連結庫,必須是絕對路徑

 

備忘

上面的樣本工程,因為是例子,所以沒有大多的設計,只是實現了裝載DLL檔案,調用DLL檔案方法,返回資訊.

JNative的詳細說明,請參考JNative的來源程式和例子.

注意JVM只允許一個預設的ClassLoader來load native library,同時並不提供專門的API來unload一個loaded native library,所以在項目調試的時候,獨立啟動Web Server.
 


---------------------------------注意事項:來自http://www.cnblogs.com/beastplus/p/3156080.html


JNative用法注意事項

公司要做個跟裝置打交道的web系統,需要java調用dll。搞java的同事說JNative看起來挺好使的,找俺幫忙調通。用的是1.3.1版本 環境設定。

JNative的調試資訊需要開啟才能更清楚些,要不總是說沒載入庫,跟沒說一樣。

System.setProperty("jnative.debug", "true");

如果調試資訊裡有System.LoadLibrary(),說明沒有載入JNativeCpp.dll,指定全路徑即可,雙斜杠哦。

System.setProperty("jnative.loadNative", "D:\\Test\\JNativeCpp.dll"); lib庫路徑問題 windows

在windows下需要把調用的dll路徑設定到環境變數PATH中,除非你不介意拷到win32中,dll依賴的庫也得在PATH或win32中。 linux

 linux下同樣需要設定環境變數,編輯bashrc,添加 export LD_LIBRARY=so路徑,依賴的庫也得在PATH中,除非都放在/usr/lib/下 lib庫名稱問題

無論linux還是windows在JNative的建構函式中的lib庫名字為庫全名,包括副檔名dll、so,而且so需要包括前面的‘lib’,貌似與網上說的不太一樣。 資源釋放問題

有些裝置需要先初始化在操作,最後釋放,所有功能都分散在不同函數中,JNative需要有個靜態執行個體,每次建立調用函數時lib庫依舊是載入的。


-----------------------------------------------------------一下文章來自http://blog.163.com/wex660@126/blog/static/24153065201031554358152/



今天,使用JNative遇到了一些小問題,鬱悶是我,弄了很久才發現問題的所在: 
先說一下JNative的使用吧(JNative是封裝了訪問動態庫的相關東西,方便java訪問動態庫的一個jar包): 
首先:下載JNative(http://sourceforge.net/projects/jnative/)又是sourceforge的東西;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.