一、aos系统源码下mmm编译
Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= sqlitedemo.c
LOCAL_SHARED_LIBRARIES := \
libsqlite
LOCAL_MODULE:= sqlitedemo
LOCAL_MODULE_PATH := $(TARGET_OUT_EXECUTABLES)
LOCAL_MODULE_TAGS := eng
include $(BUILD_EXECUTABLE)
sqlitedemo.c(下同)
#include <stdio.h>
#include <stdlib.h> //exit等函数的声明
#include "sqlite3.h"
int displaycb(void *para,int n_column,char **column_value,char **column_name);
int inquire_Usecb(sqlite3 *db);
int inquire_nocb(sqlite3 *db);
int createTable(sqlite3 *db);
int insertRecord(sqlite3 *db);
int deleteRecord(sqlite3 *db);
//回调函数格式
/*
int sqlite_callback(
void* pvoid, //由 sqlite3_exec() 的第四个参数传递而来
int argc, //表的列数
char** argv, //指向查询结果的指针数组, 可以由 sqlite3_column_text() 得到
char** col //指向表头名的指针数组, 可以由 sqlite3_column_name() 得到
);
*/
//回调函数 每一条记录执行一次
int displaycb(void *para,int n_column,char **column_value,char **column_name)
{
int i = 0;
printf("Total column is %d\n",n_column);
for(i = 0;i<n_column;i++){
printf("字段名: %s---->字段值:%s\n",column_name[i],column_value[i]);
}
printf("==========================\n");
return 0;
}
//使用回调函数的查询
int inquire_Usecb(sqlite3 *db)
{
char *sql;
char *zErrMsg;
sql = "select * from 'SensorData';";
if(SQLITE_OK != sqlite3_exec(db,sql,displaycb,NULL,&zErrMsg)){
printf("operate failed: %s\n",zErrMsg);
}
return 0;
}
//不使用回调函数的查询
int inquire_nocb(sqlite3 *db)
{
int nrow = 0,ncolumn = 0;
char **azResult=0;
int i = 0;
char *sql;
char *zErrMsg;
sql = "SELECT * FROM SensorData";
if(SQLITE_OK != sqlite3_get_table(db,sql,&azResult,&nrow,&ncolumn,&zErrMsg)){
printf("operate failed: %s\n",zErrMsg);
}
printf("row:%d column = %d\n",nrow,ncolumn);
printf("The result of querying is :\n");
for ( i = 0;i < ( nrow + 1) * ncolumn; i++)
printf("azResult[%d] = %s\n",i,azResult[i]);
sqlite3_free_table(azResult);
return 0;
}
//创建表函数
int createTable(sqlite3 *db)
{
char *zErrMsg = 0;
char *sql = "CREATE TABLE SensorData(ID INTEGER PRIMARY KEY,SensorID INTEGER,SiteNum INTERER,Time VARCHAR(12),SensorParameter REAL);";
if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)){
printf("operate failed: %s\n",zErrMsg);
}
return 0;
}
//插入数据函数
int insertRecord(sqlite3 *db)
{
char *sql;
char *zErrMsg;
sql = "INSERT INTO 'SensorData' VALUES(NULL,101,261,'20100314',18.9);";
if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)){
printf("operate failed: %s\n",zErrMsg);
}
sql = "INSERT INTO 'SensorData' VALUES(NULL,369,281,'20100616',113);";
if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)){
printf("operate failed: %s\n",zErrMsg);
}
sql = "INSERT INTO 'SensorData' VALUES(NULL,667,290,'20110315',27);";
if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)){
printf("operate failed: %s\n",zErrMsg);
}
sql = "INSERT INTO 'SensorData' VALUES(NULL,865,300,'20120616',323);";
if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)){
printf("operate failed: %s\n",zErrMsg);
}
return 0;
}
//改
int updateRecord(sqlite3 *db)
{
char *sql;
char *zErrMsg;
char **azResult=0;
int nrow = 0,ncolumn = 0;
int i;
sql = "UPDATE SensorData set SensorID = 66, SiteNum = 666, Time = '66666666' where ID=1; ";
if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)){
printf("operate failed: %s\n",zErrMsg);
}
sql = "SELECT * FROM SensorData;";
if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)){
printf("operate failed: %s\n",zErrMsg);
}
printf("row:%d column:%d\n",nrow,ncolumn);
printf("After updateRecord,the result of querying is :\n");
for(i=0;i<(nrow+1)*ncolumn;i++)
printf("azResult[%d] = %s\n",i,azResult[i]);
return 0;
}
//删除数据函数
int deleteRecord(sqlite3 *db)
{
char *sql;
char *zErrMsg;
char **azResult=0;
int nrow = 0,ncolumn = 0;
int i;
sql = "DELETE FROM SensorData WHERE ID=4;";
if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)){
printf("operate failed: %s\n",zErrMsg);
}
sql = "SELECT * FROM SensorData;";
if(SQLITE_OK != sqlite3_get_table(db,sql,&azResult ,&nrow,&ncolumn,&zErrMsg)){
printf("operate failed: %s\n",zErrMsg);
}
printf("row:%d column:%d\n",nrow,ncolumn);
printf("After deleting,the result of querying is :\n");
for(i=0;i<(nrow+1)*ncolumn;i++)
printf("azResult[%d] = %s\n",i,azResult[i]);
sqlite3_free_table(azResult);
return 0;
}
int main(void)
{
sqlite3 *db = NULL;
int rc;
//打开指定的数据库文件
rc = sqlite3_open("/data/mydatabase.db",&db);
if(rc){
fprintf(stderr,"can't open database: %s\n",sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}else
printf("You have opened a sqlite3 database successfully!\n");
printf("-----------------------------------\n");
//创建表
createTable(db);
printf("-----------------------------------\n");
//插入记录
insertRecord(db);
printf("-----------------------------------\n");
//查询
//使用sqlite3_get_table实现查询
inquire_nocb(db);
printf("-----------------------------------\n");
//使用回调函数实现查询
/*inquire_Usecb(db);*/
printf("-----------------------------------\n");
//修改数据
updateRecord(db);//101->666
printf("-----------------------------------\n");
//删除记录
deleteRecord(db);
printf("-----------------------------------\n");
//关闭数据库
sqlite3_close(db);
return 0;
}
二、ndk编译
1.介绍
#编译方法(linux下):
cd your_project_dir
rm libs obj -rf
cd jni/
ndk-build
#sqlitedemo使用方法
adb shell rm /system/bin/sqlitedemo
adb push libs/armeabi/sqlitedemo /system/bin/
adb shell ./system/bin/sqlitedemo
#编译前的源码目录结构
tree sqlitedemo/
├── jni
│ ├── Android.mk
│ ├── Application.mk
│ ├── libsqlite.so
│ ├── sqlite3.h
│ └── sqlitedemo.c
└── README.md
#编译后的源码目录结构
tree sqlitedemo/
sqlitedemo/
├── jni
│ ├── Android.mk
│ ├── Application.mk
│ ├── libsqlite.so
│ ├── sqlite3.h
│ └── sqlitedemo.c
├── libs
│ └── armeabi
│ └── sqlitedemo
├── obj
│ └── local
│ └── armeabi
│ ├── objs
│ │ └── sqlitedemo
│ │ ├── sqlitedemo.o
│ │ └── sqlitedemo.o.d
│ └── sqlitedemo
└── README.md
2.源码
cat jni/Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= sqlitedemo.c
LOCAL_LDLIBS := libsqlite.so
LOCAL_MODULE:= sqlitedemo
LOCAL_MODULE_PATH := $(TARGET_OUT_EXECUTABLES)
LOCAL_MODULE_TAGS := eng
include $(BUILD_EXECUTABLE)
cat jni/Application.mk
#APP_BUILD_SCRIPT := Android.mk
#APP_ABI := armeabi-v7a x86
APP_ABI := armeabi
APP_STL := gnustl_static
APP_PLATFORM := android-23
sqlitedemo.c(同一)
目录结构及编译方法README.md
运行结果:
You have opened a sqlite3 database successfully!
-----------------------------------
-----------------------------------
-----------------------------------
row:4 column = 5
The result of querying is :
azResult[0] = ID
azResult[1] = SensorID
azResult[2] = SiteNum
azResult[3] = Time
azResult[4] = SensorParameter
azResult[5] = 1
azResult[6] = 101
azResult[7] = 261
azResult[8] = 20100314
azResult[9] = 18.9
azResult[10] = 2
azResult[11] = 369
azResult[12] = 281
azResult[13] = 20100616
azResult[14] = 113.0
azResult[15] = 3
azResult[16] = 667
azResult[17] = 290
azResult[18] = 20110315
azResult[19] = 27.0
azResult[20] = 4
azResult[21] = 865
azResult[22] = 300
azResult[23] = 20120616
azResult[24] = 323.0
-----------------------------------
-----------------------------------
row:0 column:0
After updateRecord,the result of querying is :
-----------------------------------
row:3 column:5
After deleting,the result of querying is :
azResult[0] = ID
azResult[1] = SensorID
azResult[2] = SiteNum
azResult[3] = Time
azResult[4] = SensorParameter
azResult[5] = 1
azResult[6] = 66
azResult[7] = 666
azResult[8] = 66666666
azResult[9] = 18.9
azResult[10] = 2
azResult[11] = 369
azResult[12] = 281
azResult[13] = 20100616
azResult[14] = 113.0
azResult[15] = 3
azResult[16] = 667
azResult[17] = 290
azResult[18] = 20110315
azResult[19] = 27.0
-----------------------------------