0

了解问题的重要文件:

VpnService Java 类

翻译成 Delphi 的 VpnService

我的目标是public static Intent prepare(Context context)从.VpnService.javaIntent

我尝试了几种方法来访问它,例如:

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

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

4

2 回答 2

2

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

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

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

然后向 Software Union 提交错误报告,因为它的 Java2Pas 工具VpnService.java错误地导入了文件。

于 2017-07-31T18:39:36.450 回答
1

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

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

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

于 2017-07-31T21:00:25.260 回答