Android JNI环境下给SQLite引入加密模块

免费的SQLite开源源码只给提供了两个函数,只有实现这两个函数才能实现数据库整体加密。然后废了点劲从网上找了一个已经实现好的开源库http://sourceforge.net/projects/wxcode/files/Components/wxSQLite3/ 
然后大概写一下如何把它集成到自己的so库中。

首先下载源码,找到sqlite3/secure/src下,把其中所有的文件(除了sqlite3.def)拷贝到Android工程下的jni目录下,然后打开sqlite3.c文件,在最前面添加一行代码:

#define SQLITE_HAS_CODEC

在jni目录下新建Android.mk文件,输入如下内容:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)  

LOCAL_MODULE:= libsqlite3 

LOCAL_SRC_FILES:= sqlite3secure.c #这里写的是相对路径

include $(BUILD_STATIC_LIBRARY)  

# 从这里开始是so库的声明,我这里使用了一个自动加载脚本,只需要指定
# MY_FILES_PATH就能自动加载所有的cpp和c文件
include $(CLEAR_VARS)

LOCAL_MODULE    := native

MY_FILES_PATH  := $(LOCAL_PATH)/Classes

MY_FILES_SUFFIX := %.cpp %.c

# 递归遍历目录下的所有的文件
rwildcard=$(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))

# 获取相应的源文件
MY_ALL_FILES := $(foreach src_path,$(MY_FILES_PATH), $(call rwildcard,$(src_path),*.*) ) 
MY_ALL_FILES := $(MY_ALL_FILES:$(MY_CPP_PATH)/./%=$(MY_CPP_PATH)%)
MY_SRC_LIST  := $(filter $(MY_FILES_SUFFIX),$(MY_ALL_FILES)) 
MY_SRC_LIST  := $(MY_SRC_LIST:$(LOCAL_PATH)/%=%)

# 去除字串的重复单词
define uniq =
  $(eval seen :=)
  $(foreach _,$1,$(if $(filter $_,${seen}),,$(eval seen += $_)))
  ${seen}
endef

# 递归遍历获取所有目录
MY_ALL_DIRS := $(dir $(foreach src_path,$(MY_FILES_PATH), $(call rwildcard,$(src_path),*/) ) )
MY_ALL_DIRS := $(call uniq,$(MY_ALL_DIRS))
#MY_ALL_DIRS :=     
# 赋值给NDK编译系统
LOCAL_SRC_FILES  := $(MY_SRC_LIST)
LOCAL_C_INCLUDES := $(MY_ALL_DIRS)

LOCAL_LDLIBS := -llog -ldl
LOCAL_STATIC_LIBRARIES := libsqlite3 # 这里添加静态库

include $(BUILD_SHARED_LIBRARY)

在使用的时候,只需要

#include "sqlite3.h"

然后在open数据库之后,调用如下两个函数:

SQLITE_API int sqlite3_key(
  sqlite3 *db,                   /* Database to be rekeyed */
  const void *pKey,              /* The key */
  int nKey                       /* The key length */
);
SQLITE_API int sqlite3_key_v2(
  sqlite3 *db,                   /* Database to be rekeyed */
  const char *zDbName,           /* Name of the database */
  const void *pKey,              /* The key */
  int nKey                       /* The key length */
);

即可将数据库加密。 
需要注意的是,只能在创建数据库后马上调用以上两个函数中的任意一个才能加密数据库。当需要操作一个加密后的数据库后,只需要在open数据库之后调用一次该函数,即可正常操作数据库。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值