SQLite с Android NDK

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

Невозможно использовать встроенный 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 или assembly с пользовательским расширением или установленной 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. Этот интерфейс предоставляет все те же classы, за исключением пространства имен org.sqlite.database.sqlite. Это означает, что для изменения приложения для использования пользовательской версии SQLite все, что обычно требуется, это заменить все вхождения «android.database.sqlite» в исходном коде на «org.sqlite.database.sqlite».

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

import android.database.sqlite.SQLiteDatabase;

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

import org.sqlite.database.sqlite.SQLiteDatabase;

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

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

вместо:

android.database.SQLException
android.database.DatabaseErrorHandler

Помимо изменений пространства имен, есть и другие отличия от Android интерфейса 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 на целевом устройстве.

  • Android NDK: получение обратной линии
  • Как скомпилировать статическую библиотеку с помощью Android NDK?
  • Добавление предварительно созданных файлов .so в проект с помощью плагина Android Gradle 0.7.3
  • Запуск автономной библиотеки на Android L. Ошибка: поддерживаются только независимые исполняемые файлы (PIE)
  • Ошибки индексатора Eclipse при использовании STL с Android NDK
  • Вызов java-метода из c ++ в Android
  • Как создать исполняемый файл для оболочки Android
  • System.loadLibrary (...) не смог найти родную библиотеку в моем случае
  • Android NDK: нет правила, чтобы сделать цель
  • Использование Android Studio с Vuforia
  • Android: как программно найти имя версии Android?
  • Interesting Posts

    Какова стоимость многих TIME_WAIT на стороне сервера?

    Я использую Chrome и Chrome Sync; Имеет ли Google доступ к моим паролям?

    Принудительная установка для вывода только монофонического звука

    Загружается событие AngularJs для вызова после содержимого

    Можно ли фильтровать адреса в поле CC, но не в поле TO?

    В чем основное отличие между запросами PATCH и PUT?

    Есть ли способ закрыть StreamWriter без закрытия BaseStream?

    Инициализация свойства списка без «нового списка» вызывает исключение NullReferenceException

    Резервное копирование Windows 7 – несколько изображений системы VHD на выделенном диске

    Что такое символ обратной косой черты (\\)?

    Что такое SOA «в простом английском»?

    Весенняя загрузка с помощью AngularJS html5Mode

    Совместное использование интернет-соединений с беспроводной хостинговой сетью (WHN) не предоставляет DNS-сервер для клиентов WHN

    Почему в нашем проекте требуются интерфейсные слои / абстрактные classы?

    Android: как заголовок центра в ToolBar

    Давайте будем гением компьютера.