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日,晚。