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内容如下:
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库的对比的更多相关文章
- java使用JNA框架调用dll动态库
这两天了解了一下java调用dll动态库的方法,总的有三种:JNI.JNA.JNative.其中JNA调用DLL是最方便的. ·JNI ·JNA ·JNative java使用 JNI来调用dll动态 ...
- Java通过jna调用c++动态库
1 环境准备 操作系统:windows 10,x64 jna,jna-4.4.0.jar c++开发环境,vc2013 java开发环境,eclipse,jdk8 2 dll开发 通过vc2013创建 ...
- Java使用JNA方式调用DLL(动态链接库)(原创,装载请注明出处)
Java使用JNA调用DLL 1.准备 1.JDK环境 2.Eclipse 3.JNA包 下载JNA包: (1).JNA的Github:https://github.com/java-native-a ...
- java 用JNA调用dll 参考文档
1 Java调用C语言动态库(JNA方式):回调函数.结构体数组传参.结构体数组返回 2jna结构体数组 JNA结构体数组 3JNA调用C语言动态链接库学习实践总结 4 Java 通过 JNA 调 ...
- java 利用jna调用c#的dll
一.需求阐述: 如果我们的项目利用c#开发,到了开发后期需要和java组进行合作,其中有一部分业务逻辑利用c#已经code completed,那么我们可能会考虑用java来调用现成的c#dll实现需 ...
- 【开发者笔记】java 利用jna调用c#的dll
一.需求阐述: 如果我们的项目利用c#开发,到了开发后期需要和java组进行合作,其中有一部分业务逻辑利用c#已经code completed,那么我们可能会考虑用java来调用现成的c#dll实现需 ...
- java 用JNA方法调用C++动态链接库
JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架.非常强大.易用,功能上类似与.NET的P/Invoke.你只 ...
- Java调用C/C++编写的第三方dll动态链接库(zz)
这里主要用的方法是JNI.在网上查资料时看到很多人说用JNI非常的复杂,不仅要看很多的文档,而且要非常熟悉C/C++编程.恐怕有很多人在看到诸如此类的评论时已经决定绕道用其他方法了.本文将做详细的介绍 ...
- JAVA判断32位还是64位,调用不同的DLL(转)
源:JAVA判断32位还是64位,调用不同的DLL 通过获取sun.arch.data.model可判断是32还是64的JAVA 将32或者64位的DLL放不同的目录,实现自适应调用DLL Prope ...
- Java(JCo3)与SAP系统相互调用
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
随机推荐
- DirBuste 使用
https://sourceforge.net/projects/dirbuster/ 官网下载 记得安装java 运行环境 这是扫描 443 端口的数据 也可以自己写字典规则 在选择模糊查询时 下面 ...
- 【设计模式】不同设计模式体现IOC控制反转
使用过Spring的开发者应该都对IOC控制反转功能有所了解,最开始学习时应该都知道使用依赖注入来实现IOC的功能,本文来介绍使用IOC控制反转思想的几种设计模式. 依赖注入来实现IOC 注入依赖是I ...
- netty-socketio 概述
netty-socketio 概述 netty-socketio是一个开源的Socket.io服务器端的一个java的实现,它基于Netty框架,可用于服务端推送消息给客户端. 说到服务端推送技术,一 ...
- linux查看用户、创建用户、设置密码、修改用户、删除用户命令
查看用户 /etc/passwd /etc/shadow id alex ' |passwd --stdin alex # 设置密码,不需要交互 [root@localhost ~]# tail -l ...
- C# 添加Windows服务,定时任务。
源码下载地址:http://files.cnblogs.com/files/lanyubaicl/20160830Windows%E6%9C%8D%E5%8A%A1.zip 步骤 一 . 创建服务项目 ...
- file 文件上传,下载,删除
html: <div class="col-md-4 col-sm-4"> <div class="portlet light bordered&quo ...
- JVM虚拟机学习一:垃圾回收算法总结
1.java虚拟机中涉及到的数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型. 基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某 ...
- (网页)HTML中INPUT type="date"标签如何赋值注意问题(转)
现在的html5 input标签支持type="date" 显示有日期的日历控件,一行简单的代码就能显示出一个日历控件,但是有的时候需要给它一个默认的日期值,这个时候可能就要用到v ...
- 随笔:Oracle实验课(软件系统开发综合实践)B/S结构;java——图书管理系统
以上是我需要注意的要求 -------------------------------此处为放假分割线-1-20----------------------------------- 初步完成了整个程 ...
- recovery 下界面UI旋转90 180 270修改
原文修改出自简书:https://www.jianshu.com/p/768fdd954061 应该是MTK修改的google源码,支持recovery下屏幕旋转90/180/270, 作者把MTK的 ...