Перейти к содержанию
Fire Monkey от А до Я
  • 0

Failed to load libssl.so


Kitty

Вопрос

Приложение имеет возможность отправлять письма. Протокол OpenSSL Indy. Для этого используются библиотечные файлы libcrypto.so и libssl.so
Файлы добавлены в деплоймент и указан путь, где они лежат.

#include <System.StartupCopy.hpp>
#include <IdSSLOpenSSLHeaders.hpp>

__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
  IdOpenSSLSetLibPath(System::Ioutils::TPath::GetDocumentsPath());
}

//нажатие на кнопку
try
      {
//код***********************


		  IdSMTP1->Connect();
		  try {
			 IdSMTP1->Send(IdMessage1);
		  }
		  __finally {
			 IdSMTP1->Disconnect();
		  }

		  ShowMessage(L"Письмо отправлено.");
	   }
	   catch (const EIdOSSLCouldNotLoadSSLLibrary &)
		  {
//для планшета Samsung GT-P5200		   
String ErMessage = WhichFailedToLoad();
		   String path = System::Ioutils::TPath::Combine(System::Ioutils::TPath::GetSharedDownloadsPath(), L"error.ini");
		   if(FileExists(path))
			 {
              std::unique_ptr<TIniFile> FileINI(new TIniFile(path));
			  FileINI->WriteString(L"ERROR",L"error",ErMessage);
              ShowMessage(L"Ошибка записана в файл error.ini");
             }
		   else
			   {
				ShowMessage(L"Не найден файл error.ini");
               }

		  }
       catch (const Exception &E)
		  {
           String MES = L"Ошибка отправки. Проверти интернет. " + E.Message;
		   ShowMessage(MES);
		  }

APK инсталлирован на телефоны и пару планшетов. Отправка писем исправно работает. Но есть один планшет Samsung GT-P5200, который не может загрузить библиотечный файл, и получаю на нем ошибку:
[ERROR]
error="Failed to load /data/data/com.embarcadero.Mikros/files/libssl.so."

Чтобы убедиться, что дело не в деплойменте делаю новые шаги:
1. Убираю файлі  libcrypto.so and libssl.so из деплоймент менеджера.
2. Вручную копирую эти два файла libcrypto.so и libssl.so  на два планшета в их папки Download.
3. Изменяю код, чтобы была указана папка Download:
IdOpenSSLSetLibPath(System::Ioutils::TPath::GetSharedDownloadsPath());
4. Инсталлирую полученный  APK на планшеты PIPO M7 pro андроид 4.4.2  и Samsung GT-P5200 андроид 4.4.2.
5. Посылаю Indy email из приложения.

На PIPO M7 pro все работает как надо.

На Samsung GT-P5200 снова ошибка загрузки:
[ERROR]
error="Failed to load /storage/emulated/0/Download/libssl.so."

Таким образом планшет  Samsung GT-P5200 андроид 4.4.2 никак не может загрузить libssl.so :(
Что можете посоветовать?
Спасибо.


P.S. Ответ разработчика Indy не дает подсказки, а что же сделать чтобы заработало:

My guess, and this is just a guess, is that the .so file itself is probably not compatible with that tablet and/or OS version. Or maybe it is linked to a dependent .so file that it cannot find.

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

счастливые обладатели Intel Atom...

Причина - некорректная работа SDK для x86,

Как вариант - Android на Atom умеет эмулировать armeabi, удали из Deploy или прямо из APK/lib/ папку x86.

При установке андроид не найдет ее и установит приложение в режиме эмуляции arm, скорее всего будет работать.

Ссылка на комментарий
  • 0

Странно, что весь функционал приложения на планшете Samsung GT-P5200  работает. Там и запись в SQLLite базу присутствует и работает, открытие новых окон и т.п. - все работает.

Не работает только отправка письма...

Ссылка на комментарий
  • 0

Разработчики же написали русским по белому: the .so file itself is probably not compatible with that tablet and/or OS version

Интересно в режиме эмуляции .so file станет compatible?

Ссылка на комментарий
  • 0

на скрине в Remote Path нет строчки  library\lib\x86\, которую надо исключить... непонятно, в  Type это AndroidLibnativeX86File

тестировалось на CBuilder XE7 и XE10

APK файл - это zip архив, его открыть, там папка lib, в ней папки armeabi, armeabi-v7a, mips и x86. Вот оттуда удалить x86.

У меня подозрение что ее там не будет... если нет в deployment

Изменено пользователем Камышев Александр
Ссылка на комментарий
  • 0
  • Модераторы
14 часов назад, Kitty сказал:

Таким образом планшет  Samsung GT-P5200 андроид 4.4.2 никак не может загрузить libssl.so :(
Что можете посоветовать?

(возможно!) нужно найти libssl.so/libcrypto.so для x86, у вас только для arm. и потом грузить файлы под разные архитектуры, только еще бы определить что запущено на intel'e

Ссылка на комментарий
  • 0

По всему не установлены SDK Intel x86, соответственно проблема не в них. 

Анекдот. При головных болях Врач пациенту: бросай курить, Пациент: я не курю, Врач: попробуй закурить.

1. поискать libssl под х86,  пишут что они где-то уже есть в системе у GT.

2. попробовать обновить библиотеки SDK для x86, т.е. если нельзя удалить х86 то надо их поставить :D

применить метод научного тыка:)

Изменено пользователем Камышев Александр
Ссылка на комментарий
  • 0

что ж теперь не пользоваться indy? ssl и в других проектах пригодится, вот тут про сборку https://habrahabr.ru/company/intel/blog/271013/

Библиотеки OpenSSL


Рассмотрим сборку библиотек OpenSSL для Android-устройств, построенных на базе архитектуры x86.
 

Предварительная подготовка


Для дальнейшей работы нам понадобится следующее.
 

  1. Главный компьютер, работающий под управлением ОС Windows 7 или более поздней.
     
  2. Так как библиотеки OpenSSL написаны на чистом C, для сборки будет достаточно Android NDK, в который встроена поддержка для кросс-компиляции библиотек для заданных платформ (ARM, x86 и других).


Исходный код библиотек OpenSSL для Android можно загрузить из репозиториев eighthave или guardianproject.
 

Сборка для платформы x86


Выбрать целевую платформу сборки можно так же, как и для любого другого Android-приложения, используя установки Application Binary Interface (ABI). В нашем случае в файле jni/Application.mk должно присутствовать следующее:
 

APP_ABI := x86


Итак, после того, как NDK загружен и установлен, исходный код Android OpenSSL так же загружен и размещён в локальной папке (например, в C:\openssl-android-master), для сборки библиотек нужно будет сделать следующее.
 

  1. Откройте окно командной строки (cmd.exe).
  2. Перейдите в папку, где расположены файлы OpenSSL для Android. Например, такой командой:


Не забудьте указать для сборки целевую платформу x86:
 

APP_ABI := x86


Выполните команду NDK для запуска сборки:
 

C:\openssl-android-master > ndk-build


После её успешного завершения будут созданы OpenSSL-библиотеки libssl и libcrypto, расположенные, в нашем случае, здесь:
 

C:\openssl-android-master\libs\x86\libcrypto.so
C:\openssl-android-master\libs\x86\libssl.so
Ссылка на комментарий
  • 0

1. Android NDK надо устанавливать? Он ведь установлен при инсталляции студии.

2. Добавила в файл jni/Application.mk строку APP_ABI := x86.  

Далее читаю и не совсем понятно: Перейдите в папку, где расположены файлы OpenSSL для Android. Например, такой командой:

Команда не описана но думаю так: CD C:\openssl-android-master\ssl

Читаю далее: Не забудьте указать для сборки целевую платформу x86: APP_ABI := x86

Как в командной строке выполнить эту рекомендацию? APP_ABI не является командой.

Команда: C:\openssl-android-master > ndk-build также не прошла - пишет не является командой...

Подскажите, как правильно? Спасибо.

 

Ссылка на комментарий
  • 0
1 час назад, Kitty сказал:

Подскажите, как правильно? Спасибо.

скачал в c:/openssl-android-master исходники,

скачал AndroidNDK в d:\ndk\

исправил jni/Application.mk:

APP_PROJECT_PATH := $(shell pwd)
APP_BUILD_SCRIPT := c:/openssl-android-master/Android.mk
APP_ABI := x86

далее в cmd:

C:\Windows\system32>cd c:\openssl-android-master

c:\openssl-android-master>d:\ndk\ndk-build
process_begin: CreateProcess(NULL, pwd, ...) failed.
Android NDK: WARNING:c:/openssl-android-master/crypto/Android.mk:crypto_
LOCAL_LDLIBS is always ignored for static libraries
[x86] Compile        : crypto <= cryptlib.c
c:/openssl-android-master/crypto/cryptlib.c: In function 'CRYPTO_THREADI
t':
c:/openssl-android-master/crypto/cryptlib.c:503:34: warning: passing arg
of 'CRYPTO_THREADID_set_pointer' discards 'volatile' qualifier from poin
et type
  CRYPTO_THREADID_set_pointer(id, &errno);
                                  ^
c:/openssl-android-master/crypto/cryptlib.c:431:6: note: expected 'void
rgument is of type 'volatile int *'
 void CRYPTO_THREADID_set_pointer(CRYPTO_THREADID *id, void *ptr)
      ^
[x86] Compile        : crypto <= mem.c
[x86] Compile        : crypto <= mem_clr.c
[x86] Compile        : crypto <= mem_dbg.c

минут 10 уже компилит, жду результата

Ссылка на комментарий
  • 0

Большое спасибо, завтра попробую на проблемном планшете отправку писем.

P.S.

Чтобы не делать отдельное приложение для х86, можно ли как-то разделить командами компилятора, для какой платформы какой код использовать? Что-то типа такого:

 

#include <System.StartupCopy.hpp>
#include <IdSSLOpenSSLHeaders.hpp>

//в конструкторе формы

#if defined (платформа х86)<-- как тут правильно?
//берем файлы libcrypto.so и libssl.so из папки Download куда мы их скопируем вручную
//эти файлы адпатированы для х86
IdOpenSSLSetLibPath(System::Ioutils::TPath::GetSharedDownloadsPath());
#else
//берем из деплоймента старые libcrypto.so и libssl.so
IdOpenSSLSetLibPath(System::Ioutils::TPath::GetDocumentsPath());
#endif

 

Или сделать отдельный АРК для х86?

Спасибо.

Изменено пользователем Kitty
Ссылка на комментарий
  • 0

 

у ZuBy есть DeviceInfo, может он подскажет. http://fire-monkey.ru/topic/1762-deviceinfo-modul-dlya-polucheniya-informacii-o-devayse/?do=findComment&comment=14057 - очень полезная разработка

есть System.SysUtils.TOSVersion.TArchitecture, в винде показывает х64, в андроид с arm у меня пустые поля, на x86 наверно покажет. http://docwiki.embarcadero.com/Libraries/XE5/en/System.SysUtils.TOSVersion.TArchitecture

в реализации можно так: 

String docs_path = System::Ioutils::TPath::GetDocumentsPath();
if ( atom )
	IdOpenSSLSetLibPath( docs_path + "/lib_atom/" );
else if ( arm )
	IdOpenSSLSetLibPath( docs_path + "/lib_arm/" );
else {}

отдельный APK для x86 - неизящно

 

 

 

 

Ссылка на комментарий
  • 0
  • Модераторы
4 минуты назад, Камышев Александр сказал:

 

у ZuBy есть DeviceInfo, может он подскажет. http://fire-monkey.ru/topic/1762-deviceinfo-modul-dlya-polucheniya-informacii-o-devayse/?do=findComment&comment=14057 - очень полезная разработка

есть System.SysUtils.TOSVersion.TArchitecture, в винде показывает х64, в андроид с arm у меня пустые поля, на x86 наверно покажет. http://docwiki.embarcadero.com/Libraries/XE5/en/System.SysUtils.TOSVersion.TArchitecture

в реализации можно так: 


String docs_path = System::Ioutils::TPath::GetDocumentsPath();
if ( atom )
	IdOpenSSLSetLibPath( docs_path + "/lib_atom/" );
else if ( arm )
	IdOpenSSLSetLibPath( docs_path + "/lib_arm/" );
else {}

отдельный APK для x86 - неизящно

увы и ах, x86 запускается в виртуалке и показывается как arm

только два приложения делать

Изменено пользователем ZuBy
Ссылка на комментарий
  • 0

да что ж такое... тогда радикально, пробовать грузить arm библиотеки, по исключению пробовать грузить atom

еще вариант архитектуру в настройки приложения, пусть пользователь настраивает:)

Ссылка на комментарий
  • 0
  • Модераторы
2 минуты назад, Камышев Александр сказал:

да что ж такое... тогда радикально, пробовать грузить arm библиотеки, по исключению пробовать грузить atom

еще вариант архитектуру в настройки приложения, пусть пользователь настраивает:)

вы представляете удивление пользователя который увидит Combobox с вопросом: У Вас Intel Atom или Arm v7?

Ссылка на комментарий
  • 0

Доступ к планшету х86 у меня будет завтра. Ради эксперимента решила попробовать новый АРК с новыми libcrypto.so и libssl.so на своем планшете arm.

Искренне пологая, что письмо не должно уйти т.к. файлы libcrypto.so и libssl.so взяты для х86. Очень странно но письмо ушло. Не понятно почему работает на arm?

Ссылка на комментарий
  • 0
14 часов назад, Kitty сказал:

Доступ к планшету х86 у меня будет завтра. Ради эксперимента решила попробовать новый АРК с новыми libcrypto.so и libssl.so на своем планшете arm.

Искренне пологая, что письмо не должно уйти т.к. файлы libcrypto.so и libssl.so взяты для х86. Очень странно но письмо ушло. Не понятно почему работает на arm?

Я был удивлен когда библиотеки вообще собрались, не прошло и часа... Идеально будет если они будут работать и на atom и на arm

Ссылка на комментарий
  • 0
15 часов назад, ZuBy сказал:

вы представляете удивление пользователя который увидит Combobox с вопросом: У Вас Intel Atom или Arm v7?

крайние ситуации требуют крайних мер

Ссылка на комментарий
  • 0
В 01.09.2016 в 17:50, Kitty сказал:

Доступ к планшету х86 у меня будет завтра. Ради эксперимента решила попробовать новый АРК с новыми libcrypto.so и libssl.so на своем планшете arm.

Искренне пологая, что письмо не должно уйти т.к. файлы libcrypto.so и libssl.so взяты для х86. Очень странно но письмо ушло. Не понятно почему работает на arm?

так что там с x86 планшетом? чем закончилось?

Ссылка на комментарий
  • 0
1 час назад, Камышев Александр сказал:

так что там с x86 планшетом? чем закончилось?

Хозяева этого планшета уехали, будут в конце недели. :)

Изменено пользователем Kitty
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...