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是先測試后,再在項目中運用,上面兩種方式均成功。