android - Android Eclipse 项目中的 Qt C++ 库 : QSQLITE driver not loaded

标签 android c++ eclipse qt

我已经创建了一个使用 Qt SQL 打开 SQLite 数据库的 Qt 动态库,但是我收到了这个错误:

QSqlDatabase: QSQLITE driver not loaded
QSqlDatabase: available drivers: 

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

这是重现问题的最短示例代码。我从 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 驱动程序未加载,并且 Qt 库在 Qt 应用程序中运行,我假设 Qt 正在执行一些我遗漏的初始化。

但这并没有消除错误,所以它一定是别的原因。通常,Qt 应用程序将使用 QtApplication.javaQtActivity.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手机某处,然后添加sqldrivers的父文件夹使用 QCoreApplication::addLibraryPath() 到库路径.

关于android - Android Eclipse 项目中的 Qt C++ 库 : QSQLITE driver not loaded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31607280/

相关文章:

android - 无法打开符号文件。错误 (20) : Not a directory

c++ - cpp 通过引用传递

java - 需要帮助以根据选定的树节点触发 helpKey F1 JavaHelp (Eclipse-Java)

java - Eclipse 中的空 .jar 文件

android - 在 SMS 上点击链接时启动 android 应用程序

android - 安装更新的 App React Native

java - 没有从 Retrofit 获得任何数据

c++ - 递归 3 X 3 幻方

c++ - 在小于 O(N) 的时间内找出点是否在 N 个(可能重叠的)矩形之一内

java - 如何在 Eclipse 中自定义工具栏?