【问题标题】:EJNIFatal Exception : Method not foundEJNIFatal 异常:找不到方法
【发布时间】:2018-01-03 10:28:12
【问题描述】:

我得到了这段小代码编译,但是在 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\18.0\CatalogRepository\Android_Common_Files_Enterprise-18.0.Build.22858.6822\TARGETDIR\source\rtl\android

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

所以我不太明白为什么 Rad Studio 不能自行链接文件。

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

EJNIFatal 异常;调用错误:找不到方法

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

我想知道“找不到方法”是指ELAPSED_REALTIME还是.doubleValue

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

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

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

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

【问题讨论】:

    标签: android delphi c++builder


    【解决方案1】:

    这是 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.
    

    【讨论】:

    猜你喜欢
    • 2017-07-30
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    相关资源
    最近更新 更多