Java如何调用dll

java调用第三方dll文件心得

Java调用动态库方法说明 :比较好

 JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。

       JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。

注意:只能用JNI读取Dll文件JNI是Java Native Interface,也就是Java本地接口.可以通过JNI调用Window的DLL文件.但要遵循一定的规则.比如方法的命名要按照package_class_method名

Jni接口

JAVA基础之理解JNI原理

JNI技术实践小结

目前java与dll交互的技术主要有3种:jni,jawin和jacob。Jni(Java Native Interface)是sun提供的java与系统中的原生方法交互的技术(在windows\linux系统中,实现java与native method互调)。目前只能由c/c++实现。后两个都是sourceforge上的开源项目,同时也都是基于jni技术的windows系统上的一个应用库。Jacob(Java-Com Bridge)提供了java程序调用microsoft的com对象中的方法的能力。而除了com对象外,jawin(Java/Win32 integration project)还可以win32-dll动态链接库中的方法。就功能而言:jni >> jawin>jacob

就易用性而言,正好相反:jacob>jawin>>jni。

 

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


二 Jawin

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

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

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

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

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

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

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

三、Jacob

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

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

台依赖性。

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

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

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

使用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下。

 

 

COM DLL区别

COM和DLL的区别:

1) dll是以函数集合的方式来调用的,是编程语言相关的,如:VC必须加上extern "C"。

而COM是以interface的方式提供给用户使用的是一种二进制的调用规范,是与编程语言无关的。

2) DLL只有DLL一种形势, 里面可任意定义函数无限制, 只能运行在本机上 ,而COM

有DLL和EXE两种存在形势。

3) COM所在的DLL中必须导出四个函数:1. dllgetobjectclass, 2. dllregisterserver, 3. dllunregisterserver, 4. dllunloadnow.

Com补充:

COM解决了版本、模块化开发,所有语言使用,当然只能在WINDOWS平台上。

COM载体:DLL、EXE(不常用),OCX(用于activex控件),activex实际上是COM的一种变体,但本质上没变,当然ACTIVEX控件也能以DLL作载体。

DLL,ACTIVEX,COM,插件区别:

DLL(基于名字导入的,名字就是符号,DLL有符号表的。根据约定好的名字调用函数)

接口是按照规划定义的规则集合

简单说来呢,这好比一棵树,

COM(组件是基于接口的,根据约定好的接口对COM对象进行控制)是树根,

组件(软件的组成部分.)是树干,

控件(具有用户界面的组件)和ActiveX都是树枝,

插件(网页中用到的,flash插件,没有它浏览器不能播放flash.)就是树上引来的一只鸟。

ACTIVEX和COM的区别:

两者没有质的区别,前者主要用于客户端,后者用于服务器端。

前者可以有界面而后者决没有界面

ActiveX的作用:可轻松方便的在 Web页中插入多媒体效果、 交互式对象、以及复杂程序, ActiveX插件安装的一个前提是必须经过用户的同意及确认。

插件:指会随着IE浏览器的启动自动执行的程序