【问题标题】:Using Delphi's AndroidHelper or JNI to access static Java method in Delphi在Delphi中使用Delphi的AndroidHelper或JNI访问静态Java方法
【发布时间】:2017-07-31 12:24:56
【问题描述】:

理解问题的重要文件:

VpnService Java Class

VpnService Translated to Delphi

我的目标是从VpnService.java 调用public static Intent prepare(Context context) 方法并接收Intent

我尝试了几种访问方式,例如:

var
   Intent: JIntent;
   JVC: JVpnService;
begin
   JVC := TJVpnService.JavaClass.init;
   Intent := JVC.prepare(Context); // No Method prepare

var
   Intent: JIntent;
   JVC: JVpnServiceClass;
begin
   JVC := JVpnServiceClass.javaClass.init; // Record, Objekt oder Klassentyp erforderlich

var
Intent: JIntent;
   JVC: JVpnServiceClass;
begin
   JVC := JVC.javaClass.init; //Inkompatible Typen JVpnServiceClass und JVpnService

我真的不知道如何访问这个静态方法。

【问题讨论】:

  • 试试TJVpnService.JavaClass.prepare(Context)
  • 我也试过这个,但是你得到一个“EJNIFatal Method not found”错误。

标签: java android delphi java-native-interface delphi-10.2-tokyo


【解决方案1】:

JavaClass.init() 是用于创建对象实例的构造函数调用。静态方法直接从JavaClass 访问。所以,你应该打电话给TJVpnService.JavaClass.prepare()。如果这不起作用,那么TJVpnService 可能一开始就没有正确设置。

查看生成的.pas 文件,我认为它的[JavaSignature] 属性声明了错误的类型。这可以解释为什么 JNI 在运行时找不到 prepare() 方法。

生成的.pas 文件根本不包含VpnService.Builder 内部类的任何声明,但TJVpnService[JavaSignaure] 属性正在尝试从Builder 类导入方法。 prepare()VpnService 类本身的方法,而不是 Builder 类,因此请尝试将 [JavaSignature] 属性更改为 [JavaSignature('android/net/VpnService')] 而不是 [JavaSignature('android/net/VpnService$Builder')]

然后file a bug report with Software Union,因为它的Java2Pas工具错误地导入了VpnService.java文件。

【讨论】:

  • Delphi 单元是由 Java2Pas 导入的,它不是 Embarcadero 产品。话虽如此,Java2OP 也没有正确导入它,但是它没有正确导入很多其他类,经常将实例方法误认为是静态方法。
  • @DaveNottage:是的,Java2OP 有很多错误,QualityPortal 中有许多关于它生成错误代码的公开票。
  • 哇!非常感谢你!它有助于更​​改签名。知道它很容易:D
  • 这个工作有任何编码示例吗?我想为 Delphi 构建一个 GitHub VPN 工作服务,但互联网上没有多少有帮助的文档。
  • 加上互联网上的许多 Delphi Android Java 信息​​要么是旧的,要么是新的,很难判断哪些是正确的信息。互联网上是否有一个位置可以保持所有信息都是最新的?
【解决方案2】:

即使正确导入了 Java 代码,您也无法从 Delphi 代码中使用 VpnService。根据文档:

https://developer.android.com/reference/android/net/VpnService.html

您需要创建 VpnService 的后代才能在您的应用程序中实现它。目前无法在 Delphi 代码中创建后代;您需要在 Java 代码中执行此操作,并将其作为应用程序的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    相关资源
    最近更新 更多