четверг, 6 ноября 2014 г.

SQLCipher и Qt - часть третья, Android

С SQLCipher под Android все намного проще - свободно распространяются не только исходники, но и собранные бинарные файлы Community Edition. Осваивать кросс-платформенную компиляцию для Android мне не хотелось, поэтому я взял бинарные файлы. К тому же сборку плагина qt-sqlcipher c их использованием делали до меня.

Добавляем в файл qsqlcipher.pro пути к библиотекам скачанной бинарной сборки:

android {
    equals(ANDROID_TARGET_ARCH, x86) {
        LIBS += -L$$PWD/../../../../sqlcipher-for-android-v3.2.0/libs/x86
    }
    equals(ANDROID_TARGET_ARCH, armeabi-v7a) {
        LIBS += -L$$PWD/../../../../sqlcipher-for-android-v3.2.0/libs/armeabi-v7a
    }
}

Добавляем условие для включения нужных библиотек - под Android нет libsqlciper и libcrypto, а используется одна  библиотека из готовой сборки:

!system-sqlite:!contains(LIBS, .*sqlite3.*) {
    CONFIG(release, debug|release):DEFINES *= NDEBUG
    DEFINES += $$SQLITE_DEFINES
    !contains(CONFIG, largefile):DEFINES += SQLITE_DISABLE_LFS
    INCLUDEPATH += $$OUT_PWD/include
    !android {
        LIBS += -L$$OUT_PWD/lib -lsqlcipher -lcrypto
    }
    else {
        LIBS += -L$$OUT_PWD/lib -lsqlcipher_android
    }
    QMAKE_RPATHDIR += $$OUT_PWD/lib
} else {
    LIBS *= $$QT_LFLAGS_SQLITE
    QMAKE_CXXFLAGS *= $$QT_CFLAGS_SQLITE
}

Нужен еще путь к заголовочному файлу sqlite3.h и сам файл. Я его просто взял из сборки для Linux (описанной раньше), INCLUDEPATH остался тот же.

Кроме копирования плагина в проект, использующий этот плагин, нужно добавить библиотеки для компоновки и деплоймента:

android {
    contains(ANDROID_TARGET_ARCH,armeabi-v7a) {
        LIBS += -L$$PWD/armeabi-v7a -lsqlcipher_android
        ANDROID_EXTRA_LIBS = $$PWD/armeabi-v7a/libstlport_shared.so \
            $$PWD/armeabi-v7a/libsqlcipher_android.so
    }
    contains(ANDROID_TARGET_ARCH,x86) {
        LIBS += -L$$PWD/x86 -lsqlcipher_android -lstlport_shared
        ANDROID_EXTRA_LIBS = $$PWD/x86/libstlport_shared.so \
            $$PWD/x86/libsqlcipher_android.so
    }
}

Здесь выяснилась одна интересная особенность - порядок указания библиотек в ANDROID_EXTRA_LIBS имеет значение! Если указать libstlport_shared.so второй, а не первой (как в приведенной выше ссылке), то под Android версий, более старых, чем 4.3 (я проверял на 4.0.3 и 4.2.2) при запуске проекта эта библиотека не находится (could not load library "libstlport_shared.so"), причем эта ошибка воспроизводится под обеими архитектурами. Если же libstlport_shared.so указана первой - все нормально работает под всеми версиями (от 4.0.3 до 4.4.2).

Комментариев нет:

Отправить комментарий