SQLite con Android NDK

¿Es de alguna manera posible utilizar SQLite con C ++ en un teléfono Android? No he encontrado ninguna documentación acerca de 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 miré en esto), que sólo se puede acceder con Java. Sin embargo, puede ser posible vincular en su propia construcción C ++ completamente independiente de SQLite.

Basta con descargar el archivo fuente de la amalgamación SQLite3 desde: http://www.sqlite.org/download.html

A continuación, agrega sqlite3.c a tu variable Android.mk en Android.mk .

Consulte SQLite Android Bindings http://www.sqlite.org/android/doc/trunk/www/index.wiki que describe cómo incluir sqlite3 para los objetivos de Android 15 (4.0.3) y mayores. Está copiado abajo.

Fijaciones Android de SQLite

La biblioteca SQLite es una parte esencial 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 de las desventajas del uso de la compatibilidad con SQLite incorporada de Android es que la aplicación se ve obligada a usar la versión de SQLite que la versión actual de Android pasó a enviarse. Si su aplicación requiere una versión más reciente de SQLite, o una compilación con una extensión personalizada o VFS instalado, no tiene suerte.

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

Uso normal

Instalación

Se admiten los niveles API de Android 15 (Android 4.0.3) y mayores. Si apunta al nivel API 16 o superior, utilice la rama "tronco" predeterminada de este proyecto. O bien, para el nivel API 15, utilice la rama "api-level-15". No es posible segmentar un nivel de API inferior a 15.

Copie los archivos siguientes de este proyecto en las ubicaciones equivalentes en el proyecto de 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.

Para API sólo 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, sustitúyalos por el origen de la versión específica de SQLite requerida. Si se va a compilar SQLite con cualquier macros especiales de preprocesador definidas, agréguelas al archivo "jni / sqlite / Android.mk" (no jni / Android.mk).

Una vez que los archivos se han agregado al proyecto, ejecute el comando "ndk-build" en el directorio raíz del proyecto. Esto compila el código nativo en el directorio jni / (incluyendo la versión personalizada de SQLite) a bibliotecas compartidas que se implementarán en el dispositivo junto con la aplicación. Suponiendo que tenga éxito, a menos que modifique las fuentes o makefiles dentro de la estructura del directorio jni /, no debería necesitar ejecutar nuevamente "ndk-build".

Programación de aplicaciones

Las clases que componen la interfaz integrada de Android SQLite residen en el espacio de nombres "android.database.sqlite". Esta interfaz proporciona todas las mismas clases, excepto en el espacio de nombres "org.sqlite.database.sqlite". Esto significa que para modificar una aplicación para usar la versión personalizada de SQLite, todo lo que normalmente se requiere es reemplazar todas las ocurrencias "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 las dos siguientes:

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

en lugar de:

android.database.SQLException
android.database.DatabaseErrorHandler

Aparte de los cambios de espacio de nombres, hay otras diferencias de la interfaz de Android de acciones que las aplicaciones deben tener en cuenta:

La API de 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 compilación incorporada de SQLite BINARY.

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

Puede utilizar el construido en SQLite a través de NDK, pero es más de un hack que algo soportado. Necesitas nick sqlite3.h y libsqlite.so desde una distribución de origen android y compilarlos. Coloca sqlite3.h en tu directorio de origen de aplicaciones y necesitas poner el .so en algún lugar bajo el directorio out / yourapp o build / platform / android-x / arch-arm / usr / lib para que el paso de enlace termine. Lo tengo en ambos lugares, pero no estoy seguro de cuál es realmente necesario.

Usted terminará ligando al libsqlite.so que usted proporcionó pero el binario funcionará muy bien usando el libsqlite.so del sistema en un dispositivo de la blanco.

  • Integración de jpct-ae con el motor Vuforia de Qualcomm en android
  • La aplicación se bloquea al cambiar de actividad de cocos2d-x a otra actividad en Android
  • Llame a un método java estático de otro paquete de código nativo
  • Error durante la compilación de la muestra de jni de android: inválido -march = opción: `armv5te '
  • Invocación de funciones JNI en el nombre del paquete de Android que contiene subrayado
  • Tabla de referencia local de JNI de Android Expand
  • Vinculación de bibliotecas de terceros (libs.a) con NDK
  • Android NDK / JNI: Creación de una biblioteca compartida que depende de otras bibliotecas compartidas
  • Extraño: no se puede cambiar el valor de Integer en jni
  • Pasar un objeto Java a C ++ a través de JNI y luego volver a Java, a través de void *
  • ¿Cómo especificar matriz de clase en el parámetro GetMethodID método de firma?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.