У меня есть простой проект в Qt (как dbManagement), который пытается открыть базу данных Sqlite на устройстве Android. Я поместил свою базу данных Sqlite в / mnt / sdcard /.
1-Все в порядке, когда я собираю и развертываю свой проект из Qt на моем Android устройстве.
main. cpp
#include <QApplication>
#include "initialization.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Initialization* initialization=new Initialization;
initialization->checkSqlite();
return a.exec();
}
инициализация. cpp
...
void Initialization::checkSqlite()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","SQLITE");
db.setDatabaseName("/mnt/sdcard/database");
if( !db.open() )
{
if(QFile("/mnt/sdcard/database").exists())
LOGE("Checking database has error: database exists but %s.",db.lastError().driverText().toStdString().c_str());
else
LOGE("Checking database has error: database not exists.");
}
else
{
LOGE("Checking database is OK.");
}
}
...
output:
Checking database is OK.
2 - Теперь я хочу запустить проект Android, используя созданную библиотеку моего проекта Qt (libdbManagement.so) и JNI.
Вот мой CMakeLists.txt
cmake_minimum_required(VERSION 3.4.1)
include_directories(includes
includes/QtCore
includes/QtSql
)
link_directories(libs)
add_library(polaris-lib SHARED main.cpp)
target_link_libraries(
polaris-lib
-lQt5Sql
-lQt5Core
-llog
-lz
-ldbManagement
-lQt5Network
)
А вот мой главный. cpp в моем Android студийном проекте с использованием JNI:
#include <jni.h>
#include "initialization.h"
#include <android/log.h>
#define LOG_TAG "polaris-lib"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
using namespace std;
extern "C" JNIEXPORT void JNICALL
Java_com_horizon_polarislib_MainActivity_startDiagBackgroundService(JNIEnv *env, jclass clazz) {
Initialization* initialization=new Initialization;
initialization->checkSqlite();
LOGE("STARTED");
}
После создания и запуска этого Android проекта на моем Android устройстве вывод:
Checking database has error: database exists but Driver not loaded
, и я вижу эти журналы в Android Выводы Studio Run:
QSqlDatabase: QSQLITE driver not loaded
QSqlDatabase: available drivers:
Похоже, что libqsqlite.so известен в Состоянии 1 и неизвестен в Состоянии 2. После поиска этой ошибки я могу найти несколько похожих вопросов, таких как this , который предлагает поместить libqsqlite.so в PARENT_FOLDER. / sqldrivers / и добавьте PARENT_FOLDER в путь к библиотеке, используя QCoreApplication::addLibraryPath
. Итак, я создал каталог (/ mnt / sdcard / plugins / sqldrivers) и поместил в него libqsqlite.so. Кроме того, я добавил эти коды к своему Initialization::checkSqlite
:
QCoreApplication::addLibraryPath("/mnt/sdcard/plugins");
QApplication::addLibraryPath("/mnt/sdcard/plugins");
QStringList paths = QCoreApplication::libraryPaths();
for (int i = 0; i < paths.count(); i++) {
QString str=paths.at(i);
LOGE("Path: %s",str.toStdString().c_str());
}
, и я вижу Path: /mnt/sdcard/plugins
в приведенном выше l oop. Но все равно драйвер Sqlite не загружен. Кроме того, установите переменную qputenv("QT_DEBUG_PLUGINS", QByteArray("1"))
, которая предлагается в некоторых ссылках не работает. Какое решение?