Android Eclipse项目中的Qt C ++库:QSQLITE驱动程序未加载

我创建了一个使用Qt SQL打开SQLite数据库的Qt动态库,但是出现此错误:

QSqlDatabase: QSQLITE driver not loaded
QSqlDatabase: available drivers: 

该DLL作为Qt Android应用程序的一部分运行良好,但是我需要通过来自Eclipse中开发的现有Java应用程序的JNI使用它。

这是再现问题的最短示例代码。 我从Java加载库并调用它的init()方法:

System.loadLibrary("plugins_sqldrivers_libqsqlite");
System.loadLibrary("Qt5Sql");
System.loadLibrary("MyQtLib");
MyQtLib.init();

在Qt库中,我只需调用QSqlDatabase :: addDatabase():

JNIEXPORT void JNICALL Java_test_MyQtLib_foo(JNIEnv *, jclass)
{
    // Manually create a QCoreApplication instance.
    int argc = 1;
    static char arg[] = "";
    static char *arg2 = arg;
    app = new QCoreApplication(argc, &arg2);
    // Try to add an SQLite db connection.
    QSqlDatabase::addDatabase("QSQLITE");
}

由于错误是QSQLITE driver not loaded ,并且Qt库在Qt应用程序内工作,我认为Qt正在执行一些我缺少的初始化。

但是这并没有消除错误,所以它一定是别的。 通常情况下,Qt应用程序将使用QtApplication.java和QtActivity.java来执行一些初始化,所以他们必须在那里做更多的事情,我不这样做。


最后,我进入Qt源代码,看看SQLITE插件是如何加载的(至少用于桌面构建)。

相关函数是QFactoryLoader :: update()。 在这里我注意到它迭代了QCoreApplication::libraryPaths()所有目录:

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

如果它们中的任何一个具有名为“sqldrivers”的子目录,它将进入它并尝试加载该子目录中的所有动态库。

然后我打印出一个测试项目中的库路径,我直接从Qt Creator运行 - qDebug() << a.libraryPaths(); ,并且我看到了这个路径 - /data/data/org.qtproject.example.untitled/qt-reserved-files/plugins 。 在我的android手机上的这个目录中,有一个名为sqldrivers的子目录,它包含一个文件 - libqsqlite.so

然后我检查了.java文件,实际上QtActivity::startApp()添加了库路径:

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;
}

然后,解决方案将确保在手机上存在sqldrivers/libqsqlite.so ,然后使用QCoreApplication::addLibraryPath()sqldrivers的父文件夹添加到库路径。

链接地址: http://www.djcxy.com/p/86871.html

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

下一篇: Which third party Imageview class should i used?