</h1><divclass="smallfont shade"><spanclass="shade">Запись от <ahref="http://www.cyberforum.ru/blogs/748276/">Wyn</a> размещена 18.01.2016 в 18:22</span></div><scripttype="text/javascript"src="./patch_openssl_so_libs_files/blog_ajax_tag.js"></script><divclass="smallfont"id="blogtagcontainer_4086"><spanclass="shade">Метки</span><spanid="blogtaglist_4086"><ahref="http://www.cyberforum.ru/blog.php?tag=android&u=748276">android</a>, <ahref="http://www.cyberforum.ru/blog.php?tag=openssl&u=748276">openssl</a>, <ahref="http://www.cyberforum.ru/blog.php?tag=qt&u=748276">qt</a></span></div><divstyle="clear:both; margin-top:4px"></div><hrsize="1"style="color:#AAAAAA; background-color:#AAAAAA; margin-bottom:10px"><divid="blog_message"style="margin-bottom:10px"><!-- google_ad_section_start --><!-- google_ad_section_start -->Мини-руководство по тому, как быстро скомпилировать OpenSSL для Android и связать его с проектом Qt.<br>
Для Linux.<br><br>
Вначале действия полностью идентичны <arel="nofollow"href="https://wiki.openssl.org/index.php/Android"target="_blank"title="https://wiki.openssl.org/index.php/Android">"расово-верному" руководству по компилянию OpenSSL для Android</a>:<br>
Качаем исходники openssl нужной версии с их сайта, качаем setenv-android.sh(все ссылки на закачку выше по ссылке).<br>
Ложим их в одну папку. Запускаем консоль, переходим в ней в эту самую папку.<br>
</pre></td><tdclass="de1"><preclass="de1">$ <spanclass="kw2">rm</span><spanclass="re5">-rf</span> openssl-1.0.1g<spanclass="sy0">/</span> <spanclass="co0"># удаляем исходники(вместо версии 1.0.1g - подставляем свою), если они уже были распакованы</span>
$ <spanclass="kw2">tar</span> xzf openssl-1.0.1g.tar.gz <spanclass="co0"># распаковываем исходники в подпапку</span>
$ <spanclass="kw2">chmod</span> a+x setenv-android.sh <spanclass="co0"># разрешаем setenv-android.sh исполняться</span></pre></td></tr></tbody></table></div></td></tr></tbody></table></div>Редактируем setenv-android.sh, настраивая там _ANDROID_EABI, _ANDROID_ARCH, _ANDROID_API на нужные значения.<br>
</pre></td><tdclass="de1"><preclass="de1">$ <spanclass="kw3">export</span><spanclass="re2">ANDROID_NDK_ROOT</span>=путь_до_ANDROID_NDK <spanclass="co0"># указываем путь до Android NDK для setenv-android.sh</span>
$ . .<spanclass="sy0">/</span>setenv-android.sh <spanclass="co0"># запускаем скрипт, чтобы он нам в окружение проставил необходимые далее переменные</span>
$ <spanclass="kw2">sudo</span><spanclass="re5">-E</span><spanclass="kw2">make</span><spanclass="kw2">install</span><spanclass="re2">CC</span>=<spanclass="re1">$ANDROID_TOOLCHAIN</span><spanclass="sy0">/</span>arm-linux-androideabi-gcc <spanclass="re2">RANLIB</span>=<spanclass="re1">$ANDROID_TOOLCHAIN</span><spanclass="sy0">/</span>arm-linux-androideabi-ranlib</pre></td></tr></tbody></table></div></td></tr></tbody></table></div>И тут начинается интересное. Андроид не принимает versioned shared object (это *.so.x и подобные). Казалось бы 2016 год, космические корабли уже давно бороздят просторы Большого театра, но вот те на. <br><br>
Однако, есть обходной приём - нужно заменить *.so.x.x.x на *_x_x_x.so. Простым переименованием файлов данную проблему здесь, разумеется, не решить. Нужно лезть внутрь и переименовывать soname и внутренние ссылки на другие versioned shared object. В интернете есть много способов по подобному переименованию. Большинство из них обещают райскую жизнь с rpl, забывая упомянуть, что утилита уже давно отпета и закопана на большинстве дистрибутивов. Или хитро-хитро редактируют makefile, что в итоге на место левой руки собирается правая нога. В целом множество путей из разряда "как потратить много времени на полную фигню". <br><br>
В итоге предлагаю решить данную проблему методом топора:<br>
Качаем hex-редактор, если ещё нет(в моём случае таковым оказался Okteta). Запускаем его из под рута(kdesu okteta), открываем в нём файлы openssldir/lib/libcrypto.so.1.0.0. Заменяем(ctrl+r) в нём символы ".so.1.0.0" на char "_1_0_0.so". Проделываем тоже самое с libssl.so.1.0.0. Всё, теперь осталось только переименовать сами файлы(в libcrypto_1_0_0.so и libssl_1_0_0.so) и поправить ссылки libssl.so и libcrypto.so, чтобы они вели на них.<br><br>
Чтобы подключить и использовать данную библиотеку в проекте нужно добавить в .pro:<br><divstyle="margin: 5px 10px 5px 30px"><tableclass="bash"><thead><tr><tdcolspan="2"class="head">Bash<ahref="http://www.cyberforum.ru/#"style="float: right; color: rgb(96, 96, 96); font-weight: normal;">Выделить код</a></td></tr></thead><tbody><trclass="li1"><td><divid="304166412"style="overflow: auto; width: 805px; height: 105px"><table><tbody><trclass="li1"><tdclass="ln"style="padding: 0px 10px 0px 5px;"><preclass="de1">1
LIBS += <spanclass="re5">-lcrypto</span></pre></td></tr></tbody></table></div></td></tr></tbody></table></div>А затем в настройках проекта, в Buld/Build Steps/Bulild Android Apk добавить libcrypto_1_0_0.so и libssl_1_0_0.so в список Additional Libraries.<br><br>