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

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/[架构]目录,系统才能找到库文件。
  • 完善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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 17:05:17