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,并以超链接形式标明文章原始出处,否则将 ...
随机推荐
- .net 公共基础类
using WL.Infrastructure.Http; using System; using System.Collections.Generic; using System.IO; using ...
- Thinkphp table doesn't exist
系统采用Tp3.2的改造....集群为Mysql双工模式:平时M()主要是操作写,MS操作读...今天在查询 $res =MS("user u")->join("{ ...
- springMVC_11拦截器实现登录
一. 思路 controller实现核对用户名和密码,如果核对正确则保存到session中并且跳转到主页 系统中包含诸多界面,部分界面不需要登录即可进行访问,通过拦截器实现判断是否是不需要登录的界 ...
- HashMap深度解析
最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap也一样.当程序试图将多个 key-value 放入 HashMap 中时,以如下代码片 ...
- HTTP与HTTPs的区别?
简而言之: HTTPS = HTTP + SSL HTTP 的 URL 以 http:// 开头,而 HTTPS 的 URL 以 https:// 开头 HTTP 是不安全的,而 HTTPS 是安 ...
- CSS3 - @keyframes
语法 @keyframes animationname { keyframes-selector {css-styles;} } 值 描述 animationname 必需.定义动画的名称. keyf ...
- 2018-01-02 JavaScript实现ZLOGO: 用语法树实现多层循环
原址: https://zhuanlan.zhihu.com/p/32571516 照例先上演示弱效果图. 演示地址照旧: 代码如下: 开始 循环4次 循环4次 前进50 左转90度 到此为止 右转9 ...
- 一位ML工程师构建深度神经网络的实用技巧
一位ML工程师构建深度神经网络的实用技巧 https://mp.weixin.qq.com/s/2gKYtona0Z6szsjaj8c9Vg 作者| Matt H/Daniel R 译者| 婉清 编辑 ...
- 【Wyn Enterprise BI知识库】 认识多维数据建模与分析 ZT
与业务系统类似,商业智能的基础是数据.但是,因为关注的重点不同,业务系统的数据使用方式和商业智能系统有较大差别.本文主要介绍的就是如何理解商业智能所需的多维数据模型和多维数据分析. 数据立方体 多维数 ...
- Tomcat异常:The Tomcat server configuration at\Servers\Tomcat v9.0 Server at localhost-c
今天用Eclipse Java EE版写了几个java工程项目,然后再写java EE项目的jsp页面时,Tomcat出现了这个异常信息: 解决办法: 在菜单栏Window——>Preferen ...