使用NDK执行sqlite3查询期间的致命信号11(SIGSEGV)

时间:2017-02-14 10:28:29

标签: android sqlite android-ndk

我在SQLite中有一个包含大约1600行的表格,每行包含HTML页面以显示在WebView中。我必须实现这样的搜索,搜索时应忽略HTML个标记。为此,我导入了sqlite3库并创建了我自己的用户定义函数strip_text,它使用regex忽略了标记。

static void strip_text(sqlite3_context *context, int argc, sqlite3_value **argv) {
    if(argc == 1) {
        //__android_log_print(ANDROID_LOG_VERBOSE, "TAG", "inside strip_text");
        char *result = (char *) sqlite3_value_text(argv[0]);
        std::string text(result);
        std::regex my_regex("REGEX");

        if (!text.empty()) {
            text = std::regex_replace(text, my_regex, "");
            sqlite3_result_text(context, text.c_str(), -1, SQLITE_TRANSIENT);
            return;
        }

    }
    sqlite3_result_null(context);
}

我的查询功能如下。

std::list<int> get_page_list(std:: string q) {
    std::string query = "SELECT page_no FROM bahar_e_shariat WHERE LIKE('%" + q + "%', strip_text(page_text))=1";
    __android_log_print(ANDROID_LOG_VERBOSE, "TAG", "%s", query.c_str());


    std::list<int> pages_list;

    sqlite3 *db;
    //Open database
    __android_log_print(ANDROID_LOG_VERBOSE, "TAG", "Opening database");
    int rc =     sqlite3_open("/data/data/com.dawateislami.bahareshariat/databases/Books.db", &db);
    //It'll be good to check 'rc' for error(s).


    rc = sqlite3_create_function(db, "strip_text", 1, SQLITE_ANY, NULL, &strip_text, NULL, NULL);

    sqlite3_stmt * stmt;
    rc = sqlite3_prepare_v2(db, query.c_str(), -1, &stmt, NULL);

    while(1) {
        int s = sqlite3_step(stmt);
        if(s == SQLITE_ROW) {
        pages_list.push_front(sqlite3_column_int(stmt, 0));
        __android_log_print(ANDROID_LOG_VERBOSE, "TAG", "Found in %d", sqlite3_column_int(stmt, 0));
        } else if(s == SQLITE_DONE) break;
    }

    sqlite3_finalize(stmt);
    sqlite3_close(db);
    return pages_list;
}

问题

现在的问题是它开始搜索并在搜索大约8到9条记录后,应用程序崩溃并出现错误

A/libc: Fatal signal 11 (SIGSEGV), code 2, fault addr 0x7f84630ff0 in tid 28988 (Thread-6559)

参考一些答案,我添加了android:hardwareAccelerated="false",但它没有用。

我无法弄清楚问题。谁能告诉我这里发生了什么?

更新

当我在Infininx Note 3 Pro上进行测试时,它无法正常工作,但它正在使用三星Galaxy S4。

0 个答案:

没有答案