怎么用delphi编写java能够调用的dll?

pengqun pengqun 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我在网上找了一些相关的文章,写了两个测试程序。

delphi编写的dll的核心代码:
//第一种情况:不需要传入参数,也没有返回值
procedure Java_listener_Verify_displayHelloWorld(PEnv: PJNIEnv; Obj: JObject); stdcall;
begin
Writeln(' 您好!中国。 ');
end;

//第二种情况:需传入参数,也有返回值
function Java_listener_Verify_Test(PEnv: PJNIEnv; Obj: JObject;test: JString): JString; stdcall;
var
JVM: TJNIEnv;
tmpStr: string;
begin
try
JVM := TJNIEnv.Create(PEnv);
tmpStr := JVM.UnicodeJStringToString(test);
if tmpStr <> '' then
begin
tmpStr := 'success';
end
else
begin
tmpStr := 'error';
end;
Result := JVM.StringToJString(pchar(UTF8Encode(tmpStr)));
finally
JVM.Free;
end;
end;

java的调用代码:
package listener;

public class Verify{
public native void displayHelloWorld();
public native String Test(String teststr);
static {
System.loadLibrary("Verify");
}
}

java的测试代码:

public static void main(String[] args) {
Verify testVerify =new Verify();
testVerify .displayHelloWorld();
String tmp="测试";
String tmp1="";
tmp1="";testVerify .Test(tmp);
System.out.println("**************"+tmp1+"*****************");
}

测试结果为:
您好!中国。
**************success*****************

上两种情况均已经正确实现。

我现在想实现第三种情况:就是需传入参数test,同时test在函数内部处理后,再传出去,同时整个函数有一个JInt类型的返回值。
function Java_listener_VerifySKM_Test(PEnv: PJNIEnv; Obj: JObject; var test: JString): JInt; stdcall;
var
JVM: TJNIEnv;
tmpStr: string;
begin
try
JVM := TJNIEnv.Create(PEnv);
tmpStr := JVM.UnicodeJStringToString(test);
if tmpStr <> '' then
begin
tmpStr := 'success';
Result := 1;
end
else
begin
tmpStr := 'error';
Result := 0;
end;
test := JVM.StringToJString(pchar(UTF8Encode(tmpStr)));
finally
JVM.Free;
end;
end;

第三种情况的java调用语句:
public static void main(String[] args) {
Verify testVerify =new Verify();
String tmp="测试";
int test=testVerify .Test(tmp);
}

第三种情况报错。我想问一下大家:在delphi里面第三种情况应该怎么写,在java里面又应该怎样来调用?
对于第三种情况,我有一个很笨的方法,就是把所有要传出去的参数用分隔符组成JString作为函数的返回值,然后在java调用后再去一个个分离出来。寻求帮助,大家帮帮忙,看看有没有更好的办法。




...全文
评论 3
收藏 已收藏
分享
返回顶部