由于工作原因需要在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: Uses JNI; // 注意了,我们刚才下载了 JNI.pas 放在工程目录中,这里要在 Uses 里面声明,才能使用. // 下面我们来写一个函数,就是为 刚才 JAVA 类实现一个简单的方法 // 因为要让 JAVA 能够调用到这个函数,所以这个函数的命名是非常讲究的,名称各段的分隔符是 _ 下划线 // 本例的函数如下: 即 Java_包名_类名_类中的方法名 // 函数必须设置为 stdcall