web-dev-qa-db-ja.com

SQLite with Android NDK

Android電話でC++でSQLiteを使用することはどういうわけか可能ですか?これがどのように可能であるかについてのドキュメントは見つかりませんでした。

22
Tommy

組み込みのSQLiteをNDK経由で使用することはできません(または、これを調べたときは6か月前ではありませんでした)。これは、Javaでのみアクセスできます。ただし、SQLiteの完全に別個のC++ビルドにリンクすることは可能かもしれません。

12
Jim Blackler

SQLite3融合ソースファイルを次の場所からダウンロードするだけです: http://www.sqlite.org/download.html

次に、sqlite3.cLOCAL_SRC_FILES変数にAndroid.mkを追加します。

49
gabor

Androidターゲット15にsqlite3を含める方法について説明しているSQLite Androidバインディング http://www.sqlite.org/Android/doc/trunk/www/index.wiki を参照してください。 (4.0.3)以上。以下にコピーします。

SQLite Androidバインディング

SQLiteライブラリはAndroid環境のコア部分です。 Javaアプリケーションとコンテンツプロバイダーは、Android.database.sqlite名前空間のインターフェースを使用してSQLiteにアクセスします。

Androidの組み込みSQLiteサポートを使用することの1つの欠点は、アプリケーションが、現在のバージョンのAndroidに付属しているバージョンのSQLiteを使用することを余儀なくされることです。アプリケーションでSQLiteの新しいバージョンが必要な場合、またはカスタム拡張機能やVFSがインストールされたビルドが必要な場合は、運が悪いことになります。

このプロジェクトのコードにより、アプリケーションはAndroid NDKを使用して、標準のJavaインターフェイスを引き続き使用しながら、アプリケーションに付属するカスタムバージョンのSQLiteを構築できます。

通常の使用法

Installation

Android APIレベル15(Android 4.0.3)以降がサポートされています。 APIレベル16以上を対象とする場合は、このプロジェクトのデフォルトの「トランク」ブランチを使用してください。または、APIレベル15の場合は、「api-level-15」ブランチを使用します。 15未満のAPIレベルをターゲットにすることはできません。

次のファイルをこのプロジェクトからアプリケーションプロジェクトの同等の場所にコピーします。

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バージョンを含む)のネイティブコードが、アプリケーションとともにデバイスにデプロイされる共有ライブラリにコンパイルされます。成功した場合は、jni /ディレクトリ構造内のソースまたはmakefileを変更しない限り、「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。*名前空間のクラスのすべての使用を置き換えるだけでなく、アプリケーションは必ず次の2つを使用する必要があります。

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

の代わりに:

Android.database.SQLException
Android.database.DatabaseErrorHandler

名前空間の変更とは別に、アプリケーションが知っておく必要のあるストックAndroidインターフェースとの違いは他にもあります。

SQLiteStatement.simpleQueryForBlobFileDescriptor()APIは使用できません。照合シーケンス「UNICODE」は使用できません。通常はシステムの現在のロケールで変更される照合シーケンス「LOCALIZED」は、SQLiteに組み込まれている照合BINARYと常に同等です。

4
Thaddeus Albers

免責事項:このメソッドはスタンドアロンの実行可能ファイルにのみ使用しており、JNI関数を実装するライブラリには使用していません。 .soでも機能する場合もあります。また、私はカスタムAndroidデバイスではなく電話で作業しています。

NDKを介して組み込みのSQLiteを使用できますが、サポートされているものというよりはハックです。 Androidソースディストリビューションからsqlite3.hとlibsqlite.soにニックを入れ、それらを使用してコンパイルする必要があります。sqlite3.hをアプリケーションのソースディレクトリに置き、.soをどこかに置く必要があります。リンク手順を完了するには、out/yourappディレクトリまたはbuild/platform/Android-x/Arch-arm/usr/libを使用します。両方の場所にありますが、どちらが本当に必要かわかりません。

指定したlibsqlite.soにリンクすることになりますが、ターゲットデバイスでシステムlibsqlite.soを使用すると、バイナリは正常に実行されます。

1
Torp