所以这是"未能加载平台插件的变体"问题与Qt平台抽象。我有一个依赖于Qt框架的C ++库。当我创建一个C ++应用程序并使用项目文件夹中的Qt Dependencies调用库时,一切正常。
但我想在Java中使用C ++项目。 JNI能够加载依赖的Qt库,但平台插件似乎被Qt本身加载,并且存在一个问题:平台插件没有被加载。我得到标准"这个应用程序无法启动,因为它无法找到或加载Qt平台插件X"错误。
我猜这是一个路径问题。无论我把插件放在哪里,Qt都找不到它们。如果我将所有本机库放在java项目文件夹和 javaProject / platforms下的插件中,我希望它能够工作,但它不起作用。将它放在java项目文件夹本身下,或者将两个/ platform和它的根文件夹添加到路径变量中都没有产生任何结果。我还尝试在Java中显式加载插件,但它没有用。我的想法已经不多了。
静态链接很遗憾不是一种选择,因为C ++库也依赖于插件。
编辑:偶然发现了Qt 4.8部署文档: 插件目录 运行应用程序时,Qt将首先将应用程序的可执行目录视为pluginsbase。例如,如果应用程序位于C:\ Program Files \ MyApp并且具有样式插件,则Qt将查看C:\ Program Files \ MyApp \ styles。 (有关如何找出应用程序的可执行文件的位置,请参阅QCoreApplication :: applicationDirPath()。)Qt还将查看QLibraryInfo :: location(QLibraryInfo :: PluginsPath)指定的目录,该目录通常位于QTDIR中/ plugins(其中QTDIR是安装Qt的目录)。如果您希望Qt查看其他位置,您可以通过调用QCoreApplication :: addLibraryPath()添加所需数量的路径。如果要设置自己的路径或路径,可以使用QCoreApplication :: setLibraryPaths()。您还可以使用qt.conf文件覆盖编译到Qt库中的硬编码路径。有关更多信息,请参阅使用qt.conf文档。另一种可能性是在运行应用程序之前设置QT_PLUGIN_PATH环境变量。如果设置,Qt将查找变量中指定的路径(由系统路径分隔符分隔)中的插件。设置QT_PLUGIN_PATH变量没有任何效果,我认为它已被弃用。这个难题的解决方案可能是 QCoreApplication :: applicationDirPath()指向的路径,当由jni加载时。
答案 0 :(得分:0)
一种解决方案是将您的DLL /共享Qt C ++库放在可访问的目录下,并将该目录名称添加到Qt的库路径中:
QApplication::addLibraryPath(<full path of your directory name>);
例如,我有一个Qt for Android应用程序,它调用我的Qt C ++库&#34; libMyQtCppLib.so&#34;通过JNI。我把它放在&#34; / tmp / qt5 / plugins&#34;:
下/tmp/qt5/plugins/libMyQtCppLib.so
在我的Qt main()函数中,我调用:
QApplication::addLibraryPath(QLatin1String("/tmp/qt5/plugins"));
当我的应用程序在Android上运行时,这适用于我。我没有在Windows上试过这个解决方案。但你可以尝试一下,看看它在你的平台上是如何工作的。