天天看點

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

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

前提條件:

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

Java(使用JNA)調用DLL庫與C#調用DLL庫的對比
注:Add為兩個整數相加,Sub為兩個整數相減。

1.C#中DLL庫的調用

1.1 建立一個基于控制台的C#工程,其工程結構如下圖所示(testdll.dll檔案在Debug目錄下)

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

其中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 }      

運作結果如下圖所示:

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

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

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

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

注:這裡需要将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 }      

其運作結果如下圖所示:

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

3.總結

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

by Shawn Chen,2018.3.13日,晚。

=========================================================

比你優秀的人比你還努力,你有什麼資格不去奮鬥!

__一個有理想的程式員。