EJNIFatal异常:找不到方法

时间:2018-01-03 10:28:12

标签: android delphi c++builder

我得到了这段代码编译,但是当在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:\用户\公共\文件\ Embarcadero的\工作室\ 18.0 \ CatalogRepository \ Android_Common_Files_Enterprise-18.0.Build.22858.6822 \ TARGETDIR \源\ RTL \机器人

     

C:\ Program Files(x86)\ Embarcadero \ Studio \ 18.0 \ source \ rtl \ android

所以我不太明白为什么Rad Studio无法单独链接文件。

现在,我已经在项目的部署文件中添加了该文件,在执行该功能时,我收到错误:

  

EJNIFatal例外;调用错误:无法找到方法

似乎我的函数调用了这个api,即使我没有使用它,但它找不到它想要使用的方法呢?

我想知道&#34;方法是否找不到&#34;引用了ELAPSED_REALTIME.doubleValue

我怀疑ELAPSED_REALTIME是否值,但我不知道如何在文档中使用SystemClock的elapsedRealtime()函数。

我目前正在使用这些链接作为参考:

  

https://developer.android.com/reference/android/os/SystemClock.html

     

http://www.deltics.co.nz/blog/posts/1833

1 个答案:

答案 0 :(得分:2)

这是(稍微修改过的版本)Java2OP(随Delphi附带)为SystemClock类导入的内容:

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.