QSqlDatabase: ошибка драйвера QSQLITE не загружена "при развертывании проекта Qt- Android с использованием JNI с Android studio - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть простой проект в 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")), которая предлагается в некоторых ссылках не работает. Какое решение?

...