提问人:PCSdeZ 提问时间:10/30/2023 最后编辑:Remy LebeauPCSdeZ 更新时间:10/31/2023 访问量:65
如何从 .pas 文件制作库并在面向 Android 的 C++ Builder 项目中使用它?
How to make a library from .pas files and use it in a C++Builder project targeting Android?
问:
我正在尝试在 Android 项目中使用一个库,该库是使用 C++ Builder 11.2 从一组 Delphi 文件创建的。.a
.pas
当我尝试运行项目时,IDE 没有启动调试模式,并且设备显示黑屏,表示应用程序明显失败。如果重试,IDE 将显示以下错误:
无法绑定地址:地址已在使用。退出。
如果我从项目中删除该库,链接器将失败,并显示对库文件的未定义引用。.a
这些文件符合 ZXing.Delphi 库,我想使用它们来制作一个调用了 C++ Builder 的静态库,并将其添加到我面向 Android 的项目中。.pas
libZXing.a
我已经使用 C++ Builder 静态库项目制作了库,并为 Android 构建了它。然后,我将其添加到适用于 Android 的 C++ Builder 项目应用程序中。我还向 include 路径添加了 IDE 在构建文件时从这些文件生成的所有文件。libZXing.a
.hpp
.pas
libZXing.a
我的Android应用程序包括一个单元,我在其中使用ZXing.Delphi库的过程,因此我遵循了有关如何从C++ Builder调用Delphi代码的建议。适用于 Android 的应用程序编译成功,但在尝试如前所述运行时失败。.pas
是否有可能以我尝试的方式制作该库?我从 C++ Builder 调用 Delphi 代码的方法是否有问题或缺失?libZXing.a
这是我的 Android 应用程序中包含的单元,我在其中使用库的过程:.pas
libZXing.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);
});
答: 暂无答案
评论