• 0
Kitty

Failed to load libssl.so

Вопрос

Приложение имеет возможность отправлять письма. Протокол 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

39 ответов на этот вопрос

  • 0

Может, проблема в том, что там Intel Atom?

Kitty понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

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

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

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

Kitty понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 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
Цитата

удали из Deploy или прямо из APK/lib/ папку x86.

Можно чуть подробнее. Что из Deploy удалить на картинке или где удалить папку x86?

 

123.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 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

AlexG и Kitty понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

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

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

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

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

Изменено пользователем Камышев Александр
AlexG и Rusland понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
Цитата

нужно найти libssl.so/libcrypto.so для x86,

Не знаю где найти. :(

Подскажите, а как еще можно отправить файл по почте на андроиде без использования Indy?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 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
AlexG, rareMax и Kitty понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 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 уже компилит, жду результата

Kitty понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

компиляция шла около часа, вот если кому нннада файлы библиотек

x86.zip

AlexG, Rusland и Kitty понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 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 - неизящно

 

 

 

 

Kitty понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 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
Kitty понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 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?

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

Vitaldj понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
В 01.09.2016 в 17:50, Kitty сказал:

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
1 час назад, Камышев Александр сказал:

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

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

Изменено пользователем Kitty

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Нет, на интел планшете не хочет отправлять письма. :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу