Java 如何使用JNI在Delphi中设置日期

Java 如何使用JNI在Delphi中设置日期,java,delphi,java-native-interface,Java,Delphi,Java Native Interface,我正在Delphi中创建一个类,它将调用Java类中的方法 我在原语/包装器或字符串类型方面没有问题,但在Date方面有问题 在java中,我有一个setDateStart(java.util.dateStart)方法,如何在Delphi中调用它 procedure TMyJavaObject.SetDateStart(const DateStart: TDateTime); var method : JMethodID; begin method := getMethod(se

我正在Delphi中创建一个
,它将调用Java类中的方法

我在原语/包装器或字符串类型方面没有问题,但在
Date
方面有问题

在java中,我有一个
setDateStart(java.util.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;

Ljava/uitl/Date
拼写错误。应改为
Ljava/util/Date

另外,Delphi
TDateTime
(作为
Double
实现)与Java
Java.util.Date
不兼容,后者是一个对象实例。您需要创建一个真实的
Date
对象实例,并根据需要为其分配
TDateTime

请尝试类似的方法(我在Delphi中不使用JNI,因此这可能需要一些调整,但您知道了):

使用
…,DateUtils;
过程TMyJavaObject.SetDateStart(constDateStart:TDateTime);
变量
日期值:Int64;//Java“long”是64位类型
日期类:JClass;
DateObj:JObject;
方法:jmethode;
开始
//DateTimeToUnix()返回以秒为单位的值,
//但是java.util.Date(long)构造函数期望
//而是以毫秒为单位的值。。。
DateValue:=DateTimeToUnix(DateStart)*1000;
//创建java.util.Date对象实例,传递
//已将TDateTime值转换为“long”到其构造函数。。。
DateClass:=JNIEnv.FindClass('java/util/Date');
方法:=JNIEnv.GetMethodID(DateClass,,'(J)V');
DateObj:=JNIEnv.NewObject(DateClass,方法,[DateValue]);
//将java.util.Date对象传递给所需的对象方法。。。
方法:=getMethod(self.clazz,'setDateStart','(Ljava/util/Date;)V');
CallVoidMethod(self.javaObject,method,[DateObj]);
结束;

Ljava/uitl/Date
拼写错误。应改为
Ljava/util/Date

另外,Delphi
TDateTime
(作为
Double
实现)与Java
Java.util.Date
不兼容,后者是一个对象实例。您需要创建一个真实的
Date
对象实例,并根据需要为其分配
TDateTime

请尝试类似的方法(我在Delphi中不使用JNI,因此这可能需要一些调整,但您知道了):

使用
…,DateUtils;
过程TMyJavaObject.SetDateStart(constDateStart:TDateTime);
变量
日期值:Int64;//Java“long”是64位类型
日期类:JClass;
DateObj:JObject;
方法:jmethode;
开始
//DateTimeToUnix()返回以秒为单位的值,
//但是java.util.Date(long)构造函数期望
//而是以毫秒为单位的值。。。
DateValue:=DateTimeToUnix(DateStart)*1000;
//创建java.util.Date对象实例,传递
//已将TDateTime值转换为“long”到其构造函数。。。
DateClass:=JNIEnv.FindClass('java/util/Date');
方法:=JNIEnv.GetMethodID(DateClass,,'(J)V');
DateObj:=JNIEnv.NewObject(DateClass,方法,[DateValue]);
//将java.util.Date对象传递给所需的对象方法。。。
方法:=getMethod(self.clazz,'setDateStart','(Ljava/util/Date;)V');
CallVoidMethod(self.javaObject,method,[DateObj]);
结束;

Ljava/uitl/Date
拼写错误。应改为
Ljava/util/Date

另外,Delphi
TDateTime
(作为
Double
实现)与Java
Java.util.Date
不兼容,后者是一个对象实例。您需要创建一个真实的
Date
对象实例,并根据需要为其分配
TDateTime

请尝试类似的方法(我在Delphi中不使用JNI,因此这可能需要一些调整,但您知道了):

使用
…,DateUtils;
过程TMyJavaObject.SetDateStart(constDateStart:TDateTime);
变量
日期值:Int64;//Java“long”是64位类型
日期类:JClass;
DateObj:JObject;
方法:jmethode;
开始
//DateTimeToUnix()返回以秒为单位的值,
//但是java.util.Date(long)构造函数期望
//而是以毫秒为单位的值。。。
DateValue:=DateTimeToUnix(DateStart)*1000;
//创建java.util.Date对象实例,传递
//已将TDateTime值转换为“long”到其构造函数。。。
DateClass:=JNIEnv.FindClass('java/util/Date');
方法:=JNIEnv.GetMethodID(DateClass,,'(J)V');
DateObj:=JNIEnv.NewObject(DateClass,方法,[DateValue]);
//将java.util.Date对象传递给所需的对象方法。。。
方法:=getMethod(self.clazz,'setDateStart','(Ljava/util/Date;)V');
CallVoidMethod(self.javaObject,method,[DateObj]);
结束;

Ljava/uitl/Date
拼写错误。应改为
Ljava/util/Date

另外,Delphi
TDateTime
(作为
Double
实现)与Java
Java.util.Date
不兼容,后者是一个对象实例。您需要创建一个真实的
Date
对象实例,并根据需要为其分配
TDateTime

请尝试类似的方法(我在Delphi中不使用JNI,因此这可能需要一些调整,但您知道了):

使用
…,DateUtils;
过程TMyJavaObject.SetDateStart(constDateStart:TDateTime);
变量
日期值:Int64;//Java“long”是64位类型
日期类:JClass;
DateObj:JObject;
方法:jmethode;
开始
//DateTimeToUnix()返回以秒为单位的值,
//但是java.util.Date(long)构造函数期望
//而是以毫秒为单位的值。。。
DateValue:=DateTimeToUnix(DateStart)*1000;
//创建java.util.Date对象实例,传递
//已将TDateTime值转换为“long”到其构造函数。。。
DateClass:=JNIEnv.FindClass('java/util/Date');
方法:=JNIEnv.GetMethodID(DateClass,,'(J)V');
DateObj:=JNIEnv.NewObject(DateClass,方法,[DateValue]);
//传递java.util.Date对象
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;