You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Delphi Android项目中导入并使用AIDL/Java文件?

Delphi调用Android AIDL生成Java文件的解决方案

一、修正Java文件在Delphi项目中的存放路径

  • 将生成的IPrinterCallback.java和IPrinterService.java移动到Delphi项目的\res\java\com\xcheng\printerservice目录下,严格按照包名com.xcheng.printerservice创建对应层级的文件夹
  • 确保Java文件顶部的package声明与文件夹结构完全匹配

二、生成Delphi可调用的桥接接口

方式1:用Java2OP工具自动生成

  • 打开Delphi菜单 Tools > Android > Java2OP
  • 配置参数:
    • 输入目录:选择项目的res/java文件夹
    • 输出目录:选择项目的src目录
    • 包名:填写com.xcheng.printerservice
  • 点击Generate,自动生成对应的.pas桥接单元

方式2:手动编写桥接代码(应对自动生成异常)

创建Pas文件,示例代码如下(需替换GUID和方法签名):

unit com.xcheng.printerservice;

interface

uses
  Androidapi.JNIBridge, Androidapi.JNI.JavaTypes;

type
  JIPrinterService = interface;
  JIPrinterCallback = interface;

  JIPrinterServiceClass = interface(JObjectClass)
    ['{E5D7F231-XXXX-XXXX-XXXX-XXXXXXXXXXXX}']
  end;

  [JavaSignature('com/xcheng/printerservice/IPrinterService')]
  JIPrinterService = interface(JObject)
    ['{F8A9B452-XXXX-XXXX-XXXX-XXXXXXXXXXXX}']
    function printData(data: JString): Boolean; cdecl; // 与AIDL定义的打印方法一致
  end;

  TJIPrinterService = class(TJavaGenericImport<JIPrinterServiceClass, JIPrinterService>) end;

  JIPrinterCallbackClass = interface(JObjectClass)
    ['{C3B6D789-XXXX-XXXX-XXXX-XXXXXXXXXXXX}']
  end;

  [JavaSignature('com/xcheng/printerservice/IPrinterCallback')]
  JIPrinterCallback = interface(JObject)
    ['{D1E2F3A4-XXXX-XXXX-XXXX-XXXXXXXXXXXX}']
    procedure onPrintResult(success: Boolean); cdecl; // 与AIDL定义的回调方法一致
  end;

  TJIPrinterCallback = class(TJavaGenericImport<JIPrinterCallbackClass, JIPrinterCallback>) end;

implementation

procedure RegisterTypes;
begin
  RegisterType('com.xcheng.printerservice.IPrinterService', TypeInfo(JIPrinterService));
  RegisterType('com.xcheng.printerservice.IPrinterCallback', TypeInfo(JIPrinterCallback));
end;

initialization
  RegisterTypes;

end.
  • GUID用Delphi菜单 Tools > Create GUID 生成,每个接口对应唯一值
  • 方法签名必须与AIDL生成的Java文件完全匹配(参数、返回值、方法名)

三、在Delphi代码中导入并调用

  1. 在主窗体单元的uses中添加桥接单元:
uses
  ..., com.xcheng.printerservice, Androidapi.JNI.Os, Androidapi.JNI.GraphicsContentViewText;
  1. 实现回调类(如果AIDL定义了回调):
type
  TPrinterCallback = class(TJavaLocal, JIPrinterCallback)
  public
    procedure onPrintResult(success: Boolean); cdecl;
  end;

procedure TPrinterCallback.onPrintResult(success: Boolean);
begin
  if success then
    ShowMessage('打印成功')
  else
    ShowMessage('打印失败');
end;
  1. 按钮点击事件中调用打印服务:
procedure TForm1.btnPrintClick(Sender: TObject);
var
  Intent: JIntent;
  ServiceConn: TServiceConnectionImpl;
  Callback: JIPrinterCallback;
begin
  // 1. 创建绑定服务的Intent(替换为你的服务实现类全名)
  Intent := TJIntent.JavaClass.init;
  Intent.setComponent(TJComponentName.JavaClass.init(
    StringToJString('com.xcheng.printerservice'),
    StringToJString('com.xcheng.printerservice.PrinterServiceImpl')
  ));

  // 2. 创建服务连接,获取服务实例
  ServiceConn := TServiceConnectionImpl.Create;
  Callback := TPrinterCallback.Create;

  // 3. 绑定服务,在onServiceConnected中执行打印
  SharedActivity.bindService(Intent, ServiceConn, TJContext.JavaClass.BIND_AUTO_CREATE);
end;

// 服务连接实现类
type
  TServiceConnectionImpl = class(TJavaLocal, JServiceConnection)
  private
    FCallback: JIPrinterCallback;
  public
    constructor Create;
    procedure onServiceConnected(name: JComponentName; service: IBinder); cdecl;
    procedure onServiceDisconnected(name: JComponentName); cdecl;
  end;

constructor TServiceConnectionImpl.Create;
begin
  inherited;
  FCallback := TPrinterCallback.Create;
end;

procedure TServiceConnectionImpl.onServiceConnected(name: JComponentName; service: IBinder);
var
  PrinterService: JIPrinterService;
begin
  // 将IBinder转换为AIDL服务实例
  PrinterService := TJIPrinterService.JavaClass.asInterface(service);
  if Assigned(PrinterService) then
    PrinterService.printData(StringToJString('测试打印内容'));
end;

procedure TServiceConnectionImpl.onServiceDisconnected(name: JComponentName);
begin
  // 服务断开后的清理逻辑
end;

四、常见编译错误排查

  • 找不到单元/类:检查Java文件是否在res/java的正确包路径下,桥接单元是否已添加到项目,uses语句拼写是否正确
  • 方法签名不匹配:核对Delphi桥接接口的方法与Java文件的方法(参数类型、返回值、方法名)完全一致
  • 权限问题:在AndroidManifest.template.xml中添加服务绑定权限(如果服务自定义了权限):
<uses-permission android:name="com.xcheng.printerservice.permission.BIND_PRINTER_SERVICE" />

内容的提问来源于stack exchange,提问作者cla-h

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:45:15