1. 程式人生 > >Java(JNA)調用C++動態庫(dll)

Java(JNA)調用C++動態庫(dll)

x86 class hid enc spa 好的 開源 技術分享 lan

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)