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 代码:
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库,这个我没有去深入了,有兴趣大家可以自己研究研究。
- Java调用Delphi开发的Dll小结
- java 调用 delphi编写的dll
- Java中调用Delphi编写的DLL
- JAVA UnsatisfiedLinkError(调用Delphi的DLL)
- java 调用 delphi编写的dll
- JNI:Java调用Delphi编写的dll
- Java中调用Delphi编写的DLL
- c#调用delphi开发的dll的指针参数
- WebService开发实例2-Delphi调用WS的DLL
- Delphi XE 调用 C++ Builder XE 开发的DLL库
- Delphi 调用VC的DLL
- delphi调用c的dll
- .net 调用delphi 的DLL
- java调用delphi写的DLL动态链接库
- [PB+Delphi]主应用程序用的是PB,操作界面调用Delphi开发的DLL
- Delphi中C++的DLL的调用
- Delphi中高级DLL的编写和调用
- Delphi中高级DLL的编写和调用
- 2011年软考系统架构设计师学习笔记第二章
- 链表相关面试题
- 在linux下编写动态链接库
- windows SVN server
- Apache POI API操作Microsoft Office格式文件的方法+JAVA调用exe可执行文件
- Java调用Delphi开发的Dll小结
- Linux下的两种磁盘分区工具的使用
- 拯救大兵Touchpad
- ios convert nsdictionary to xml string 将字典转化为xml字符串
- 超强组合、简易安装
- iphone ios 开发者申请流程
- Emacs和Vim:神的编辑器和编辑器之神
- java基本类型与包装类型
- LR VuGen协议介绍