Как использовать Android NDK SQLite3 расширение json1 - PullRequest
0 голосов
/ 04 декабря 2018

Извините, что сначала мне не хватает английского.

Я скомпилировал его, потому что мне нужно было расширение 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 ]

0 голосов
/ 06 декабря 2018

Я узнал, как вы можете использовать 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";
0 голосов
/ 04 декабря 2018

Вам нужен libsqlite3, а не исполняемый файл, поэтому вам не нужно компилировать shell.c .Существует проект GitHub , который включает Android.mk , который создает такую ​​библиотеку для вас, вы, вероятно, найдете статическую библиотеку , более простую в использовании в вашем проекте JNI.

...