如何在Android

时间:2017-11-01 18:58:08

标签: android qt plugins qml qt5.9

我试图在Android上使用图像格式插件。

我的计划是构建这个APNG图片格式插件,该插件严格遵循官方Qt extra image 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。很好的尝试,但它没有工作。

经过大量的讨论,我发现有一个秘密的资源数组,它将插件的逻辑位置连接到物理文件名;

生活在;

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

感谢您的帮助。

2 个答案:

答案 0 :(得分: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 lib,然后被卷入(例如,用于手臂);

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

答案 1 :(得分:0)

答案位于同一网站上,页面略低:Android-specific qmake Variables

您正在寻找的那个很可能是ANDROID_EXTRA_PLUGINS。没有用法示例,因此您必须尝试以多种格式在此处添加插件。

我的建议是:

ANDROID_EXTRA_PLUGINS += imageformats/qapng

ANDROID_EXTRA_PLUGINS += plugins/imageformats/libqapng.so

......类似的东西。这应该照顾所有重命名的东西等。

编辑:
你也很可能需要输入绝对路径,即

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

或以您保留插件的任何路径