Java(使用JNA)調用DLL庫與C#調用DLL庫的對比


前言:在項目中經常使用DLL庫對硬件進行操作,在發卡過程中使用頻率尤為多,今天就Java與C#中調用DLL庫的使用區別做一個介紹,本文着重具體的代碼編寫,具體過程看以下代碼。

前提條件:

筆者已經封裝了一個DLL庫名為:testdll.dll(具體封庫細節,請查閱相關資料),庫中包含兩個函數:

注:Add為兩個整數相加,Sub為兩個整數相減。


1.C#中DLL庫的調用

1.1 創建一個基於控制台的C#工程,其工程結構如下圖所示(testdll.dll文件在Debug目錄下)

其中testDLL.cs內容如下:

 1 class testDLL
 2 {
 3         /*
 4          * 與testdll.dll文件中的函數相關聯,這里注意testdll.dll文件的放置位置
 5          * CallingConvention = CallingConvention.Cdecl的值,與封庫時,函數的調用關系有關
 6          */
 7         [DllImport("testdll.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
 8         public static extern int Add(int a,int b);
 9 
10         [DllImport("testdll.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
11         public static extern int Sub(int a,int b);
12 }

Program.cs代碼如下:

 1 class Program
 2 {
 3         static void Main(string[] args)
 4         {
 5             int a=3;
 6             int b=2;
 7             int resultadd = testDLL.Add(a, b);
 8             int resultsub = testDLL.Sub(a, b);
 9             Console.WriteLine("resultadd=" + resultadd);
10             Console.WriteLine("resultsub=" + resultsub);
11             Console.ReadKey();
12         }
13 }

運行結果如下圖所示:

2.Java中DLL庫的調用(使用JNA對DLL庫進行調用)

2.1 創建一個java工程,其結構目錄如下:

注:這里需要將testdll.dll文件,放入相關包中,不然很容易出現文件不存在的異常

其中Clibary接口的代碼如下:

 1 public interface Clibary extends StdCallLibrary
 2 {
 3     /**
 4       注意這里dll文件放置的位置,以及dll文件夾的類型,不然會讀取不到dll文件
 5       注意以上點即可正確的調用dll文件
 6      */
 7     URL dllurl =Clibary.class.getResource("dll/testdll.dll");
 8 
 9     String libpathstring= dllurl.getFile().substring(1).replace("/","//");
10 
11     Clibary instance= (Clibary) Native.loadLibrary(libpathstring,Clibary.class);
12 
13 
14     /**
15      * 庫中函數
16      */
17     public abstract int Add(int a,int b);
18 
19     public abstract int Sub(int a,int b);
20 
21 }

注意:上述代碼的編寫,不然很有可能出現testdll文件找不到的情況。

test測試代碼如下:

 1 @Test
 2 public void testdll()
 3 {
 4         int a = 3;
 5         int b = 2;
 6         int resultadd = Clibary.instance.Add(a, b);
 7         int resultsub = Clibary.instance.Sub(a, b);
 8         System.out.println("resultadd="+resultadd);
 9         System.out.println("resultsub="+resultsub);
10 
11 }

其運行結果如下圖所示:

3.總結

通過上述兩個工程,可以很清晰的看到java與C#調用DLL庫的不同之處,總的來說過程都比較簡單,主要難點在於對應接口函數形參的元素類型,當然在本例中直接用int就可以了,但是實際過程中,往往會有所不同,當找到DLL庫與接口函數形參的正確對應形式后,調用DLL庫就變得非常的簡單了。


by Shawn Chen,2018.3.13日,晚。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM