2015-07-24 19 views
7

Bir SQLite veritabanını açmak için Qt SQL kullanan bir Qt dinamik lib oluşturduk yüklenen, ama bu hatayı alıyorum değil:Qt C++ kütüphanesi: QSQLITE sürücüsü

QSqlDatabase: QSQLITE driver not loaded 
QSqlDatabase: available drivers: 

DLL Qt Android uygulamasının bir parçası olarak çalışıyordu, ancak Eclipse'de geliştirilen mevcut bir Java uygulamasından JNI aracılığıyla kullanmam gerekiyor.

Bu, sorunu yeniden üreten en kısa örnek koddur.)

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

Ve Qt kütüphane içinde sadece QSqlDatabase :: addDatabase (call: ı Java kitaplığı yüklenemedi ve init() yöntemini çağırmak

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

hata QSQLITE driver not loaded ve Qt yana kütüphane bir Qt uygulamasında çalışıyordu, Qt'nin eksik olduğum bazı başlatma işlemlerini gerçekleştirdiğini varsayalım.

Ancak bu hatayı kaldırmadı, bu yüzden başka bir şey olmalı. Normalde, Qt uygulaması bazı başlatma işlemlerini gerçekleştirmek için QtApplication.java ve QtActivity.java kullanır, bu yüzden yapmıyorum daha fazla bir şey yapıyor olmalılar.

+0

size iyi gelebilir ... bağlantıdan http://stackoverflow.com/questions/15944120/how-to-install-mysql-c-driver-on-windows – AngryDuck

+0

@AngryDuck Teşekkürler ama bulamadım Hata mesajı dışında benim soru ile ilgili bir şey aynıdır. Bu adam Android yerine Windows'da ve kullanım senaryosu tamamen farklı - mevcut bir Eclipse android projesinde bir Qt paylaşımlı kütüphane yüklemiyor. Bağlantıyı yayınlamak için belirli bir nedeniniz var mı, başka bir şey mi eksik? – sashoalm

cevap

4

SQLite eklentisinin nasıl yüklendiğini görmek için Qt kaynaklarına girdim (en az masaüstü için).

İlgili işlev QFactoryLoader::update() idi. bunun içine gider ve o alt tüm dinamik kütüphane yüklemeye çalışır bunlardan herhangi "sqldrivers" adlı bir alt dizini varsa

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

: İçinde ben QCoreApplication::libraryPaths() tüm dizinleri dolaşır fark dizin.

Sonra ben Qt Creator doğrudan ran bir test projesinde kütüphane yolları çıktısı - qDebug() << a.libraryPaths(); ve ben bu yolu gördüm - /data/data/org.qtproject.example.untitled/qt-reserved-files/plugins. Android telefonumdaki bu dizinde, libqsqlite.so isimli tek bir dosya içeren sqldrivers adlı bir alt dizin vardı.

Sonra .java dosyaları kontrol ve gerçekten QtActivity::startApp() kütüphane yolunu ekler:

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

çözeltisi daha sonra telefonda bir yerde bir sqldrivers/libqsqlite.so olmamasını sağlamak olacaktır ve daha sonra ana klasörü eklemek sqldrivers, QCoreApplication::addLibraryPath() kullanarak kütüphane yoluna.

+0

Dostum, hayatımı kurtardın. Aynı problemim vardı ve birkaç gün engellenmiş kaldım. Mesajınız bana çok yardımcı Çok teşekkür ederim !! – suns9

+0

Birkaç günümü de engelledim. Sonunda, bu sorunun ne kadar engelleyici olduğunu düşündüğümde, gönderilmeye değer en az bir kişiye yardım edip etmediğini düşündüm. Neden SO'ya çarpmadan önce birkaç gün bekledin? – sashoalm

+0

Çünkü tekrar tekrar okumaya başladım, sürücü dağıtım bölümünü anlamaya çalışmak için qt doc. Ancak okuma günlerinden sonra durumumun engelini kaldırmadı. Ayrıca, uygulamanızda sqlite3'ü kullanmayı denedim, ancak bu, uygulamanın yerel bölümünde de içe aktarmak için çok zordu – suns9