Biblioteca Qt C ++ en Android Proyecto Eclipse: controlador QSQLITE no cargado

He creado una lib Qt dinámica que utiliza Qt SQL para abrir una base de datos SQLite, pero estoy recibiendo este error:

QSqlDatabase: QSQLITE driver not loaded QSqlDatabase: available drivers: 

El DLL estaba funcionando bien como parte de una aplicación Qt Android, sin embargo necesito usarlo a través de JNI desde una aplicación Java existente desarrollada en Eclipse.

Este es el código de ejemplo más corto que reproduce el problema. Cargo la biblioteca de Java y llamo su método de init() :

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

Y dentro de la biblioteca de Qt acabo de llamar a 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"); } 

Dado que el error es QSQLITE driver not loaded , y la biblioteca Qt estaba trabajando dentro de una aplicación Qt, supongo que Qt está haciendo alguna inicialización que me falta.

Pero esto no quita el error, así que debe ser algo más. Normalmente, la aplicación Qt utilizará QtApplication.java y QtActivity.java para realizar alguna inicialización, por lo que deben estar haciendo algo más allí que no estoy haciendo.

Eventualmente me puse en las fuentes Qt para ver cómo se carga el complemento SQLITE (por lo menos para el escritorio).

La función relevante fue QFactoryLoader :: update () . En él me di cuenta de que itera todos los directorios en QCoreApplication::libraryPaths() :

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

Si alguno de ellos tiene un subdirectorio llamado "sqldrivers", va dentro de él e intenta cargar todas las bibliotecas dinámicas en ese subdirectorio.

A continuación, qDebug() << a.libraryPaths(); los caminos de la biblioteca en un proyecto de prueba que corría directamente desde Qt Creator – qDebug() << a.libraryPaths(); , Y vi esta ruta – /data/data/org.qtproject.example.untitled/qt-reserved-files/plugins . En este directorio en mi teléfono android había un subdirectorio llamado sqldrivers , que contenía un solo archivo – libqsqlite.so .

Entonces comprobé los archivos de .java, y de hecho QtActivity::startApp() agrega la trayectoria de la biblioteca:

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

La solución entonces sería asegurarse de que hay un sqldrivers/libqsqlite.so algún lugar del teléfono, y luego agregar la carpeta primaria de sqldrivers a la ruta de la biblioteca usando QCoreApplication::addLibraryPath() .

  • Cómo obtener NFC trabajando en Android con Qt 5.6
  • Ejecutar archivo java en qt
  • Qt 5.2 y Android Error
  • No se puede construir Android APK en Qt Creator
  • Qt Android: ¿Cómo mostrar el diálogo de archivo nativo?
  • Quiero construir una aplicación de videojuegos para android y ios, pero estoy preocupado por dónde empezar
  • ¿Qué aplicaciones de Google Play se crean utilizando Qt?
  • En Qt / QML, cómo cargar diferentes imágenes para diferentes densidades de dispositivos (Android)
  • QPushButton ha duplicado texto después de la actualización Qt
  • QNetworkAccessManager - primero GET muy lento
  • ¿Cómo evito que un dispositivo Android se vaya a dormir desde la aplicación Qt
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.