SQLite с Android NDK

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

Solutions Collecting From Web of "SQLite с Android NDK"

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

Просто загрузите исходный файл ассемблирования SQLite3 с: http://www.sqlite.org/download.html

А затем добавьте sqlite3.c в свою LOCAL_SRC_FILES переменную в Android.mk .

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

Связанные темы

Библиотека SQLite является основной частью среды Android. Приложения Java и поставщики контента обращаются к 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 / directory, вам больше не нужно будет запускать «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-интерфейса на складе, о которых должны знать приложения:

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

Отказ от ответственности: я использовал этот метод только для автономных исполняемых файлов, а не для библиотек, реализующих функции 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 на целевом устройстве.