一、Cdll.java
···
package Liberary;
public class Cdll {
static {
System.loadLibrary(“JavaCall”);
}
public native void printText(String s);
public native String fstring(String s);
}
···
二、MainClass.java
···
package Liberary;
public class MainClass {
public static void main(String[] args) {
Cdll jc = new Cdll();
String j;
j = jc.fstring("无为");
System.out.println(j);
jc.printText("测试");
}
}
···
三、javaCall.dpr
···
library JavaCall;
uses
SysUtils,
Classes,
JNI;
{$R *.res}
procedure Java_Liberary_Cdll_printText(S: string); stdcall;
begin
//函数体非常简单,因为我们只是了解一下如何调用 Delphi 的函数.
Writeln(S ‘您好!看到效果了吧。’);
end;
function Java_Liberary_Cdll_fstring(PEnv: PJNIEnv; Obj: JObject; arg: JString): JString; stdcall;
var
tmpStr: String;
JVM: TJNIEnv;
tt: Boolean;
begin
JVM:= TJNIEnv.Create(PEnv);
//我们这里先把参数提交过来的 JString 转换成 Delphi 中的 String 后就可以使用了
tmpStr := ‘你想输出的字符串是: "’ JVM.UnicodeJStringToString(arg) ‘"。’;
//当字符串要转换成 JString 我们需要先对字符串进行 UTF8 编码后再转换成 PChar 再转换成 JString
//这样才能保证返回的字符串在 JAVA 中不乱码
Result := JVM.StringToJString(pchar(UTF8Encode(tmpStr)));
JVM.Free;
end;
exports
Java_Liberary_Cdll_printText, //为函数做引出声明,这样才能真正的被调用
Java_Liberary_Cdll_fstring;
begin
end.
···
四、JNI.pas
http://www.blogjava.net/Files/alvin/jni_pas.zip
以上内容为转载,我试了一下,是可以实现的。在写的时候,为了少走弯路,请阅读以下说明:
1.delphi中新建dll文件后,在uses后加入JNI;将下载后的JNI.PAS和JNI_MD.INC(http://www.blogjava.net/Files/alvin/jni_pas.zip)要先放至新建dll同一目录下。
2.注意stdcall;和exports的使用;exports后放函数名,不带参数,多个用逗号隔开。
3.delphi接收java中的字符串变量要经过转换后才能在delphi中使用,其它常用类型好像可以直接使用。
4.delphi中函数(或过程)命名规则:
(Java_) (package包名) _(class文件名) (调用函数名)

本文介绍了一种通过JNI实现Java程序调用Delphi DLL的方法。具体包括Java侧的Cdll和MainClass类定义,以及Delphi侧的JavaCall DLL实现。演示了字符串传递和处理的过程。
1614

被折叠的 条评论
为什么被折叠?



