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
相关产品推荐
相关产品推荐

