我正试图从我的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应用程序得到此错误结果?
答案 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参数可以修复它。