Android平台DataSnap SSL模块加载失败问题排查求助
问题描述
我从OpenSSL二进制包下载了OpenSSL 1.0.2g的Android版本压缩包,尝试了x86和ARM两种架构。已将libssl.so和libcrypto.so两个文件添加到项目中(项目文件添加示意图如下),项目部署成功,但这两个文件似乎完全没被使用。
DPR文件的uses段已将System.StartupCopy放在首位:
System.StartupCopy;

当DataSnap服务器启用SHA1过滤器后,客户端报错:
Unable to Load SSL Module on the Client.
请问哪里操作有误?
客户端代码
procedure TMain.SendDeviceStatus; var SQLConnection : TSQLConnection; Temp : TServerMethods1Client; begin try SQLConnection := TSQLConnection.Create(nil); try SQLConnection.DriverName := 'DataSnap'; SQLConnection.Params.Clear; SQLConnection.Params.Add('DriverUnit=Data.DBXDataSnap'); SQLConnection.Params.Add('DriverAssemblyLoader=Borland.Data.TDBXClientDriverLoader,Borland.Data.DbxClientDriver,Version=24.0.0.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b'); SQLConnection.Params.Add('DriverName=DataSnap'); SQLConnection.Params.Add('HostName=' + FServerIP); SQLConnection.Params.Add('Port=' + FServerPort); SQLConnection.Params.Add('DSAuthenticationUser=' + FDSUser); SQLConnection.Params.Add('DSAuthenticationPassword=' + FDSPassword); SQLConnection.Params.Add('CommunicationIPVersion=IP_IPv4'); SQLConnection.Params.Add('CommunicationProtocol=tcp/ip'); SQLConnection.Params.Add('DatasnapContext=datasnap/'); SQLConnection.Params.Add('DSProxyPort=8888'); SQLConnection.Params.Add('CommunicationTimeout=100'); SQLConnection.Params.Add('ConnectTimeout=100'); SQLConnection.Connected := true; Temp := TServerMethods1Client.Create(SQLConnection.DBXConnection); try Temp.DEVICE_STATUS(FDeviceName, FOwner, SSID, SoftwareVersion, SignalStrength, BatteryLevel); SQLConnection.Close; finally Temp.Free; end; finally SQLConnection.Free; end; except on E : Exception do begin TDialogService.ShowMessage('[ ERROR : ]' + sLineBreak + E.Message); end; end; end;
解决思路与步骤
针对DataSnap客户端加载SSL模块失败的问题,按以下步骤排查:
确认OpenSSL版本兼容性
DataSnap对OpenSSL版本有严格要求,需匹配你使用的Delphi版本:旧版Delphi(如XE系列)适配1.0.2g,新版Delphi(10.3+)可能需要1.1.x系列。先核对版本是否匹配。修正
.so文件的部署路径
Android平台下,库文件必须按架构分类放置:- ARM架构:放到项目的
libs/armeabi-v7a或arm64-v8a目录 - x86架构:放到
libs/x86或x86_64目录
同时在Delphi的部署设置中,将.so文件的Remote Path设为.\lib\$(Platform),确保打包时自动放入APK的对应lib/[架构]目录,系统才能找到库文件。
- ARM架构:放到项目的
完善DataSnap连接SSL配置
你的连接参数缺少SSL启用配置,添加以下参数:SQLConnection.Params.Add('UseSSL=True'); // 可选:指定SSL库路径,替换为你的应用包名 SQLConnection.Params.Add('SSLLibraryPath=/data/data/com.yourpackage/lib');检查库文件权限
通过ADB命令验证设备上的库文件权限:adb shell ls -l /data/data/com.yourpackage/lib/若权限不足,执行:
adb shell chmod 755 /data/data/com.yourpackage/lib/libssl.so adb shell chmod 755 /data/data/com.yourpackage/lib/libcrypto.so验证库文件完整性
重新下载OpenSSL 1.0.2g的Android包,检查.so文件大小是否正常,避免文件损坏导致加载失败。
内容的提问来源于stack exchange,提问作者user1937012
相关产品推荐
相关产品推荐

