Как использовать Android NDK SQLite3 расширение json1
Мне жаль, что мне не хватает английского в первую очередь.
Я скомпилировал его, потому что мне нужно было расширение SQLite3 JSON1 в Android NDK
gcc -Os -I. -DSQLITE_THREADSAFE=0 -DSQLITE_ENABLE_JSON1 \
-DSQLITE_DEFAULT_MEMSTATUS=0 -DSQLITE_USE_ALLOCA \
-DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 -DSQLITE_LIKE_DOESNT_MATCH_BLOBS \
-DSQLITE_MAX_EXPR_DEPTH=0 -DSQLITE_OMIT_DECLTYPE \
-DSQLITE_OMIT_PROGRESS_CALLBACK -DSQLITE_OMIT_SHARED_CACHE \
-DSQLITE_OMIT_DEPRECATED -DHAVE_USLEEP -DHAVE_READLINE \
shell.c sqlite3.c -ldl -lreadline -lncurses -o sqlite3
и результатом компиляции является sqlite3.exe
Как использовать этот файл для Anroid NDK или я могу найти другой способ?
Код, который я хочу использовать
JNIEXPORT void JNICALL
Java_com_test_ndkapp_MainActivity_SQLiteCPP(
JNIEnv *jenv,
jobject self,
jstring database_path
){
sqlite3 *db;
sqlite3_stmt *stmt;
// jstring to const char *
const char *database = jenv->GetStringUTFChars(database_path, 0);
char *zErrMsg = 0;
int rc;
//SQL ERROR:no such function: json
const char * create_sql = "create table user(name, phone)";
const char * insert_sql = "insert into user (name, phone) values(\"oz\", json('{\"cell\":\"+491765\", \"home\":\"+498973\"}'))";
const char * select_sql = "select json_extract(user.phone, '$.cell') from user";
if (sqlite3_open_v2(database, &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE , NULL) == SQLITE_OK) {
LOGE("database open!!");
rc = sqlite3_exec(db, create_sql, NULL, NULL, &zErrMsg);
if( rc != SQLITE_OK ) {
LOGE("SQL ERROR:%s", zErrMsg);
sqlite3_free(zErrMsg);
} else {
LOGE("CREATE Operation done successfully\n");
}
rc = sqlite3_exec(db, insert_sql, NULL, NULL, &zErrMsg);
if( rc != SQLITE_OK ) {
LOGE("SQL ERROR:%s", zErrMsg);
sqlite3_free(zErrMsg);
} else {
LOGE("INSERT Operation done successfully\n");
}
rc = sqlite3_prepare_v2(db, select_sql, -1, &stmt, NULL);
if( rc != SQLITE_OK ) {
LOGE("SQL ERROR:%s", zErrMsg);
sqlite3_free(zErrMsg);
} else {
while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {
const unsigned char * aaa = sqlite3_column_text (stmt, 0);
const unsigned char * bbb = sqlite3_column_text (stmt, 1);
LOGE("%s, %s", aaa, bbb);
}
if (rc != SQLITE_DONE) {
LOGE("error: %s", sqlite3_errmsg(db));
}
LOGE("SELECT Operation done successfully\n");
sqlite3_finalize(stmt);
}
} else {
LOGE("database can not open!! : %s", sqlite3_errmsg(db));
}
sqlite3_close(db);
}
Я пробовал это
просто поместите.c файл и.h файл в папку cpp → SQLite3 работает, но нет такой функции json
2 ответа
Вам нужен libsqlite3, а не исполняемый файл, поэтому вам не нужно компилировать shell.c. Есть проект GitHub, который включает в себя Android.mk, который создает такую библиотеку для вас, вам, вероятно, будет проще использовать статическую библиотеку в вашем проекте JNI.
Я узнал, как вы можете использовать JSON1, добавив флаг в среду, которая использует CMakeLists, если вы разрабатываете NDK в AndroidStudio.
Сначала скачайте sqlite-amalgamation-(нужную вам версию).zip
и распаковать.zip файл
https://www.sqlite.org/download.html (ссылка на скачивание)
Поместите 4 файла, которые вы получили, по нужному пути в каталог cpp проекта.
Путь к файлу, который я использовал
Затем добавьте код в CMakeList.txt.
add_library( # Sets the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/cpp/native-lib.cpp
src/main/cpp/sqlite/shell.c
src/main/cpp/sqlite/sqlite3.c
src/main/cpp/sqlite/sqlite3.h
src/main/cpp/sqlite/sqlite3ext.h
)
....
add_definitions( -DSQLITE_ENABLE_JSON1 )
Теперь вы можете использовать функции JSON1 SQLite3.
const char * create_sql = "create table user(name, phone)";
const char * insert_sql = "insert into user (name, phone) values(\"oz\", json('{\"cell\":\"+491765\", \"home\":\"+498973\"}'))";
const char * select_sql = "select json_extract(user.phone, '$.cell') from user";