前言:在項目中經常使用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日,晚。