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

时间:2014-05-06 17:58:44

标签: java delphi java-native-interface

我在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;

1 个答案:

答案 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;