JNI调用Delphi's DLL
我们知道,java通过jni可以调用c/c++编写的dll(windows)、so(linux);很少有调用其它语言编写的动态连接库的,下面就通过JNI来调用Delphi编写的DLL
在编写代码前,你需要到http://www.pacifier.com/~mmead/jni/delphi/index.html下载2个文件,一个是JNI.pas、一个是JNI_MD.INC;
然后你可以先编写一段调用dll的java代码,这里编写代码调用dll中的一个max函数,则java代码如下:
public class MyJNI {
private native int max(int x,int y);
public static void main(String[] args) {
MyJNI mj =new MyJNI();
System.out.println(mj.max(100,1)) ;
}
static{
System.loadLibrary("DLL_D01"
;
}
}
然后在使用delphi编写一个DLL,步骤为File->New->New->DLL;保存文件为DLL_D01.dpr;
然后把使用use 把JNI包含进来,函数的写法和一般的DLL一样,但是函数名是有讲究的,所以函数名的格式是Java_包名_类名_函数名(参数);比如你在java中想使用com.xieguoking.Hellow中的max函数,则在delphi中函数必须如下定义:
function Java_com_xieguoking_Hellow_max(PEnv: PJNIEnv; Obj: JObject;x,y:jint):jint;
{$IFDEF WIN32} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
其中jint是等同于delphi中的integer,也和java中的int相同,具体类型转换可以参考jni.pa和jni_md.inc文件;
{$IFDEF WIN32} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF} 表示如果定义了WIN32的话就按照stdcall调用dll,如果是定义了LINUX就用cdecl调用so文件;
编写好后,你就可以使用delphi idebuild 成dll文件了,如果你是使用的delphi 5.0 以下版本的话,你还必须在delphi定义一个变量,操作步骤为Project | Options | Directories/Conditionals 然后在Conditional defines中添加MSWINDOWS,要不然出现编译问题
Delphi DLL 代码:
library DLL_D01;
uses
JNI,
SysUtils,
Classes;
{$R *.RES}
function Java_com_xieguoking_MyJNI_max(PEnv: PJNIEnv; Obj: JObject;x,y:jint):jint;
{$IFDEF WIN32} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
begin
if x>y then
Java_com_xieguoking_MyJNI_max :=x
else
Java_com_xieguoking_MyJNI_max :=y;
end;
exports Java_com_xieguoking_MyJNI_max;
begin
end.
然后正常javac、java 就能调用delphi中的函数了