Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Ошибка загрузки libcrypto.so: неверный путь или файл не найден

Delphi , Синтаксис , Ошибки и Исключения

В статье пойдет речь об ошибке "failed to load /data/user/0/com.embarcadero.TimApp/files/libcrypto.so" при использовании IdHTTPS в приложении Delphi/Android. Мы рассмотрим причину возникновения ошибки и предложим решение для ее устранения.

Причина ошибки

Ошибка связана с ограничением на загрузку файлов .so из записываемых путей в новых версиях Android (w^x restriction). Приложение пытается загрузить файл libcrypto.so из пути /data/user/0/com.embarcadero.TimApp/files/, который является записываемым путем. Однако, начиная с Android 7.0 (API level 24), приложениям запрещено загружать файлы .so из записываемых путей в пользовательском пространстве.

Решение проблемы

Чтобы решить проблему, нам нужно включить библиотеку в правильную подпапку libs внутри нашего APK. Вот шаги, которые помогут вам это сделать:

  1. Убедитесь, что вы используете правильную версию OpenSSL для своей платформы (armeabi-v7a, armeabi-v8a или x86_64) и добавляете соответствующие файлы libcrypto.so и libssl.so в свой проект.
  2. Добавьте файлы libcrypto.so и libssl.so в папку libs вашего проекта. Создайте подпапку libs в корневом каталоге вашего проекта и поместите в нее файлы libcrypto.so и libssl.so.
  3. Обновите файл TimApp.deployproj, чтобы указать правильный путь для файлов libcrypto.so и libssl.so. Найдите следующие строки в файле и измените их согласно приведенным ниже примерам:
<DeployFile Include="Android64\openssl-1.02_Android\armeabi-v7a\libcrypto.so" Condition="'$(Config)'=='Debug'">
    <RemoteDir>TimApp\assets\internal\libs\</RemoteDir>
    <RemoteName>libcrypto.so</RemoteName>
    <DeployClass>File</DeployClass>
    <Operation>0</Operation>
    <LocalCommand/>
    <RemoteCommand/>
    <Overwrite>True</Overwrite>
</DeployFile>
<DeployFile Include="Android64\openssl-1.02_Android\armeabi-v7a\libssl.so" Condition="'$(Config)'=='Debug'">
    <RemoteDir>TimApp\assets\internal\libs\</RemoteDir>
    <RemoteName>libssl.so</RemoteName>
    <DeployClass>File</DeployClass>
    <Operation>0</Operation>
    <LocalCommand/>
    <RemoteCommand/>
    <Overwrite>True</Overwrite>
</DeployFile>

Измените путь в тегах <RemoteDir> на TimApp\assets\internal\libs\.

  1. Пересоберите и переустановите ваше приложение на устройство Android.

После выполнения этих шагов ошибка "failed to load /data/user/0/com.embarcadero.TimApp/files/libcrypto.so" должна быть устранена, и ваше приложение должно работать правильно.

Пример кода на Object Pascal (Delphi)

Ниже приведен пример кода на Object Pascal (Delphi), демонстрирующий использование IdHTTPS после решения проблемы с загрузкой libcrypto.so:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdHTTP, IdSSLOpenSSL;

type
  TForm1 = class(TForm)
    btnGet: TButton;
    procedure btnGetClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnGetClick(Sender: TObject);
var
  IdHTTP1: TIdHTTP;
  IdSSLOpenSSL1: TIdSSLOpenSSL;
begin
  IdHTTP1 := TIdHTTP.Create(nil);
  try
    IdSSLOpenSSL1 := TIdSSLOpenSSL.Create(IdHTTP1);
    try
      IdSSLOpenSSL1.SSLOpenSSLVersion := sslvTLSv1_2;
      IdSSLOpenSSL1.SSLCertificateFile := 'path\to\your\certificate.pem';
      IdHTTP1.IOHandler := IdSSLOpenSSL1;
      IdHTTP1.Get('https://example.com');
    finally
      IdSSLOpenSSL1.Free;
    end;
  finally
    IdHTTP1.Free;
  end;
end;

end.

В этом примере мы создаем экземпляр TIdSSLOpenSSL и настраиваем его, указав версию SSL и файл сертификата. Затем мы устанавливаем экземпляр TIdSSLOpenSSL в качестве IOHandler для TIdHTTP и выполняем GET-запрос к удаленному серверу. Обратите внимание, что путь к файлу сертификата должен быть указан правильно.

Надеемся, что эта статья помогла вам решить проблему с ошибкой "failed to load /data/user/0/com.embarcadero.TimApp/files/libcrypto.so" в вашем приложении Delphi/Android.

Создано по материалам из источника по ссылке.

Статья посвящена решению проблемы ошибки 'failed to load /data/user/0/com.embarcadero.TimApp/files/libcrypto.so' при использовании IdHTTPS в приложении Delphi/Android.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Ошибки и Исключения ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 03:42:21/0.005789041519165/0