使用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进行封装就可以方便使用。
相关推荐
本篇文章将详细探讨如何使用JAWIN和JCOB这两个库在Java中调用DLL文件。 JAWIN(Java to Windows Interface)是一个开源项目,它的主要目标是提供一种方式,使得Java程序能够直接与Windows API进行交互。JAWIN通过...
本学习笔记将深入探讨三种主要的Java调用DLL的方法:JNI(Java Native Interface)、JACOB(Java COM Bridge)以及JAWIN,并介绍一些实用的DLL查看工具。 1. **JNI(Java Native Interface)**: JNI是Java平台的...
JAVA 调用 C/C++ 库文件(DLL)可以通过多种方式实现,包括 JNI、JNative、Jawin 和 Jacob 等。每种方式都有其特点和优缺,开发者可以根据实际情况选择合适的方式来实现 JAVA 与 C/C++ 之间的交互。
java与dll交互的技术主要有3种:jni,jawin和jacob。Jni(Java Native Interface)是sun提供的java与系统中的原生方法交互的技术(在windows\linux系统中,实现java与native method互调)。目前只能由c/c++实现。后...
1. 编写Java类,在类中使用System.loadLibrary()方法声明调用DLL的名称,并使用native关键词声明将要调用的本地方法,不实现。 2. 编译Java程序文件,生成class文件,并使用Javah工具为Java类生成对应的.h头文件,并...
Java通过Jacob调用OCX是一种跨平台的技术,用于在Java应用程序中与Windows特定的ActiveX控件(OCX)交互。这项技术的核心是Jacob库,它是一个Java到COM桥接器,允许Java代码直接调用COM组件,如OCX控件。以下是对这...
1. **Java与DLL互操作**:在Java中直接调用DLL函数通常需要使用JNI(Java Native Interface),这是一个复杂的接口,需要编写C/C++的本地代码。而Jawin则简化了这一过程,它允许Java代码通过简单的API调用DLL函数。...
JNI(Java Native Interface)框架是Java平台中用于与本地代码交互的一种机制,它允许Java程序调用C/C++等本地库的功能。JNI在各种场景下非常有用,例如当需要利用已有的C/C++库,或者优化性能时。使用JNI,开发者...
JNI提供了Java程序与系统原生方法的桥梁,而JAWIN和JACOB则是针对特定平台或技术的解决方案。JACOB主要针对Microsoft的COM组件,而JAWIN则用于与Win32-DLL动态链接库交互。相比之下,JNI具有更广泛的适用性,不仅...
2. **Jawin**:Jawin提供了一种更接近Java的方式来调用OCX控件,但它更偏向于Windows编程风格,可能对习惯Java开发的程序员来说不太友好。 3. **Jacob**:Jacob是Java和COM组件之间的桥梁,它提供了纯Java的API,...
为了实现Java与DLL之间的交互,主要存在三种技术方案:JNI、jawin和jacob。 - **JNI**:这是Sun提供的官方标准接口,用于Java程序与本地方法之间的相互调用。它支持Windows和Linux等多平台。 - **jawin**:这是一个...
parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...
parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...
parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...
parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...
parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...
parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...
parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...
parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...
parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,...