如何在 Android 上部署 Qt imageformats 插件
Posted
技术标签:
【中文标题】如何在 Android 上部署 Qt imageformats 插件【英文标题】:How to deploy Qt imageformats plugins on Android 【发布时间】:2017-11-01 18:58:07 【问题描述】:我正在尝试让图像格式插件在 android 上运行。
我的计划是构建这个APNG图像格式插件,它紧跟官方Qt extraimage format plugins的风格。我的问题的答案对于这些也将是相同的。
在桌面(Windows)上它可以工作。只要您将插件 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>
....
所以,我只需要将我的新插件添加到该列表中即可。
果然,如果我 HACK 进去,它就可以了!但是如何将我的插件作为构建的一部分正确添加到此列表中?
Qt Android 部署上的this 页面提到了一个名为bundled_in_lib
的东西,这确实是我需要的。但不幸的是,它没有解释如何更改或添加它。
我在想可能有一个秘密魔法咒语可以添加到我的qmake
.pro
文件中来影响这个bundled_in_lib
资源。
怎么做?或者有没有更好的方法,我还没有见过。似乎没有太多关于为 Android 解释这些细节的内容。
最后一点,另一种方法可能是手动加载 main.cpp
中的插件。我已经尝试过了,但它不起作用。也许,它们需要由 Qt 图像格式插件加载器加载,而不仅仅是 加载。也许有办法做到这一点。不确定?
使用 Qt5.9.1
感谢您的帮助。
【问题讨论】:
【参考方案1】:按照@Felix 的回答,ANDROID_EXTRA_PLUGINS
是正确的,但它的工作原理有点奇怪。
在讨论了此功能here 缺少文档以及一些试验和错误之后,我发现了这一点;
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 几乎给出了答案,但我想我会在这里写下额外的细节,以造福他人。
【讨论】:
@Felix,谢谢!但你的建议都没有奏效,但你走在正确的轨道上。在跟进您的提示和更多调查后,我在下面发布了答案。干杯!【参考方案2】:答案在同一个网站上,在页面下方一点:Android-specific qmake Variables
您要查找的最有可能是ANDROID_EXTRA_PLUGINS
。没有使用示例,因此您必须尝试以 wich 格式在此处添加插件。
我的建议是:
ANDROID_EXTRA_PLUGINS += imageformats/qapng
或
ANDROID_EXTRA_PLUGINS += plugins/imageformats/libqapng.so
...类似的东西。这也应该处理所有重命名的东西等。
编辑: 您也很可能需要输入绝对路径,即
ANDROID_EXTRA_PLUGINS += $$[QT_INSTALL_PLUGINS]/imageformats/libqapng.so
或在您保留插件的任何路径中
【讨论】:
以上是关于如何在 Android 上部署 Qt imageformats 插件的主要内容,如果未能解决你的问题,请参考以下文章
如何让 Mac 在 Program.App/Contents/Plugins 目录中查找插件?
如何防止 Android 设备从 Qt 应用程序进入睡眠状态