2015-07-24 15 views
7

Tôi đã tạo một Qt lib động có sử dụng Qt SQL để mở một cơ sở dữ liệu SQLite, nhưng tôi nhận được lỗi này:Qt C++ thư viện trong Android Eclipse dự án: tài xế QSQLITE không nạp

QSqlDatabase: QSQLITE driver not loaded 
QSqlDatabase: available drivers: 

Các DLL đã hoạt động tốt như một phần của ứng dụng Android Qt, tuy nhiên tôi cần sử dụng nó thông qua JNI từ một ứng dụng Java hiện có được phát triển trong Eclipse.

Đây là mã ví dụ ngắn nhất tái tạo sự cố. Tôi tải thư viện từ Java và gọi phương thức init() của nó:

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

Và bên trong thư viện Qt tôi chỉ cần gọi 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"); 
} 

Kể từ khi lỗi là QSQLITE driver not loaded, và Qt thư viện đã được làm việc bên trong một ứng dụng Qt, tôi giả định rằng Qt đang làm một số khởi tạo mà tôi đang thiếu.

Nhưng điều này đã không xóa lỗi, do đó, nó phải là một cái gì đó khác. Thông thường, ứng dụng Qt sẽ sử dụng QtApplication.javaQtActivity.java để thực hiện một số khởi tạo, do đó, chúng phải làm điều gì đó ở đó mà tôi không làm.

+0

có thể giúp bạn ... http://stackoverflow.com/questions/15944120/how-to-install-mysql-c-driver-on-windows – AngryDuck

+0

@AngryDuck Cảm ơn bạn đã liên kết nhưng tôi không thể tìm thấy bất cứ điều gì liên quan đến câu hỏi của tôi ngoại trừ thông báo lỗi là như nhau. Anh chàng này là trên Windows thay vì Android, và kịch bản sử dụng của anh ta hoàn toàn khác - anh ta không tải một thư viện được chia sẻ Qt trong một dự án android Eclipse hiện có. Bạn có một số lý do cụ thể để đăng liên kết, tức là tôi có thiếu gì đó không? – sashoalm

Trả lời

4

Cuối cùng, tôi đã tham gia vào các nguồn Qt để xem cách plugin SQLITE được tải (ít nhất là cho máy tính để bàn).

Chức năng liên quan là QFactoryLoader::update(). Trong đó tôi nhận thấy rằng nó lặp tất cả các thư mục trong QCoreApplication::libraryPaths():

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

Nếu ai trong số họ có một thư mục con có tên là "sqldrivers", nó đi bên trong nó và cố gắng để tải tất cả các thư viện động trong tiểu mà danh mục.

Tôi sau đó in ra đường dẫn thư viện trong một dự án thử nghiệm tôi chạy trực tiếp từ Qt Creator - qDebug() << a.libraryPaths(); và tôi thấy đường dẫn này - /data/data/org.qtproject.example.untitled/qt-reserved-files/plugins. Trong thư mục này trên điện thoại Android của tôi có một thư mục con có tên là sqldrivers, chứa một tệp duy nhất - libqsqlite.so.

Sau đó tôi đã kiểm tra các file java, và thực sự QtActivity::startApp() thêm đường dẫn thư viện:

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

Các giải pháp sau đó sẽ là để đảm bảo rằng có một sqldrivers/libqsqlite.so nơi nào đó trên điện thoại, và sau đó thêm các thư mục mẹ của sqldrivers vào đường dẫn thư viện bằng cách sử dụng QCoreApplication::addLibraryPath().

+0

Anh bạn đã cứu mạng tôi. Tôi đã có cùng một vấn đề và ở lại bị chặn nhiều ngày. Bài đăng của bạn giúp tôi rất nhiều Cảm ơn bạn rất nhiều !!!! – suns9

+0

Tôi cũng bị chặn nhiều ngày. Cuối cùng, tôi nghĩ nếu điều này giúp ít nhất một người đáng để đăng, xem xét vấn đề này là bao nhiêu. Tại sao bạn đợi vài ngày trước khi nhấn SO? – sashoalm

+0

Bởi vì tôi đã bắt đầu đọc lại một lần nữa tài liệu qt để thử hiểu phần triển khai trình điều khiển. Nhưng sau nhiều ngày đọc sách này đã không bỏ qua tình hình của tôi. Tôi cũng đã cố gắng sử dụng sqlite3 trong ứng dụng của mình nhưng điều này cũng quá khó để nhập vào phần gốc của ứng dụng của tôi – suns9

Các vấn đề liên quan