SQLite z Androidem NDK

Czy w jakiś sposób można używać SQLite z C++ na telefonie z Androidem? Nie znalazłem żadnej dokumentacji, jak to możliwe.

Author: Tommy, 2011-04-02

4 answers

Nie jest możliwe korzystanie z wbudowanego SQLite przez NDK (lub nie było to pół roku temu, kiedy to sprawdzałem), do którego można uzyskać dostęp tylko za pomocą Javy. Jednak może być możliwe połączenie w całkowicie oddzielnej kompilacji C++ SQLite.

 12
Author: Jim Blackler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-02 12:22:39

Wystarczy pobrać plik źródłowy SQLite3 z: http://www.sqlite.org/download.html

A następnie dodaj sqlite3.c do zmiennej LOCAL_SRC_FILES w Android.mk.

 49
Author: gabor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-12 23:27:22

Zobacz wiązania SQLite Android http://www.sqlite.org/android/doc/trunk/www/index.wiki który opisuje, jak włączyć sqlite3 dla celów Androida 15 (4.0.3) i większe. Jest skopiowany poniżej.

SQLite Android Bindings

Biblioteka SQLite jest podstawową częścią środowiska Android. Java aplikacje i dostawcy treści uzyskują dostęp do SQLite za pomocą interfejsu w Androidzie.baza danych.przestrzeń nazw sqlite.

Jedną z wad korzystania z Androida wbudowana obsługa SQLite to aplikacja jest zmuszona do korzystania z wersji SQLite, że aktualna wersja Androida przypadkiem wysłać z. Jeśli twój wniosek zdarza się, że wymaga nowszej wersji SQLite lub kompilacji z niestandardowym zainstalowane rozszerzenie lub VFS, masz pecha.

Kod w tym projekcie pozwala aplikacji korzystać z Android NDK aby utworzyć niestandardową wersję SQLite, która zostanie dostarczona wraz z aplikacją przy jednoczesnym kontynuowaniu stosowania standardu Interfejs Java.

Normalne Użycie

Instalacja

Android API poziomy 15 (Android 4.0.3) i większe są obsługiwane. Jeśli targeting API level 16 lub wyższy, Użyj domyślnej gałęzi "trunk" ten projekt. Lub, dla API poziomu 15, użyj gałęzi "API-level-15". Informatyka nie można kierować na poziom API niższy niż 15.

Skopiuj poniższe pliki z tego projektu do odpowiednika lokalizacje w projekcie aplikacji.

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

Po tym, struktury katalogów powinny zawierać te pliki.

Tylko dla poziomu API 15, skopiuj również:

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

Katalog "jni / sqlite /" zawiera kopie sqlite3.h i sqlite3.pliki źródłowe C. Pomiędzy nimi, zawierają kod źródłowy do biblioteki SQLite. W razie potrzeby wymień je na źródło dla konkretnej wersji SQLite wymagane. Jeśli SQLite ma być skompilowane z dowolnymi specjalnymi makrami preprocesorowymi, dodaj je na nie jest to jednak żaden problem.]}

Po dodaniu plików do projektu uruchom polecenie "NDK-build" w katalogu głównym projektu. To kompiluje natywny kod w katalogu jni/ (w tym Niestandardowy SQLite wersji) do bibliotek współdzielonych, które zostaną wdrożone na urządzeniu wraz z aplikacją. Zakładając, że się powiedzie, chyba że zmodyfikujesz źródeł lub plików Makefile wewnątrz struktury katalogów jni/, należy nie trzeba ponownie uruchomić "NDK-build".

Programowanie Aplikacji

Klasy tworzące wbudowany interfejs Android SQLite w "android.baza danych.SQLite " przestrzeń nazw. Interfejs ten zapewnia wszystkich tych samych klas, z wyjątkiem "org.sqlite.baza danych.SQLite " przestrzeń nazw. Oznacza to, że aby zmodyfikować aplikacja do korzystania z niestandardowej wersji SQLite, wszystko, co jest zwykle wymagane jest zastąpienie wszystkich wystąpień "android.baza danych.sqlite" w ramach kod źródłowy z "org.sqlite.baza danych.sqlite"

Na przykład:

import android.database.sqlite.SQLiteDatabase;

Należy zastąpić:

import org.sqlite.database.sqlite.SQLiteDatabase;

Jak również zastąpienie wszystkich zastosowań klas w Androidzie.baza danych.sqlite.* przestrzeń nazw, aplikacja musi również używać następujących dwóch:

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

Zamiast:

android.database.SQLException
android.database.DatabaseErrorHandler

Oprócz zmian przestrzeni nazw, są inne różnice w stosunku do podstawowego interfejsu Androida, który aplikacje muszą być świadome:

SQLiteStatement.simpleQueryForBlobFileDescriptor () API nie jest dostępny. Sekwencja zestawiania "UNICODE" nie jest dostępna. Sekwencja zestawiania "zlokalizowana", która zwykle zmienia się wraz z aktualne ustawienia regionalne systemu, jest zawsze równoważne z wbudowanym SQLite zestawienie binarne.

 4
Author: Thaddeus Albers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-01 23:24:11

Zastrzeżenie: używałem tej metody tylko dla samodzielnych plików wykonywalnych, a nie bibliotek implementujących funkcje JNI. To może działać na. tak lub nie. Ponadto pracuję z niestandardowym urządzeniem z Androidem, a nie telefonem.

Możesz użyć wbudowanego SQLite poprzez NDK, ale jest to bardziej hack niż coś obsługiwanego. Musisz nick sqlite3.h i libsqlite.so z dystrybucji źródłowej Androida i kompilować za ich pomocą. Put sqlite3.h w katalogu źródłowym aplikacji i musisz umieścić .so gdzieś pod katalogiem out / yourapp lub build / platform / android-x / arch-arm / usr / lib, aby zakończyć etap łączenia. Mam go w obu miejscach, ale nie jestem pewien, który jest naprawdę potrzebny.

Skończysz linkowanie do libsqlite.so podałeś, ale binarny będzie działał dobrze za pomocą systemu libsqlite.so na urządzeniu docelowym.

 1
Author: Torp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-02 16:11:20