Qt C++ library in Android Eclipse project: QSQLITE driver not loaded

后端 未结 1 2004
北恋
北恋 2020-12-19 07:04

I\'ve created a Qt dynamic lib that uses Qt SQL to open an SQLite database, but I\'m getting this error:

QSqlDatabase: QSQLITE driver not loaded
QSqlDatabase         


        
相关标签:
1条回答
  • 2020-12-19 07:34

    Eventually I stepped into the Qt sources to see how the SQLITE plugin is loaded (for the desktop build at least).

    The relevant function was QFactoryLoader::update(). In it I noticed that it iterates all the directories in QCoreApplication::libraryPaths():

    QStringList paths = QCoreApplication::libraryPaths();
    for (int i = 0; i < paths.count(); ++i) {
    

    If any of them has a sub-directory named "sqldrivers", it goes inside it and tries to load all the dynamic libraries in that sub-directory.

    I then printed out the library paths in a test project I ran directly from Qt Creator - qDebug() << a.libraryPaths();, and I saw this path - /data/data/org.qtproject.example.untitled/qt-reserved-files/plugins. In this directory on my android phone there was a subdirectory named sqldrivers, that contained a single file - libqsqlite.so.

    I then checked the .java files, and indeed QtActivity::startApp() adds the library path:

    boolean bundlingQtLibs = false;
    if (m_activityInfo.metaData.containsKey("android.app.bundle_local_qt_libs")
        && m_activityInfo.metaData.getInt("android.app.bundle_local_qt_libs") == 1) {
        localPrefix = getApplicationInfo().dataDir + "/";
        pluginsPrefix = localPrefix + "qt-reserved-files/";
        cleanOldCacheIfNecessary(localPrefix, pluginsPrefix);
        extractBundledPluginsAndImports(pluginsPrefix);
        bundlingQtLibs = true;
    }
    

    The solution then would be to ensure that there is a sqldrivers/libqsqlite.so somewhere on the phone, and then add the parent folder of sqldrivers to the library path using QCoreApplication::addLibraryPath().

    0 讨论(0)
提交回复
热议问题