Java(使用JNA)调用DLL库与C#调用DLL库的对比

摘要:
前提条件:作者已经封装了一个名为testdll的DLL库。dll,它包含两个函数:注意:Add是两个整数的加法,Sub是两个整型的减法。

前言:在项目中经常使用DLL库对硬件进行操作,在发卡过程中使用频率尤为多,今天就Java与C#中调用DLL库的使用区别做一个介绍,本文着重具体的代码编写,具体过程看以下代码。

前提条件:

笔者已经封装了一个DLL库名为:testdll.dll(具体封库细节,请查阅相关资料),库中包含两个函数:

Java(使用JNA)调用DLL库与C#调用DLL库的对比第1张

注:Add为两个整数相加,Sub为两个整数相减。


1.C#中DLL库的调用

1.1 创建一个基于控制台的C#工程,其工程结构如下图所示(testdll.dll文件在Debug目录下)

Java(使用JNA)调用DLL库与C#调用DLL库的对比第2张

其中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库的对比第3张

2.Java中DLL库的调用(使用JNA对DLL库进行调用)

2.1 创建一个java工程,其结构目录如下:

Java(使用JNA)调用DLL库与C#调用DLL库的对比第4张

注:这里需要将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库的对比第5张

3.总结

通过上述两个工程,可以很清晰的看到java与C#调用DLL库的不同之处,总的来说过程都比较简单,主要难点在于对应接口函数形参的元素类型,当然在本例中直接用int就可以了,但是实际过程中,往往会有所不同,当找到DLL库与接口函数形参的正确对应形式后,调用DLL库就变得非常的简单了。


by Shawn Chen,2018.3.13日,晚。

免责声明:文章转载自《Java(使用JNA)调用DLL库与C#调用DLL库的对比》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇软件开发版本管理阶段描述kali 扫描之burp Suite学习笔记1下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python列表操作与深浅拷贝(5)——数字处理函数、类型判断、列表链表队列栈

python内建数据结构 分类 数值型:  int  float  complex  bool 序列对象: 字符串str  列表list  元组tuple 键值对:  集合set  字典dict 数值型 (list float complex bool都是class) int:python3 中 int 就是长整型,没有大小限制 float:支持十进制和科...

VB创建类模块DLL文件

最近需要调用MSCOMM32.OCX控件,但是ABAP调用过程中发现无法同时发送多条记录,则需调整实现方式:   a.创建DLL文件封装MSCOMM控件相关属性及方法   b.系统注册DLL文件   c.ABAP调用DLL文件相关属性及方法 这一部分内容主要是将VB类模块的创建过程记录下: 1.打开VB,创建ActiveX DLL文件   2.修改工程名为...

C# 关键字extern用法

修饰符用于声明在外部实现的方法。extern 修饰符的常见用法是在使用 Interop 服务调入非托管代码时与 DllImport 属性一起使用;在这种情况下,该方法还必须声明为 static,如下面的示例所示:[DllImport("avifil32.dll")]private static extern void AVIFileInit();注意ext...

VS2008编译的程序在某些机器上运行提示“由于应用程序配置不正确,应用程序未能启动”的问题

使用VS2008编译了一个程序,使用到自己编译的DLL,丢到某些机子上无法运行,提示“由于应用程序配置不正确,应用程序未能启动”的错误,装了vcredist_x86也没有用,开始以为是DLL的问题,后来换个简单的程序,仍然不行,百撕不得其解,后来上网找,下面有说了很多解决办法。 我最终的解决办法是复制本机中的.manifest文件,修改里面的版本号,复制到提...

实现WinForm窗体的美化(借助第三方控件)

在winform项目中,其实皮肤就是一个第三方的控件,名字是IrisSkin4.dll只要添加到你的工具箱里就可以和其它控件一样使用了 一.添加控件IrisSkin4.dll。方法: 先把IrisSkin4.dll文件添加到当前项目引用(解决方案资源管理器->当前项目->引用->右键->添加引用,找到IrisSkin4.dll文件....

头文件重复包含问题

|版权声明:本文为博主原创文章,未经博主允许不得转载。 关于头文件重复包含的问题,以前一直不太清楚,今天特意翻了一下参考书和网上查阅资料,有了如下的理解: 这样说明,如果定义了头文件A.h,B.h和源文件C.cpp。如果我们在A.h中写上一个函数,在B.h中include A.h,然后再在C.cpp中include A.h和B.h,这样我们就会出现重复包含...