標籤:通過 樣本 檔案 ref src jna path get win
JNA(Java Native Access):是建立在JNI之上的Java開源架構,SUN主導開發,用來調用C、C++代碼,尤其是底層的庫檔案(windows中叫dll檔案,linux下是.so檔案)。
先注意幾個問題:
1.下載jna.jar包,jna-platform.jar 可以不要,但是有的話對代碼的調試是有協助的;platform.jar對於jna.jar是一種補充和擴充,jna.jar相當於核,platfrorm.jar相當於增量外掛程式。
2.動態連結程式庫編譯時間的平台。如果是通過x86平台編譯,那麼就只能使用32位的jdk環境載入,如果是64位jdk就必須使用x64平台編譯動態庫;不然,即使後面編碼,動態連結程式庫的路徑都沒有問題,調用還是會報錯。
3.調用時多注意dll的位置。
代碼開始:
對於Java來說,一般都是調用已經產生好的dll動態庫。所以LZ並沒有貼動態庫的產生。若需要,百度一下即可。
public class JNATestDll { public interface Dll extends Library{ Dll instance = (Dll) Native.loadLibrary("HidComm", Dll.class); public boolean LoadHidComm(); public boolean HidWriteData(String buf,int len); } public static void main(String[] args) { boolean load = Dll.instance.LoadHidComm(); if (load) { String buf = "weixin://wxpay/bizpayurl?pr=FCT5hbP"; int len = buf.length(); boolean ewm = Dll.instance.HidWriteData(buf, len); System.out.println(ewm); } }}
這是普通的Java項目的調用測試,LZ是把dll動態庫放到項目的根目錄下的,就是選中項目然後複製就ok了。
下面這個例子是web項目中調用dll動態庫樣本:
public class JnaCallDllService { private static String path = System.getProperty("user.dir").concat(File.separator).concat("lib").concat(File.separator); public interface SerialAndDllNew extends Library { SerialAndDllNew instance = (SerialAndDllNew)Native.loadLibrary(path.concat("zzcard"), SerialAndDllNew.class); public int Icc_OpenComPort(int nPort, String gate, int baud, int timeout); public int Icc_PowerOn(int card_no,ByteByReference atr,ShortByReference ictype); }}
path部分就是動態庫的路徑,因為LZ的應用是要放到linux環境下部署的。LZ是把動態庫放到lib下的,這樣方便部署,簡單方便。如所示:
LZ是先測試後,再在項目中運用,上面兩種方式均成功。
Java(JNA)調用C++動態庫(dll)