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

前提条件:

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

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


1.C#中DLL库的调用

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

其中testDLL.cs内容如下:

 class testDLL
{
/*
* 与testdll.dll文件中的函数相关联,这里注意testdll.dll文件的放置位置
* CallingConvention = CallingConvention.Cdecl的值,与封库时,函数的调用关系有关
*/
[DllImport("testdll.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern int Add(int a,int b); [DllImport("testdll.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern int Sub(int a,int b);
}

Program.cs代码如下:

 class Program
{
static void Main(string[] args)
{
int a=;
int b=;
int resultadd = testDLL.Add(a, b);
int resultsub = testDLL.Sub(a, b);
Console.WriteLine("resultadd=" + resultadd);
Console.WriteLine("resultsub=" + resultsub);
Console.ReadKey();
}
}

运行结果如下图所示:

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

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

注:这里需要将testdll.dll文件,放入相关包中,不然很容易出现文件不存在的异常

其中Clibary接口的代码如下:

 public interface Clibary extends StdCallLibrary
{
/**
注意这里dll文件放置的位置,以及dll文件夹的类型,不然会读取不到dll文件
注意以上点即可正确的调用dll文件
*/
URL dllurl =Clibary.class.getResource("dll/testdll.dll"); String libpathstring= dllurl.getFile().substring(1).replace("/","//"); Clibary instance= (Clibary) Native.loadLibrary(libpathstring,Clibary.class); /**
* 库中函数
*/
public abstract int Add(int a,int b); public abstract int Sub(int a,int b); }

注意:上述代码的编写,不然很有可能出现testdll文件找不到的情况。

test测试代码如下:

 @Test
public void testdll()
{
int a = 3;
int b = 2;
int resultadd = Clibary.instance.Add(a, b);
int resultsub = Clibary.instance.Sub(a, b);
System.out.println("resultadd="+resultadd);
System.out.println("resultsub="+resultsub); }

其运行结果如下图所示:

3.总结

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


by Shawn Chen,2018.3.13日,晚。

Java(使用JNA)调用DLL库与C#调用DLL库的对比的更多相关文章

  1. java使用JNA框架调用dll动态库

    这两天了解了一下java调用dll动态库的方法,总的有三种:JNI.JNA.JNative.其中JNA调用DLL是最方便的. ·JNI ·JNA ·JNative java使用 JNI来调用dll动态 ...

  2. Java通过jna调用c++动态库

    1 环境准备 操作系统:windows 10,x64 jna,jna-4.4.0.jar c++开发环境,vc2013 java开发环境,eclipse,jdk8 2 dll开发 通过vc2013创建 ...

  3. Java使用JNA方式调用DLL(动态链接库)(原创,装载请注明出处)

    Java使用JNA调用DLL 1.准备 1.JDK环境 2.Eclipse 3.JNA包 下载JNA包: (1).JNA的Github:https://github.com/java-native-a ...

  4. java 用JNA调用dll 参考文档

    1  Java调用C语言动态库(JNA方式):回调函数.结构体数组传参.结构体数组返回 2jna结构体数组  JNA结构体数组 3JNA调用C语言动态链接库学习实践总结 4 Java 通过 JNA 调 ...

  5. java 利用jna调用c#的dll

    一.需求阐述: 如果我们的项目利用c#开发,到了开发后期需要和java组进行合作,其中有一部分业务逻辑利用c#已经code completed,那么我们可能会考虑用java来调用现成的c#dll实现需 ...

  6. 【开发者笔记】java 利用jna调用c#的dll

    一.需求阐述: 如果我们的项目利用c#开发,到了开发后期需要和java组进行合作,其中有一部分业务逻辑利用c#已经code completed,那么我们可能会考虑用java来调用现成的c#dll实现需 ...

  7. java 用JNA方法调用C++动态链接库

    JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架.非常强大.易用,功能上类似与.NET的P/Invoke.你只 ...

  8. Java调用C/C++编写的第三方dll动态链接库(zz)

    这里主要用的方法是JNI.在网上查资料时看到很多人说用JNI非常的复杂,不仅要看很多的文档,而且要非常熟悉C/C++编程.恐怕有很多人在看到诸如此类的评论时已经决定绕道用其他方法了.本文将做详细的介绍 ...

  9. JAVA判断32位还是64位,调用不同的DLL(转)

    源:JAVA判断32位还是64位,调用不同的DLL 通过获取sun.arch.data.model可判断是32还是64的JAVA 将32或者64位的DLL放不同的目录,实现自适应调用DLL Prope ...

  10. Java(JCo3)与SAP系统相互调用

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

随机推荐

  1. 从零开始学安全(三十)●使用sqlmap对网站一步步渗透

    常规注入步骤第一步注入点-u "url" 判断是否是注入点 有就判断用户的权限第二步获取数据库 所有的 -u "url" --dbs第三步 查看应用程序所有数据 ...

  2. 从零开始学安全(三)●黑客常用的windows端口

    端口可选1-65536 1-1024 预保留端口 留给windows系统服务的 下面是常见的端口对应的服务 1 TCP Port Service Multiplexer 传输控制协议端口服务多路开关选 ...

  3. 【原创】MVC+ZTree实现权限树的功能

    今天自己采用MVC+ZTree的技术实现权限树的功能,有需要的可以收藏一下. 1.需要引用的JS 文件 <link href="~/Content/ZTree/css/demo.css ...

  4. Java基础IO流(二)字节流小案例

    JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...

  5. Javascript动态引用CSS文件的2种方法介绍

    最近做一个项目,需要javascript动态插入样式,结果以前的方法失效了!查了2个小时的原因竟然是自己手贱,这个最后再说! javascript插入样式在前端开发中应用比较广泛,特别是在修改前端表现 ...

  6. Go开发之路 -- strings以及strconv的使用

    strings的使用 HasPrefix 语法: strings.HasPrefix(s, prefix string) bool // 判断字符串s是否以prefix开头 // 判断一个url是否以 ...

  7. Powershell中显示隐藏文件

    PS> Get-ChildItem -Path $home -Force PS> Get-ChildItem -Path $home -Hidden

  8. Django之模板

    Django模板系统 官方文档 常用语法 Django模板中只需要记两种特殊符号: {{  }}和 {% %} {{ }}表示变量,在模板渲染的时候替换成值,{% %}表示逻辑相关的操作. 变量 {{ ...

  9. @RequestMapping 详解

    RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径.RequestMapping注解有六个属性,下面我们把她分 ...

  10. agc002E - Candy Piles(博弈论)

    题意 题目链接 Sol Orz SovitPower #include<bits/stdc++.h> #define Pair pair<int, double> #defin ...