`
AILIKES
  • 浏览: 178385 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java调用dll的几种方法(JNI,Jawin,Jacob)

阅读更多

   使用Java调用DLL动态链接库的方案通常有三种:JNI, Jawin, Jacob. 其中JNI(Java Native

Interface)是Java语言本身提供的调用本地已编译的函数库的方法,本身具有跨平台性,可以在不同的

机器上调用不同的本地库。Jawin和Jacob都是sourceforge.net的开源项目,都是基于JNI技术的依赖Wi

ndows的实现,使得在Windows平台下使用COM和DLL的更加方便。

一、JNI(Java本地方法调用)
    JNI的应用方案是基于Java类和本地函数相映射的。其使用DLL的步骤还是相对比较麻烦,不但涉及

到Java编程,还涉及到C/C++编程。

    JNI的使用步骤是:

1. 编写Java类,用该类将DLL对外提供的函数服务进行声明,其中的Java方法均声明为native,其方法

签名可以自定义,不用实现函数体。

2. 用Javah工具将该Java类生成对应的.h头文件。

3.   

最重要的比较麻烦的一步:编写C/C++代码实现.h头文件中声明的函数,该C/C++代码中包含jni.h头文

件,并且编写代码时使用其中定义好的数据类型作为函数的输入和返回数据类型进行编程。用这种方法

实现数据类型转换。在该步骤中,可以在C/C++代码中调用已经存在的DLL库(当别人给我们提供一个现

成的dll控件时,我们只知道接口,不能改变它的实现,就需要“自定义的dll”调用“现成dll”)

4. 另外编写的Java代码时就可以使用该Java类了。

在第3步中,编写C/C++函数时,可以使用一个叫interface pointer的env指针来调用JNI提供的一系列(

很多)函数,用这些函数来访问JVM的对象和数据。

使用JNI的缺点:使用比较麻烦,需要对已有的DLL进行封装,需要对C/C++比较了解。

使用JNI的优点:可以跨平台调用本地库。

 

二、Jawin

官方网站:http://jawinproject.sourceforge.net/


Jawin的应用方案是基于函数调用时采用原始字节流传递数据的。就是在Java中指明一个DLL中的某个函

数后,通过原始字节流(需要考虑参数数据类型所占的存储字节数及系统使用的字节序列)传递给该DLL

函数需要的参数,其返回值也是通过原始字节流解析的方式获得正确的值。

Jawin有一个Jawin.dll和Jawin.jar,根据开发环境不同,需要不同的配置.


使用Jawin的缺点:不方便调试,几乎所有的错误都抛出同样的异常COMException;需要对数据类型的

转换比较了解;不能跨平台,对Windows的依赖性比较强。

使用Jawin的优点:方便使用,不用进行C/C++开发,不用对原始DLL进行封装就可以方便使用。

本人体会:我在用 Jawin 调用单点的dll时,多次出现错误,最终调试失败,后来查看它的官方文档,

发现它对某些com调用不支持。

三、Jacob

官方文档:http://danadler.com/jacob/

Jacob是Java-Com Bridge的缩写,也可以用来调用DLL。其底层也是使用JNI实现,也具有Windows 的平

台依赖性。

该控件调用相当方便,可以调用com和active, 几分钟就可以搞定,它下载后有一个dll和一个jar包,

把dll放到WIN_HOME/system32/下既可,把jar包放到工程的classpath下。

下面是我调用单点dll的事例:

import com.jacob.com.*;


public class CallSSO {
    private static Dispatch dif;
    //加载单点控件SSOCrypto.SSOCrypt.1
    static {
         dif = new Dispatch("SSOCrypto.SSOCrypt.1");
    }
    //产生随机码,调用单点的接口SSORadomGen,传递参数是strPlainString
    public static int SSORadomGen(String strPlainString)
    {
          Variant radom = Dispatch.call(dif, "SSORadomGen", new Variant(strPlainString));
          return radom.getInt();
    }
//取的加密串,调用单点的接口SSOEncrypt,传递参数是strPlainString,lngRandomnum,strSvrCert
    public static String SSOEncrypt(String strPlainString,
                                           int lngRandomnum)
    {
        String strSvrCert ="1BQYR-YLGXV-QM439-CJSCS-TCN6V";
        Variant encrypt = Dispatch.call(dif, "SSOEncrypt", new

Variant(strPlainString),new Variant(lngRandomnum),new Variant(strSvrCert));
        return encrypt.getString();
    }
}
缺点:不能跨平台,对Windows的依赖性比较强。

优点:调用相当方便,不用进行C/C++开发,不用对原始DLL进行封装就可以方便使用。

分享到:
评论

相关推荐

    java 调用DLL 学习笔记

    java 调用DLL 学习笔记,包括 JNI、 JACOB 及JAWIN。 及 dll 查看工具

    JAVA调用C/C++ DLL文件方法

    JNI,JNATIVE,JAWIN 使用Java调用DLL动态链接库的方案我知道的有四种:JNI,Jnative,Jawin,Jacob

    JAVA调用C++的dell应用例子

    java与dll交互的技术主要有3种:jni,jawin和jacob。Jni(Java Native Interface)是sun提供的java与系统中的原生方法交互的技术(在windows\linux系统中,实现java与native method互调)。目前只能由c/c++实现。后...

    android_JNI介绍

    目前Java与Dll交互的技术主要有三种:JNI、JAWIN和JACOB,JNI(Java Native Interface)是SUN提供的Java与系统中的原生方法的技术。JACOB(Java-Com Bridge)提供Java程序调用Microsoft的com队形的方法能力,而除了com...

    JAVA上百实例源码以及开源项目

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    JAVA上百实例源码以及开源项目源代码

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    java开源包1

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包4

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包101

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包11

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包6

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包9

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包8

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包10

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包5

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包3

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包2

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    java开源包7

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

    Java资源包01

    parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...

Global site tag (gtag.js) - Google Analytics