EJNIFatal 异常:未找到方法
EJNIFatal Exception : Method not found
我编译了这段小代码,但是在 C++ 代码中执行 TimeSinceBoot 函数时,异常提示我找不到 Androidapi.JNIMarshal.pas 文件。
代码:
unit SystemClock;
interface
uses
Androidapi.JNI.JavaTypes,
Androidapi.JNIBridge;
type
JSystemClockClass = interface(JObjectClass)
['{7C25E65F-A934-472E-A89E-C7F1DC10A292}']
function _GetELAPSED_REALTIME: JLong;
property ELAPSED_REALTIME: JLong read _GetELAPSED_REALTIME;
end;
[JavaSignature('android/os/SystemClock')]
JSystemClock = interface(JObject)
['{DC447EEB-147B-4A9B-B59F-2C84F959B2FD}']
end;
TJSystemClock = class(TJavaGenericImport<JSystemClockClass, JSystemClock>) end;
function TimeSinceBoot(): Double;
implementation
function TimeSinceBoot(): Double;
begin
result:= TJSystemClock.JavaClass.ELAPSED_REALTIME.doubleValue / 60000.0;
end;
end.
我在这些目录中找到了这个文件:
C:\Users\Public\Documents\Embarcadero\Studio.0\CatalogRepository\Android_Common_Files_Enterprise-18.0.Build.22858.6822\TARGETDIR\source\rtl\android
C:\Program Files (x86)\Embarcadero\Studio.0\source\rtl\android
所以我不太明白为什么 Rad Studio 不能 link 文件本身。
现在,我已经在项目的部署文件中添加了该文件,当执行该函数时,出现错误:
EJNIFatal Exception; Invocation Error : Method can't be found
我的函数似乎调用了这个 api 即使我没有使用它,但它找不到它想要使用的方法?
我想知道“找不到方法”是指ELAPSED_REALTIME
还是.doubleValue
。
我怀疑 ELAPSED_REALTIME
是一个值,但我不知道如何在文档中使用 SystemClock 的 elapsedRealtime()
函数。
我目前正在使用这些 link 作为参考:
https://developer.android.com/reference/android/os/SystemClock.html
这是 Java2OP(Delphi 随附)为 SystemClock 导入的(略微修改的版本)class:
unit Androidapi.JNI.SystemClock;
interface
uses
Androidapi.JNIBridge, Androidapi.JNI.JavaTypes;
type
JSystemClock = interface;
JSystemClockClass = interface(JObjectClass)
['{771C5E34-6252-4BA7-8292-DD6BC82AA9B8}']
{class} function currentThreadTimeMillis: Int64; cdecl;
{class} function elapsedRealtime: Int64; cdecl;
{class} function elapsedRealtimeNanos: Int64; cdecl;
{class} function setCurrentTimeMillis(millis: Int64): Boolean; cdecl;
{class} procedure sleep(ms: Int64); cdecl;
{class} function uptimeMillis: Int64; cdecl;
end;
[JavaSignature('android/os/SystemClock')]
JSystemClock = interface(JObject)
['{6F88CF0F-2D6B-43D4-A23D-A04C1C56D88E}']
end;
TJSystemClock = class(TJavaGenericImport<JSystemClockClass, JSystemClock>) end;
implementation
end.
我编译了这段小代码,但是在 C++ 代码中执行 TimeSinceBoot 函数时,异常提示我找不到 Androidapi.JNIMarshal.pas 文件。
代码:
unit SystemClock;
interface
uses
Androidapi.JNI.JavaTypes,
Androidapi.JNIBridge;
type
JSystemClockClass = interface(JObjectClass)
['{7C25E65F-A934-472E-A89E-C7F1DC10A292}']
function _GetELAPSED_REALTIME: JLong;
property ELAPSED_REALTIME: JLong read _GetELAPSED_REALTIME;
end;
[JavaSignature('android/os/SystemClock')]
JSystemClock = interface(JObject)
['{DC447EEB-147B-4A9B-B59F-2C84F959B2FD}']
end;
TJSystemClock = class(TJavaGenericImport<JSystemClockClass, JSystemClock>) end;
function TimeSinceBoot(): Double;
implementation
function TimeSinceBoot(): Double;
begin
result:= TJSystemClock.JavaClass.ELAPSED_REALTIME.doubleValue / 60000.0;
end;
end.
我在这些目录中找到了这个文件:
C:\Users\Public\Documents\Embarcadero\Studio.0\CatalogRepository\Android_Common_Files_Enterprise-18.0.Build.22858.6822\TARGETDIR\source\rtl\android
C:\Program Files (x86)\Embarcadero\Studio.0\source\rtl\android
所以我不太明白为什么 Rad Studio 不能 link 文件本身。
现在,我已经在项目的部署文件中添加了该文件,当执行该函数时,出现错误:
EJNIFatal Exception; Invocation Error : Method can't be found
我的函数似乎调用了这个 api 即使我没有使用它,但它找不到它想要使用的方法?
我想知道“找不到方法”是指ELAPSED_REALTIME
还是.doubleValue
。
我怀疑 ELAPSED_REALTIME
是一个值,但我不知道如何在文档中使用 SystemClock 的 elapsedRealtime()
函数。
我目前正在使用这些 link 作为参考:
https://developer.android.com/reference/android/os/SystemClock.html
这是 Java2OP(Delphi 随附)为 SystemClock 导入的(略微修改的版本)class:
unit Androidapi.JNI.SystemClock;
interface
uses
Androidapi.JNIBridge, Androidapi.JNI.JavaTypes;
type
JSystemClock = interface;
JSystemClockClass = interface(JObjectClass)
['{771C5E34-6252-4BA7-8292-DD6BC82AA9B8}']
{class} function currentThreadTimeMillis: Int64; cdecl;
{class} function elapsedRealtime: Int64; cdecl;
{class} function elapsedRealtimeNanos: Int64; cdecl;
{class} function setCurrentTimeMillis(millis: Int64): Boolean; cdecl;
{class} procedure sleep(ms: Int64); cdecl;
{class} function uptimeMillis: Int64; cdecl;
end;
[JavaSignature('android/os/SystemClock')]
JSystemClock = interface(JObject)
['{6F88CF0F-2D6B-43D4-A23D-A04C1C56D88E}']
end;
TJSystemClock = class(TJavaGenericImport<JSystemClockClass, JSystemClock>) end;
implementation
end.