Java 如何使用JNI在Delphi中设置日期
我正在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
类
,它将调用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
另外,DelphiTDateTime
(作为Double
实现)与JavaJava.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
另外,DelphiTDateTime
(作为Double
实现)与JavaJava.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
另外,DelphiTDateTime
(作为Double
实现)与JavaJava.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
另外,DelphiTDateTime
(作为Double
实现)与JavaJava.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;