Android NDK區分第一次起機-sqlite3 operation support

南丶煙發表於2015-06-19

在前文部落格:Android——鎖定launch - 原生Browser啟動 -引導provision 以及Android——sqlite3 基本命令操作 中有分析到android 開機真正的啟動apk及其標記位device_provisioned以及android database sqlite3的實際操作。
撰寫不易,轉載需註明出處:http://blog.csdn.net/jscese/article/details/46506709本文來自 【jscese】的部落格!

application層直接呼叫Setting類的靜態類靜態方法即可,native就需要自己新增:

新增支援:

android.mk中新增:

LOCAL_SHARED_LIBRARIES +=libsqlite

copy sqlite3自帶的標頭檔案:external/sqlite/dist/sqlite3.h

check操作:

直接貼實現程式碼:

/*====================db==cmd============================*/

#define PROVISIONED_DB_NAME "/data/data/com.android.providers.settings/databases/settings.db"

#define QUERY_DEVICE_PROVISIONED_CMD "select * from global where name='device_provisioned'"

static int checkdeviceprovisioned() {

    char acvalue[10] = {'\0'};
    sqlite3 * sdb = 0;

    if (sqlite3_open(PROVISIONED_DB_NAME, &sdb) != SQLITE_OK) {
        ERROR("open error! : %s\n", sqlite3_errmsg(sdb));
        goto error;
    }


    if (sqlite3_exec(sdb, QUERY_DEVICE_PROVISIONED_CMD, '''loaddbinfo''', &acvalue,
            NULL) != SQLITE_OK) {
        ERROR("select provisioned error\n");
        goto error;
    }

    if (strcmp(acvalue, "1") != 0) {
        ERROR("device_provisioned =0 :the device is not ready\n");
        goto error;
    }

    sqlite3_close(sdb);
    sdb = 0;

    return 1;

    error: sqlite3_close(sdb);
    sdb = 0;
    return -1;

}

其中loaddbinfo為回撥函式,&acvalue 傳進去的陣列名,作為資料載體。

/*settings.db-global table-format: ID|NAME|VALUE*/
/*CREATE TABLE global (_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT UNIQUE ON CONFLICT REPLACE,value TEXT);*/
/*now get value*/
int loaddbinfo( void * pbuffer, int icolumn, char ** pvalue, char ** pname )
{

    for( int iloop = 0 ; iloop < icolumn; iloop++ )
    {

        if((iloop==icolumn-1)&&(pbuffer != NULL))
          {

            strcpy((char *)pbuffer,pvalue[iloop]); //上面char型別array的,型別轉換
          }
    }
    return 0;
}

簡單方便~

相關文章