2

我正在尝试让图像格式插件在 Android 上运行。

我的计划是构建这个APNG图像格式插件,它紧跟官方Qt额外图像格式插件的风格。我的问题的答案对于这些也将是相同的。

在桌面(Windows)上它可以工作。只要您将插件 DLL 放入这样的imageformats子目录中:

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

但在 Android 上,情况就另当别论了。

第一个想法是把它libqapng.so与所有其他libsqtcreator捆绑在一起,作为 APK 构建的一部分。它进入,但在运行时不会被 Qt 加载。

所以我研究了现有的 qt 图像格式是如何工作的;

事实证明,它们不是在子目录中,而是根据这种模式命名的;

libplugins_imageformats_libqapng.so

所以我重命名libqapng.so为上面并将其放入libs. 不错的尝试,但没有奏效。

经过一番摸索,我发现有一个秘密资源数组将插件的逻辑位置与物理文件名连接起来;

这住在;

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

谢谢你的帮助。

4

2 回答 2

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

.solib,然后结束(例如手臂);

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 几乎给出了答案,但我想我会在这里写下额外的细节以造福他人。

于 2017-11-02T14:33:33.390 回答
0

答案在同一个站点上,在页面下方一点: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

或在您保留插件的任何路径中

于 2017-11-02T09:47:48.210 回答