Как развернуть плагины Qt imageformats на Android

Я пытаюсь заставить плагины формата изображения работать на Android.

Я планирую создать этот плагин формата изображения APNG, который точно соответствует стилю официального дополнения Qt плагины формата изображений. Ответ на мою проблему будет таким же и для них.

На десктопе (винда) работает. Пока вы помещаете DLL плагина в подкаталог imageformats следующим образом:

myapp/<all my binaries>
imageformats/qapng.dll

Но на Android это другая история;

Первая идея заключалась в том, чтобы поместить libqapng.so в libs, чтобы qtcreator связал его со всеми остальными как часть сборки APK. Он входит, но не загружается Qt во время выполнения.

Итак, я изучаю, как работают существующие форматы изображений qt;

оказывается, они не в подкаталоге, а именуются по этому шаблону;

libplugins_imageformats_libqapng.so

Поэтому я переименовываю libqapng.so в указанное выше и помещаю его в libs. Хорошая попытка, но не получилось.

После долгих размышлений я обнаружил, что существует секретный массив resource, который связывает логическое расположение плагинов с именами физических файлов;

Это живет в;

res/values/libs.xml

и выглядит так:

<array name="bundled_in_lib">
        ...
    <item>libplugins_imageformats_libqgif.so:plugins/imageformats/libqgif.so</item>
    <item>libplugins_imageformats_libqicns.so:plugins/imageformats/libqicns.so</item>
    <item>libplugins_imageformats_libqico.so:plugins/imageformats/libqico.so</item>
    <item>libplugins_imageformats_libqjpeg.so:plugins/imageformats/libqjpeg.so</item>
    <item>libplugins_imageformats_libqsvg.so:plugins/imageformats/libqsvg.so</item>
    <item>libplugins_imageformats_libqtga.so:plugins/imageformats/libqtga.so</item>
    <item>libplugins_imageformats_libqtiff.so:plugins/imageformats/libqtiff.so</item>
    <item>libplugins_imageformats_libqwbmp.so:plugins/imageformats/libqwbmp.so</item>
    <item>libplugins_imageformats_libqwebp.so:plugins/imageformats/libqwebp.so</item>
    ....

Итак, мне просто нужно добавить мой новый плагин в этот список.

Конечно же, если я ВЗЛОМАЮ его, он работает! но как правильно добавить мой плагин в этот список как часть сборки?

на этой странице о развертывании Qt Android упоминается вещь под названием bundled_in_lib, которая действительно то, что мне нужно. Но, к сожалению, не объясняет, как это изменить или добавить к этому.

Я думаю, что может быть секретное магическое заклинание, которое я могу добавить в свой qmake .pro файл, чтобы воздействовать на этот bundled_in_lib ресурс.

Как это сделать? или есть лучший способ, которого я еще не видел. Кажется, не так уж много нужно объяснять эти детали для Android.

В заключение, альтернативой может быть ручная загрузка плагина в main.cpp. Я пробовал это, и это не работает. Возможно, они должны быть загружены загрузчиком плагинов формата изображений Qt, а не просто загружены вообще. Может быть, есть способ сделать это. не уверена?

используя Qt5.9.1

Спасибо за любую помощь.


person jkj yuio    schedule 01.11.2017    source источник


Ответы (2)


Следуя ответу @Felix, ANDROID_EXTRA_PLUGINS правильно, но то, как это работает, немного странно.

После обсуждения отсутствия документации по этой функции здесь и некоторых проб и ошибок , я нашел это;

ANDROID_EXTRA_PLUGINS должен указывать каталог, а не файл. Таким образом, вы указываете на собственный каталог плагинов. Вещи ниже этого каталога (включая подкаталоги) искажаются, как в моем исходном вопросе, и поясняется ниже.

Итак, для моего плагина libqapng.so у меня есть:

ANDROID_EXTRA_PLUGINS += <some path>/plugins

и мой плагин для Android .pro вводит вывод;

<some path again>/plugins/imageformats/libqapng.so

Затем библиотека .so оказывается испорченной (например, для руки);

android-build/libs/armeabi-v7a/libplugins_imageformats_libqapng.so

и ресурсы получают запись;

android-build/res/values/libs.xml

    <array name="bundled_in_lib">
    ...
<item>libplugins_imageformats_libqapng.so:plugins/imageformats/libqapng.so</item>
</array>

как требуется.

Спасибо @Felix почти за ответ, но я подумал, что напишу здесь дополнительные подробности для других.

person jkj yuio    schedule 02.11.2017
comment
@Феликс, спасибо за это! Но ни одно из ваших предложений не сработало, но вы были на правильном пути. Я разместил ответ ниже после того, как последовал вашим советам и провел еще несколько исследований. ваше здоровье! - person jkj yuio; 02.11.2017

Ответ на том же сайте, чуть ниже на странице: Переменные qmake для Android

Тот, кого вы ищете, скорее всего, ANDROID_EXTRA_PLUGINS. Примера использования нет, поэтому вам придется попробовать, в каком формате добавить сюда плагин.

Мои предложения будут такими:

ANDROID_EXTRA_PLUGINS += imageformats/qapng

or

ANDROID_EXTRA_PLUGINS += plugins/imageformats/libqapng.so

... что-то такое. Это также должно позаботиться обо всех переименованиях и т. Д.

РЕДАКТИРОВАТЬ:
Также вполне возможно, что вам нужно ввести абсолютный путь, т.е.

ANDROID_EXTRA_PLUGINS += $$[QT_INSTALL_PLUGINS]/imageformats/libqapng.so

или в зависимости от того, где вы храните плагин

person Felix    schedule 02.11.2017