Java调用Delphi开发的Dll小结

来源:互联网 发布:smartgit mac 破解版 编辑:程序博客网 时间:2024/06/02 21:18

 

由于工作原因需要在JAVA开发的项目中调用DELPHI开发的dll动态库,查询了很多资料总结出方法有以下几种:
1、 通过JNI调用,这种方式如果调用C/C++开发的dll动态库文件没有什么问题.但是问题是库是用DELPHI生成的,用JNI不能直接访问,所以只能用C封装DELPHI的库供JNI访问,但是这样很麻烦,而且双层封装不稳定;又或者在使用DELPHI开发dll时引用一个jni.pas的接口单元,按照JNI的方式编写生成dll这样才可以调用。
下面我举例说明一下怎样在使用DELPHI开发可供JAVA的JNI直接调用的dll:
首先用DELPHI新建一个dll工程testDll.dpr;之后我们需要下载 jni.pas 加入到我们的工程中,这是国外的高手写的程序单元,它方便我们的 Delphi 程序与 JAVA 交互。解压之后里面有两个文件,将其存放在工程的目录下;接下来我们编写 Delphi 代码:
Delphi(Pascal) code
library testDll;//这里设置动态链接库的名称,因为我们刚才写 JAVA 类时是用 testDll,所以这里了要设置为 testDll:UsesJNI; //注意了,我们刚才下载了 JNI.pas 放在工程目录中,这里要在 Uses 里面声明,才能使用.//下面我们来写一个函数,就是为 刚才 JAVA 类实现一个简单的方法//因为要让 JAVA 能够调用到这个函数,所以这个函数的命名是非常讲究的,名称各段的分隔符是 _ 下划线//本例的函数如下: 即 Java_包名_类名_类中的方法名//函数必须设置为 stdcallprocedure Java_myPackage_HelloWorld_printText(PEnv: PJNIEnv; Obj: JObject); stdcall; begin //函数体非常简单,因为我们只是了解一下如何调用 Delphi 的函数. Writeln('Hello,This is a Test!');end;exportsJava_alvinJNI_HelloWorld_printText; //为函数做引出声明,这样才能真正的被调用到end.

代码完成,我们 Ctrl+F9 编译 DLL ,生成 testDll.dll 后,我们把他复制到 Java 工程目录;
在JAVA工程中新建一个包名myPackage类名HelloWorld的类:
Java code
package myPackage;class HelloWorld {static {System.loadLibrary("testDll"); //这里 testDll.dll 就是要调用的DELPHI编写的动态链接库文件,先在静态语句块中加载它}public native void printText(); //声明一个 native 的本地代码程序,这个方法我们在 DELPHI里实现。public static void main(String[] args) {//创建对象并调用里面的 native 方法.HelloWorld hw = new HelloWorld();hw.printText();}}

编译执行后,可以看到屏幕打印出: Hello,This is a Test!的字样,说明调用成功! 
2、 通过JNA第三方的JAVA开发组件实现,这种方法调用过程简单实用,而且DELPHI开发dll时不用增加特殊的jni接口,推荐使用:
同样,首先用DELPHI新建一个dll工程testDll.dpr,这里就不需要jni.pas了;
Delphi(Pascal) code
library testdll;uses SysUtils, Classes;{$R *.res}procedure Hello(); stdcall; begin Writeln('Hello');end; exports Hello;end.

在JAVA工程里新建一个类Hello.java,然后引入一个jna.jar的包这个可以在网上下载:
Java code
import com.sun.jna.Library;import com.sun.jna.Native;public class Hello{ public interface CLibrary extends Library { CLibrary INSTANCE = (CLibrary) Native.loadLibrary("testDll" ,CLibrary.class); //引入库文件
    

        public void Hello(); //声明方法

    }

    public static void main(String[] args) {

      CLibrary.INSTANCE.Hello();//调用

    }

}

编译执行后,可以看到屏幕打印出: Hello,This is a Test!的字样,是不是很方便?

详细的JNA的API帮助文档可以在网上下载到。

3、  还有人提出用Jnative可以直接访问DELPHI的dll库,这个我没有去深入了,有兴趣大家可以自己研究研究。

原创粉丝点击