2014-12-29 4 views
0

Так что это вариант проблемы с загрузкой платформы «без загрузки платформы» с абстракцией платформы Qt. У меня есть библиотека C++, которая зависит от Qt Framework. Все работает, когда я создаю приложение C++ и вызываю библиотеку с зависимостями Qt в папке проекта.Qt не может найти плагины платформы при загрузке JNI

Но я хочу использовать проект C++ с Java. JNI может загружать зависимые Qt-библиотеки, но плагин платформы, похоже, загружается самим Qt, и там где-то есть проблема: плагин платформы не загружен. Я получаю стандарт «Это приложение не запускалось, потому что оно не могло найти или загрузить ошибку Qt платформы плагина X».

Я предполагаю, что это проблема пути. Независимо от того, где я размещаю плагины, Qt не может их найти. Я ожидаю, что это сработает, если я поместил все родные библиотеки в папку проекта java и плагин под javaProject/platform, но это не сработает. Поместив его в папку проекта java или добавив обе/платформы и корневую папку к переменной пути, результат не дал результата. Я также попытался загрузить плагин явно на Java, но это не сработало. У меня заканчиваются идеи.

Статическое связывание, к сожалению, не является вариантом, поскольку библиотека C++ также зависит от плагинов.

EDIT: споткнулся в Qt документ 4,8 развертывания: Плагин каталог Когда приложение запущено, Qt сначала просматривает каталог исполняемого приложения как pluginsbase. Например, если приложение находится в C: \ Program Files \ MyApp и имеет плагин стиля, Qt будет выглядеть в стилях C: \ Program Files \ MyApp \. (См. 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

Одно решения было бы разместить DLL/разделяемые библиотеки Qt C++ под доступным каталогом и добавить, что имя каталога в пути к библиотеке Qt:

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

К примеру, у меня есть Qt для Android приложения, которое вызывает мою библиотеку Qt C++ «libMyQtCppLib.so» через JNI. Я помещаю его под "/ TMP/qt5/плагины":

/tmp/qt5/plugins/libMyQtCppLib.so

И в моей функции Qt основной(), я называю:

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

Это работает для меня, когда мое приложение запускается на Android. Я не пробовал это решение в Windows. Но вы можете попытаться понять, как это работает на вашей платформе.

Смежные вопросы