SQLite с Android NDK

Как можно использовать SQLite с С++ на телефоне Android? Я не нашел никакой документации о том, как это возможно.

Ответ 1

Невозможно использовать встроенный SQLite через NDK (или это было не шесть месяцев назад, когда я изучал это), к которому можно получить доступ только с помощью Java. Однако может быть возможно связать ваш собственный полностью отдельный С++-сборник SQLite.

Ответ 2

Просто скачайте исходный файл слияния SQLite3 с: http://www.sqlite.org/download.html

И затем добавьте sqlite3.c к вашей переменной LOCAL_SRC_FILES в Android.mk.

Ответ 3

Смотрите привязку Androidite Android http://www.sqlite.org/android/doc/trunk/www/index.wiki, в которой описывается, как включить sqlite3 для целей Android 15 (4.0.3) и выше. Он скопирован ниже.

SQLite Android Bindings

Библиотека SQLite является основной частью среды Android. Ява приложения и контент-провайдеры получают доступ к SQLite с использованием интерфейса в пространстве имен android.database.sqlite.

Одним из недостатков использования встроенной поддержки SQLite для Android является то, что приложение вынуждено использовать версию SQLite, чтобы с текущей версией Android. Если ваша заявка бывает, требуется более новая версия SQLite или сборка с пользовательским расширение или VFS, вам не повезло.

Код в этом проекте позволяет приложению использовать Android NDK создать пользовательскую версию SQLite для отправки с приложением в то же время продолжая использовать стандартный интерфейс Java.

Нормальное использование

Установка

Поддерживаются уровни API Android 15 (Android 4.0.3) и выше. Если нацеленный на API уровня 16 или выше, используйте стандартную ветвь "trunk" этот проект. Или, для уровня API 15, используйте ветвь "api-level-15". Это невозможно настроить уровень API ниже 15.

Скопируйте следующие файлы из этого проекта в эквивалент местоположения в проекте приложения.

jni/Android.mk
jni/Application.mk
jni/sqlite/*                (copy contents of directory recursively)
src/org/sqlite/database/*   (copy contents of directory recursively) 

После этого структуры каталогов должны содержать эти файлы.

Только для уровня API 15 также скопируйте следующее:

src/org/sqlite/os/*         (copy contents of directory recursively) 

Каталог "jni/sqlite/" содержит копии sqlite3.h и исходные файлы sqlite3.c. Между ними они содержат исходный код для библиотеки SQLite. При необходимости замените их на источник для конкретной версии SQLite. Если SQLite должен быть скомпилированные с любыми специальными макросами предварительного процессора, добавьте их в файл jni/sqlite/Android.mk(не jni/Android.mk).

Как только файлы были добавлены в проект, запустите команду "ndk-build" в корневой директории проекта. Это компилирует собственный код в каталоге jni/(включая пользовательский SQLite версии) для разделяемых библиотек, которые будут развернуты на устройстве вдоль с приложением. Предполагая, что это успешно, если вы не измените источников или make файлов в структуре каталога jni/, вы должны не нужно снова запускать "ndk-build".

Программирование приложений

Классы, составляющие встроенный Android-интерфейс SQLite, находятся в пространстве имен android.database.sqlite. Этот интерфейс обеспечивает все те же классы, кроме Пространство имен org.sqlite.database.sqlite. Это означает, что для изменения приложение для использования пользовательской версии SQLite, все, что обычно требуется заменить все вхождения "android.database.sqlite" в исходном коде с "org.sqlite.database.sqlite".

Например, следующее:

import android.database.sqlite.SQLiteDatabase;

следует заменить на:

import org.sqlite.database.sqlite.SQLiteDatabase;

Также, как и замена всех видов использования классов в файле android.database.sqlite. * пространство имен, приложение также должно обязательно использовать следующие два:

org.sqlite.database.SQLException
  org.sqlite.database.DatabaseErrorHandler

вместо:

android.database.SQLException
  android.database.DatabaseErrorHandler

Помимо изменений пространства имен, есть другие отличия от Android интерфейса Android, который приложения должны быть осведомлены о:

API SQLiteStatement.simpleQueryForBlobFileDescriptor() не является доступный. Последовательность сортировки "UNICODE" недоступна. Последовательность сортировки "LOCALIZED", которая обычно изменяется с помощью system current locale, всегда эквивалентна SQLite, встроенному в сопоставление BINARY.

Ответ 4

Отказ от ответственности: я использовал этот метод только для автономных исполняемых файлов, а не для библиотек, реализующих функции JNI. Он может работать на .so или нет. Кроме того, я работаю с пользовательским устройством Android, а не с телефоном.

Вы можете использовать встроенный SQLite через NDK, но это скорее взломать, чем что-то поддерживаемое. Вам нужно вывести nick sqlite3.h и libsqlite.so из дистрибутива источника Android и скомпилировать их. Поместите sqlite3.h в исходный каталог приложения, и вам нужно поместить .so где-нибудь под каталог out/yourapp или build/platform/android-x/arch-arm/usr/lib для завершения этапа привязки. У меня есть это в обоих местах, но я не уверен, какой из них действительно нужен.

В итоге вы свяжетесь с libsqlite.so, который вы предоставили, но двоичный файл будет работать нормально, используя систему libsqlite.so на целевом устройстве.