zoukankan      html  css  js  c++  java
  • 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日,晚。

  • 相关阅读:
    document.ready和window.onload的区别
    那些年,我们坚持着。
    JavaScript去除前后空格
    男孩的梦
    shapefile格式说明及读写代码示例 http://www.gispower.org/article/arcgis/arcother/2008/48/0848115049GB922C13K2I22H7G06A4.html
    如何在C#中加载自己编写的动态链接库(DLL)http://www.kehui.net/index.php/article/read/30/26323
    对象复制
    影像复制程序集在不关闭应用程序的前提下更新程序集
    ibatisnet系列(一) 总览 http://hjf1223.cnblogs.com/archive/2006/04/24/383118.html
    创建项模板模板参数
  • 原文地址:https://www.cnblogs.com/developer_chan/p/7537849.html
Copyright © 2011-2022 走看看