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

Delphi-Android应用加载SSL库失败求助(附测试代码)

Delphi 11.3 Android 12下Indy OpenSSL加载失败修复方案

问题分析

当前代码存在几个关键问题:

  • OpenSSL库加载时机错误,应在创建Indy组件前设置路径并验证加载状态
  • 未正确释放所有动态创建的组件,存在内存泄漏
  • 库路径设置与实际部署位置可能不匹配

修复步骤

1. 确认OpenSSL库版本与部署

  • 必须使用OpenSSL 1.1.1系列的库文件(libcrypto.so、libssl.so),Delphi 11.3的Indy不兼容OpenSSL 3.x
  • 针对Android架构(arm64-v8a/armeabi-v7a),将对应架构的so文件部署到library\lib\[架构]\路径下,确保部署配置中远程路径与本地路径对应(需确认架构目录名称正确,比如arm64-v8a而非arm64)

2. 修改后的代码

unit uTestSSL;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.IOUtils,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls;

type
  TForm13 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form13: TForm13;

implementation

{$R *.fmx}

uses
  IdSSLOpenSSLHeaders,
  IdSSLOpenSSL,
  IdHTTP;

procedure TForm13.Button1Click(Sender: TObject);
var
  IdHTTP: TIdHTTP;
  IdSSLIOHandler: TIdSSLIOHandlerSocketOpenSSL;
  RequestStream, ResponseStream: TStringStream;
  LibPath: string;
  LoadResult: Boolean;
begin
  // 1. 设置OpenSSL库路径并验证加载
  LibPath := TPath.GetLibraryPath;
  IdOpenSSLSetLibPath(LibPath);
  
  LoadResult := LoadOpenSSL;
  if not LoadResult then
  begin
    ShowMessage('OpenSSL加载失败: ' + WhichFailedToLoad);
    Exit;
  end;

  ShowMessage('OpenSSL版本: ' + OpenSSLVersion);

  // 2. 创建并初始化Indy组件
  IdHTTP := TIdHTTP.Create(nil);
  try
    IdSSLIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP); // 让IdHTTP拥有所有权,自动释放
    IdSSLIOHandler.SSLOptions.SSLVersions := [sslvTLSv1_2];
    IdHTTP.IOHandler := IdSSLIOHandler;

    IdHTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
    IdHTTP.Request.Pragma := 'no-cache';
    IdHTTP.Request.ContentType := 'text/xml'; // 明确设置Content-Type,适配XML请求

    // 3. 准备请求和响应流
    RequestStream := TStringStream.Create('some XML text', TEncoding.UTF8);
    try
      ResponseStream := TStringStream.Create('', TEncoding.UTF8);
      try
        IdHTTP.Post('https://www1.gsis.gr/wsaade/RgWsPublic2/RgWsPublic2?WSDL', RequestStream, ResponseStream);
        ShowMessage('请求成功,响应内容: ' + ResponseStream.DataString);
      finally
        ResponseStream.Free;
      end;
    finally
      RequestStream.Free;
    end;
  except
    on E: Exception do
    begin
      ShowMessage('请求异常: ' + E.Message);
      if WhichFailedToLoad <> '' then
        ShowMessage('库加载失败详情: ' + WhichFailedToLoad);
    end;
  end;
  IdHTTP.Free;
end;

end.

3. 部署配置补充

  • 确保部署的OpenSSL库文件(libcrypto.so、libssl.so)的远程路径设置为library/lib/[你的架构]/,比如针对arm64-v8a设备,远程路径是library/lib/arm64-v8a/
  • 检查部署配置中是否勾选了这些文件,并且部署模式设置为Deploy

关键修复点说明

  • 将OpenSSL库加载逻辑提前,确保在创建Indy组件前完成库加载验证
  • 使用组件所有权传递(将IdSSLIOHandler的Owner设为IdHTTP),简化资源释放
  • 明确设置请求的ContentType,避免服务器解析请求出错
  • 增加异常捕获的详细信息,便于排查问题
  • 修复内存泄漏问题,所有动态创建的组件都正确释放

内容的提问来源于stack exchange,提问作者user3140961

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 06:45:09