SQLite con Android NDK

¿Es de alguna manera posible usar SQLite con C ++ en un teléfono Android? No he encontrado ninguna documentación sobre cómo esto podría ser posible.

No es posible usar el SQLite incorporado a través de NDK (o no fue hace seis meses cuando investigué esto), que solo se puede acceder con Java. Sin embargo, es posible vincular en su propia comstackción de SQLite completamente C ++.

Simplemente descargue el archivo fuente de amalgamación SQLite3 desde: http://www.sqlite.org/download.html

Y luego agregue sqlite3.c a su variable Android.mk en Android.mk .

Ver enlaces SQLite Android http://www.sqlite.org/android/doc/trunk/www/index.wiki que describe cómo incluir sqlite3 para Android objectives 15 (4.0.3) y superior. Se copia a continuación.

Enlaces SQLite para Android

La biblioteca SQLite es una parte central del entorno de Android. Las aplicaciones Java y los proveedores de contenido acceden a SQLite utilizando la interfaz en el espacio de nombres android.database.sqlite.

Una desventaja del uso de la compatibilidad incorporada de SQLite de Android es que la aplicación se ve obligada a usar la versión de SQLite con la que se distribuye la versión actual de Android. Si su aplicación requiere una versión más nueva de SQLite, o una versión con una extensión personalizada o VFS instalado, no tiene suerte.

El código en este proyecto permite que una aplicación use el NDK de Android para crear una versión personalizada de SQLite que se enviará con la aplicación mientras continúa utilizando la interfaz Java estándar.

Uso normal

Instalación

Los niveles API de Android 15 (Android 4.0.3) y superiores son compatibles. Si apuntas al nivel de API 16 o superior, utiliza la twig “troncal” predeterminada de este proyecto. O bien, para el nivel 15 de API, use la twig “api-level-15”. No es posible segmentar un nivel de API inferior a 15.

Copie los siguientes archivos de este proyecto en las ubicaciones equivalentes en el proyecto de la aplicación.

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

Después de esto, las estructuras de directorio deben contener estos archivos.

Solo para el nivel API 15, también copie lo siguiente:

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

El directorio “jni / sqlite /” contiene copias de los archivos fuente sqlite3.h y sqlite3.c. Entre ellos, contienen el código fuente de la biblioteca SQLite. Si es necesario, reemplázalos con la fuente para la versión específica de SQLite requerida. Si se va a comstackr SQLite con cualquier macro de preprocesador especial definida, agréguelos al archivo “jni / sqlite / Android.mk” (no a jni / Android.mk).

Una vez que los archivos se hayan agregado al proyecto, ejecute el comando “ndk-build” en el directorio raíz del proyecto. Esto comstack el código nativo en el directorio jni / (incluida la versión SQLite personalizada) a bibliotecas compartidas que se implementarán en el dispositivo junto con la aplicación. Asumiendo que es exitoso, a menos que modifiques las fonts o los archivos make dentro de la estructura de directorio jni /, no deberías necesitar ejecutar “ndk-build” nuevamente.

Progtwigción de aplicaciones

Las clases que componen la interfaz incorporada de SQLite de Android residen en el espacio de nombres “android.database.sqlite”. Esta interfaz proporciona todas las mismas clases, excepto dentro del espacio de nombres “org.sqlite.database.sqlite”. Esto significa que para modificar una aplicación para que use la versión personalizada de SQLite, todo lo que generalmente se requiere es reemplazar todas las instancias “android.database.sqlite” dentro del código fuente con “org.sqlite.database.sqlite”.

Por ejemplo, lo siguiente:

import android.database.sqlite.SQLiteDatabase;

debe ser reemplazado por:

import org.sqlite.database.sqlite.SQLiteDatabase;

Además de reemplazar todos los usos de las clases en el espacio de nombres android.database.sqlite. *, La aplicación también debe asegurarse de usar los dos siguientes:

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

en lugar de:

android.database.SQLException
android.database.DatabaseErrorHandler

Además de los cambios en el espacio de nombres, existen otras diferencias con respecto a la interfaz de stock de Android que las aplicaciones deben conocer:

La API SQLiteStatement.simpleQueryForBlobFileDescriptor () no está disponible. La secuencia de intercalación “UNICODE” no está disponible. La secuencia de intercalación “LOCALIZADA”, que normalmente cambia con la configuración regional actual del sistema, siempre es equivalente a la intercalación BINARY de SQLite.

Descargo de responsabilidad: solo he usado este método para ejecutables independientes, no para bibliotecas que implementan funciones JNI. Puede funcionar para .so o no. Además, estoy trabajando con un dispositivo Android personalizado, no con un teléfono.

Puede usar el SQLite incorporado a través de NDK pero es más un hack que algo compatible. Necesita copiar sqlite3.h y libsqlite.so de una distribución fuente de Android y comstackrlos. Ponga sqlite3.h en el directorio fuente de su aplicación y necesita colocar el .so en algún lugar debajo del directorio out / yourapp o build / platform / android-x / arch-arm / usr / lib para finalizar el paso de vinculación. Lo tengo en ambos lugares, pero no estoy seguro de cuál es realmente necesario.

Finalizará el enlace a libsqlite.so que proporcionó, pero el binario funcionará correctamente utilizando el sistema libsqlite.so en un dispositivo de destino.