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的東西;