2015-07-24 19 views
7

Ho creato un lib dinamica Qt che utilizza Qt SQL per aprire un database SQLite, ma sto ottenendo questo errore:Qt C++ in Eclipse Android progetto: conducente QSQLITE non caricato

QSqlDatabase: QSQLITE driver not loaded 
QSqlDatabase: available drivers: 

La DLL stava funzionando bene come parte di un'applicazione Android Qt, tuttavia ho bisogno di usarlo attraverso JNI da un'applicazione Java esistente sviluppata in Eclipse.

Questo è il codice di esempio più breve che riproduce il problema. Ho caricare la libreria da Java e chiamare il metodo init():

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

E dentro la libreria Qt mi basta chiamare 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"); 
} 

Dal momento che l'errore è QSQLITE driver not loaded, e il Qt la libreria stava lavorando all'interno di un'applicazione Qt, suppongo che Qt stia facendo un'inizializzazione che mi manca.

Ma questo non ha rimosso l'errore, quindi deve essere qualcos'altro. Normalmente, l'applicazione Qt userà QtApplication.java e QtActivity.java per eseguire alcune inizializzazioni, quindi devono fare qualcosa di più là che non sto facendo.

+0

potrebbe aiutarti ... http://stackoverflow.com/questions/15944120/how-to-install-mysql-c-driver-on-windows – AngryDuck

+0

@AngryDuck Grazie per il link, ma non ho trovato tutto ciò che è pertinente alla mia domanda eccetto il messaggio di errore è lo stesso. Questo ragazzo è su Windows invece che su Android, e il suo scenario d'uso è completamente diverso - non carica una libreria condivisa Qt in un progetto Android Eclipse esistente. Hai qualche motivo specifico per pubblicare il link, cioè mi manca qualcosa? – sashoalm

risposta

4

Eventualmente sono passato ai sorgenti Qt per vedere come viene caricato il plugin SQLITE (almeno per la versione desktop).

La funzione rilevante era QFactoryLoader::update(). In esso ho notato che itera tutte le directory in QCoreApplication::libraryPaths():

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

Se uno di loro ha una sotto-directory chiamata "sqldrivers", si va dentro e cerca di caricare tutte le librerie dinamiche in quella sub- directory.

Ho quindi stampato i percorsi della libreria in un progetto di test che ho eseguito direttamente da Qt Creator - qDebug() << a.libraryPaths(); e ho visto questo percorso - /data/data/org.qtproject.example.untitled/qt-reserved-files/plugins. In questa directory sul mio telefono Android c'era una sottodirectory denominata sqldrivers, che conteneva un singolo file - libqsqlite.so.

Poi ho controllato i file .java, e in effetti QtActivity::startApp() aggiunge il percorso di libreria:

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 soluzione quindi sarebbe quello di garantire che vi sia un sqldrivers/libqsqlite.so da qualche parte sul telefono, e quindi aggiungere la cartella principale di sqldrivers al percorso della libreria utilizzando QCoreApplication::addLibraryPath().

+0

Amico mi hai salvato la vita. Ho avuto lo stesso problema e sono rimasto bloccato diversi giorni. Il tuo post mi aiuta molto Grazie mille !!!! – suns9

+0

Sono rimasto bloccato anche diversi giorni. Alla fine ho pensato che se questo aiuta almeno una persona vale la pena postare, considerando quanto di questo blocco fosse un blocco. Perché hai aspettato diversi giorni prima di colpire SO? – sashoalm

+0

Perché ho iniziato a leggere ancora e ancora il documento qt per provare a capire la parte di implementazione del driver. Ma dopo giorni di letture questo non ha sbloccato la mia situazione. Ho anche provato ad usare sqlite3 nella mia app, ma anche questo era troppo difficile da importare nella parte nativa della mia app – suns9

Problemi correlati