0

所以这是 Qt 平台抽象的“无法加载平台插件”问题的变体。我有一个依赖于 Qt 框架的 C++ 库。当我创建 C++ 应用程序并使用项目文件夹中的 Qt 依赖项调用库时,一切正常。

但我想将 C++ 项目与 Java 一起使用。JNI 能够加载依赖的 Qt 库,但平台插件似乎是由 Qt 本身加载的,问题出在某个地方:平台插件未加载。我收到标准的“此应用程序无法启动,因为它找不到或加载 Qt 平台插件 X”错误。

我猜这是一个路径问题。无论我把插件放在哪里,Qt 都找不到它们。如果我将所有本机库放在 java 项目文件夹中并将插件放在javaProject /platforms 下,我希望它能够工作,但它不起作用。将它放在 java 项目文件夹本身或将 /platforms 和它的根文件夹都添加到路径变量中没有产生任何结果。我还尝试在 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 变量没有任何效果,我认为它已被弃用。这个难题的解决方案可能是由 jni 加载时QCoreApplication::applicationDirPath()指向的路径。

4

1 回答 1

0

一种解决方案是将您的 DLL/共享 Qt C++ 库放在可访问的目录下,并将该目录名称添加到 Qt 的库路径:

QApplication::addLibraryPath(<full path of your directory name>);

例如,我有一个 Qt for Android 应用程序,它通过 JNI 调用我的 Qt C++ 库“libMyQtCppLib.so”。我把它放在“/tmp/qt5/plugins”下:

/tmp/qt5/plugins/libMyQtCppLib.so

在我的 Qt main() 函数中,我调用:

QApplication::addLibraryPath(QLatin1String("/tmp/qt5/plugins"));

当我的应用程序在 Android 上运行时,这对我有用。我没有在 Windows 上尝试过这个解决方案。但是你可以试一试,看看它在你的平台上是如何工作的。

于 2015-05-01T16:37:20.980 回答