错误的结果从Delphi调用Android方法

时间:2018-11-16 17:02:21

标签: android delphi

我正试图从我的Delphi 10.2.3应用中调用Android的类GeomagneticField方法getDeclination()

首先,我使用Java2OP导入了GeomagneticField类:

unit Androidapi.JNI.Interfaces.JGeomagneticField;
interface
uses
  Androidapi.JNIBridge,
  Androidapi.JNI.JavaTypes;
type
// ===== Forward declarations =====
  JGeomagneticField = interface;//android.hardware.GeomagneticField
// ===== Interface declarations =====
  JGeomagneticFieldClass = interface(JObjectClass)
    ['{77F2155B-1F9A-40E0-89FA-FE3422336577}']
    {class} function init(gdLatitudeDeg: Single; gdLongitudeDeg: Single; altitudeMeters: Single; timeMillis: Int64): JGeomagneticField; cdecl;
    {class} function getHorizontalStrength: Single; cdecl;//Deprecated
    {class} function getInclination: Single; cdecl;//Deprecated
    {class} function getX: Single; cdecl;//Deprecated
  end;

  [JavaSignature('android/hardware/GeomagneticField')]
  JGeomagneticField = interface(JObject)
    ['{47CF41EC-AAAB-4EE2-867A-884A3EF00407}']
    function getDeclination: Single; cdecl;//Deprecated
    function getFieldStrength: Single; cdecl;//Deprecated
    function getY: Single; cdecl;
    function getZ: Single; cdecl;
  end;
  TJGeomagneticField = class(TJavaGenericImport<JGeomagneticFieldClass, JGeomagneticField>) end;

implementation

initialization
end.

然后我以这种方式调用该方法:

procedure TForm.Button1Click(Sender: TObject);
var GeoField: JGeomagneticField; tm:int64; t0,t:TDatetime; 
begin
  t0 := EncodeDatetime(1970,1,1,0,0,0,0);
  t  := now;
  tm := Trunc( (t-t0)*24*3600*1000);   // <-- ms since 1/1/1970

  GeoField := TJGeomagneticField.JavaClass.init(-23,-46,750,tm );
  Label1.Text := FloatToStr( GeoField.getDeclination );
end;

运行此命令并单击时,Label1显示-174.3635711,这是错误的

在Android Studio上,我用Java构建了一个类似的应用程序:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button btn = (Button) findViewById(R.id.btnShowDecl);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            GeomagneticField geoField = new GeomagneticField(
                    (float) -23,
                    (float) -46,
                    (float) 750,
                    System.currentTimeMillis()
            );
            float f = geoField.getDeclination();
            String s = Float.toString(f);

            Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG)
                    .show();
        }
    });
}

运行此命令并单击按钮时,我得到-21.839144,这是正确的。

为什么我的Delphi应用程序得到此错误结果?

1 个答案:

答案 0 :(得分:2)

我将问题缩小为“ timeMillis”参数。 它是Java语言,与Delphi的int64相对应。 我怀疑存在某种字节序问题,所以我 尝试将long参数设置为高和低。

有效

 dates=c(dateNew, dateOld)
dates2 <- strptime(dates, format = "%Y-%m-%d")
dif <- diff(as.numeric(dates2)) # difference in seconds
months = dif/(60 * 60 * 24 * 30) # months 

Java2OP的翻译似乎还可以,所以我想知道问题出在哪里。 无论如何,通过传递这个被入侵的int64参数可以修复它。