我在Delphi中创建一个class
来调用Java类中的方法;
我对原语/包装器或字符串类型没有任何问题,但我遇到了Date
的问题。
在java中我有一个setDateStart(java.util.Date dateStart)
方法,如何在Delphi中调用它?
procedure TMyJavaObject.SetDateStart(const DateStart: TDateTime);
var
method : JMethodID;
begin
method := getMethod(self.clazz, 'setDateStart', '(Ljava/util/Date;)V');
JNIEnv.CallVoidMethod(self.javaObject, method, [DateStart]);
end;
答案 0 :(得分:3)
Ljava/uitl/Date
拼写错误。应改为Ljava/util/Date
。
此外,实现为TDateTime
的Delphi Double
与作为对象实例的Java java.util.Date
不兼容。您需要创建一个真实的Date
对象实例,并根据需要为其分配TDateTime
值。
尝试更像这样的东西(我不会在Delphi中使用JNI,所以这可能需要一些调整,但你明白了):
uses
..., DateUtils;
procedure TMyJavaObject.SetDateStart(const DateStart: TDateTime);
var
DateValue: Int64; // a Java 'long' is a 64-bit type
DateClass: JClass;
DateObj: JObject;
method : JMethodID;
begin
// DateTimeToUnix() returns a value in seconds,
// but the java.util.Date(long) constructor expects
// a value in milliseconds instead...
DateValue := DateTimeToUnix(DateStart) * 1000;
// create a java.util.Date object instance, passing the
// converted TDateTime value as a 'long' to its constructor...
DateClass := JNIEnv.FindClass('java/util/Date');
method := JNIEnv.GetMethodID(DateClass, '<init>', '(J)V');
DateObj := JNIEnv.NewObject(DateClass, method, [DateValue]);
// pass the java.util.Date object to the desired object method...
method := getMethod(self.clazz, 'setDateStart', '(Ljava/util/Date;)V');
JNIEnv.CallVoidMethod(self.javaObject, method, [DateObj]);
end;