如何从 .pas 文件制作库并在面向 Android 的 C++ Builder 项目中使用它?

How to make a library from .pas files and use it in a C++Builder project targeting Android?

提问人:PCSdeZ 提问时间:10/30/2023 最后编辑:Remy LebeauPCSdeZ 更新时间:10/31/2023 访问量:65

问:

我正在尝试在 Android 项目中使用一个库,该库是使用 C++ Builder 11.2 从一组 Delphi 文件创建的。.a.pas

当我尝试运行项目时,IDE 没有启动调试模式,并且设备显示黑屏,表示应用程序明显失败。如果重试,IDE 将显示以下错误:

无法绑定地址:地址已在使用。退出。

如果我从项目中删除该库,链接器将失败,并显示对库文件的未定义引用。.a

这些文件符合 ZXing.Delphi 库,我想使用它们来制作一个调用了 C++ Builder 的静态库,并将其添加到我面向 Android 的项目中。.paslibZXing.a

我已经使用 C++ Builder 静态库项目制作了库,并为 Android 构建了它。然后,我将其添加到适用于 Android 的 C++ Builder 项目应用程序中。我还向 include 路径添加了 IDE 在构建文件时从这些文件生成的所有文件。libZXing.a.hpp.paslibZXing.a

我的Android应用程序包括一个单元,我在其中使用ZXing.Delphi库的过程,因此我遵循了有关如何从C++ Builder调用Delphi代码的建议。适用于 Android 的应用程序编译成功,但在尝试如前所述运行时失败。.pas

是否有可能以我尝试的方式制作该库?我从 C++ Builder 调用 Delphi 代码的方法是否有问题或缺失?libZXing.a

这是我的 Android 应用程序中包含的单元,我在其中使用库的过程:.paslibZXing.a

unit uZXing;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.Math.Vectors, System.Actions, System.Threading, System.Permissions,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects, FMX.StdCtrls, FMX.Media, FMX.Platform, FMX.MultiView, FMX.ListView.Types,
  FMX.ListView, FMX.Layouts, FMX.ActnList, FMX.TabControl, FMX.ListBox, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, FMX.Controls3D, FMX.Memo.Types,
  ZXing.BarcodeFormat, ZXing.ReadResult, ZXing.ScanManager;

type
  IMyDelphiInterface = interface
    procedure ParseImage(fScanInProgress: Boolean; fScanBitmap: TBitmap; lblScanStatus: TLabel; strList: TStringList);
  end;

  function ZXing_DelphiInstance() : IMyDelphiInterface;

implementation

type
  TDelphiClassImplementingInterface = class(TInterfacedObject, IMyDelphiInterface)
    public
    procedure ParseImage(fScanInProgress: Boolean; fScanBitmap: TBitmap; lblScanStatus: TLabel; strList: TStringList);
  end;

function ZXing_DelphiInstance() : IMyDelphiInterface;
begin
  Result := TDelphiClassImplementingInterface.Create;
end;

procedure TDelphiClassImplementingInterface.ParseImage(fScanInProgress: Boolean;
  fScanBitmap: TBitmap; lblScanStatus: TLabel; strList: TStringList);
begin
  TThread.CreateAnonymousThread(
    procedure
    var
      ReadResult: TReadResult;
      ScanManager: TScanManager;
    begin
      fScanInProgress := True;
      ScanManager := TScanManager.Create(TBarcodeFormat.Auto, nil);
      try
        try
          ReadResult := ScanManager.Scan(fScanBitmap);
        except
          on E: Exception do
          begin
            TThread.Synchronize(TThread.CurrentThread,
              procedure
              begin
                lblScanStatus.Text := E.Message;
              end);
            exit;
          end;
        end;
        TThread.Synchronize(TThread.CurrentThread,
          procedure
          begin
            if (Length(lblScanStatus.Text) > 10) then
            begin
              lblScanStatus.Text := '*';
            end;
            lblScanStatus.Text := lblScanStatus.Text + '*';
            if (ReadResult <> nil) then
            begin
              strList.Add(ReadResult.Text);
            end;
          end);
      finally
        if ReadResult <> nil then
          FreeAndNil(ReadResult);
        ScanManager.Free;
        fScanInProgress := false;
      end;
    end).Start();
end;

end.

以下是从 C++ Builder 调用 Delphi 代码的方法:

_di_IMyDelphiInterface DI_ZXing { ZXing_DelphiInstance() };
TStringList *strList;

TThread::Synchronize(TThread::CurrentThread,
[this, DI_ZXing, strList]() {
    CameraComponent1->SampleBufferToBitmap(imgCamera->Bitmap, True);
    if(fScanInProgress)
        exit;
    fFrameTake++;
    if(fFrameTake % 4 != 0)
        exit;
    if(fScanBitmap)
        fScanBitmap->DisposeOf();
    fScanBitmap = new TBitmap;
    fScanBitmap->Assign(imgCamera->Bitmap);
    DI_ZXing->ParseImage(fScanInProgress, fScanBitmap, Form_TabbedTemplate->LabelCapachos_OBRScan, strList);
});
Android Delphi 静态库 C++Builder

评论

0赞 Remy Lebeau 10/31/2023
我有点迷茫 - 你遇到的实际问题是什么?
0赞 Dave Nottage 10/31/2023
雷米:除了应用程序无法启动并显示黑屏之外?我很好奇为什么需要一个单独的库,以及为什么问题中有所有额外的细节,因为除非在启动时立即进行扫描,否则该代码不会被执行。
0赞 PCSdeZ 10/31/2023
Remy:问题是应用程序在没有“libZXing.a”库的情况下确实可以启动并且运行良好,并且在我添加它时无法启动。我没有这方面的经验,所以我认为假设我可以在 C++ Builder 静态库上创建将所有 .pas 文件分组的库可能是错误的,可能还有另一段代码是允许它在我的 Android 应用程序上运行所必需的。

答: 暂无答案