Qt在JNI加载时无法找到平台插件

时间:2014-12-29 13:07:42

标签: java visual-c++ java-native-interface qt5.4

所以这是"未能加载平台插件的变体"问题与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加载时。

1 个答案:

答案 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上试过这个解决方案。但你可以尝试一下,看看它在你的平台上是如何工作的。