SQLite с Android NDK - PullRequest
       0

SQLite с Android NDK

22 голосов
/ 02 апреля 2011

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

Ответы [ 4 ]

48 голосов
/ 13 июля 2011

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

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

12 голосов
/ 02 апреля 2011

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

4 голосов
/ 02 августа 2014

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

Привязки SQLite для Android

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

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

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

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

Установка

Уровни API Android 15 (Android 4.0.3) и выше поддерживаются.Если выбран целевой уровень API 16 или выше, используйте ветвь по умолчанию «ствол» этого проекта.Или, для уровня 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, о которых приложения должны знать:

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

1 голос
/ 02 апреля 2011

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

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

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

...