怎么用delphi编写java能够调用的dll?
我在网上找了一些相关的文章,写了两个测试程序。
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调用后再去一个个分离出来。寻求帮助,大家帮帮忙,看看有没有更好的办法。
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调用后再去一个个分离出来。寻求帮助,大家帮帮忙,看看有没有更好的办法。
...全文


语言基础/算法/系统设计
