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数据库之后调用一次该函数,即可正常操作数据库。

时间: 2024-10-12 07:38:02

Android JNI环境下给SQLite引入加密模块的相关文章

Android/NDK环境下FFmpeg及AAC,MP3,X264的编译

本篇介绍在Android/Ndk环境下FFmpeg的编译及使用, FFmpeg自带了H264.AAC.MP3的解码器,但却没有(或没有好的)相应的编码器.相应的编码器需要使用第三方库.推荐使用的第三方库为x264(H264编码) .FDK_AAC(AAC编码),lame(MP3编码). 在顺序上,应该先编译好第三方库,最后再编译FFmpeg库. [本书说明:本文作者:邵发,本文选自<FFmpeg视音频编程指南>.有关本书的详细信息请访问官网:http://www.afanihao.cn ] [

Android Studio环境下代码混淆+签名打包

Android Studio环境下代码混淆+签名打包 作者 Mr_冯先生 关注 2016.08.21 01:10 字数 1040 阅读 734评论 5喜欢 34 注:本文使用的Android Studio版本是 2.1.2. 做公司项目,需要对项目进行代码混淆+签名打包,然后就各种搜集查看资料,算是小有成果吧.周末无事就想着总结一下以后再用可做参考.如有不对的地方烦请各位大神指导-- 一.代码混淆 android studio进行代码混淆需要在两个地方做配置:1.添加自己的混淆规则到对应Modu

Android JNI环境要SQLite加密模块简介

免费的SQLite开源源代码仅仅给提供了两个函数,仅仅有实现这两个函数才干实现数据库总体加密. 然后废了点劲从网上找了一个已经实现好的开源库http://sourceforge.net/projects/wxcode/files/Components/wxSQLite3/ 然后大概写一下怎样把它集成到自己的so库中. 首先下载源代码,找到sqlite3/secure/src下,把当中全部的文件(除了sqlite3.def)复制到Androidproject下的jni文件夹下,然后打开sqlite

Android studio环境下的 NDK(jni)开发

前言 1.什么是NDK? NDK全称是Native Development Kit,NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk.NDK集成了交叉编译器(交叉编译器需要UNIX或LINUX系统环境),并提供了相应的mk文件隔离CPU.平台.ABI等差异,开发人员只需要简单修改mk文件(指出"哪些文件需要编译"."编译特性要求"等),就可以创建出so. 2.为什么使用NDK? 1.代码的保护.由于ap

Android WebView环境下打开相机、文件管理进行上传

Webview下面坑奇多,直接在浏览器下面可以直接调出相机和文件管理,但是在webview下面就是不行,在网上查阅了很多文章,不得不说坑奇多,最多终于拼拼凑凑成功了, 安卓版本为4.4.2,调试通过. 安卓端关键源码: protected ValueCallback<Uri> mUploadMessage; protected int FILECHOOSER_RESULTCODE = 1; private String mCameraFilePath; @SuppressLint("

android studio环境下创建menu问题(标题栏显示问题)

在创建menu时,在虚拟设备上回显示menu(三个点,如图1),但是在安卓真机上可能会出现不会显示的情况. (图1) 原因是因为安卓系统现在都默认隐藏标题栏,所以menu就不会显示出来. 有两种方法可以解决这一问题: 方法一:在onCreate()函数后面添加显示标题栏代码:setContentView(R.layout.xxx_layout); 如果仍未解决问题,查看自己的活动类的继承问题,如果发现类开头是这样:Public class xxx extends activity(){...}.

在ANDROID STUDIO环境下使用JUNIT框架进行单元测试

dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcomp

在ANDROID STUDIO环境下使用ESPRESSO 测试框架进行UI测试

package com.example.test; import android.support.test.filters.LargeTest;import android.support.test.rule.ActivityTestRule;import android.support.test.runner.AndroidJUnit4; import org.junit.Rule;import org.junit.Test;import org.junit.runner.RunWith; i

在Android studio环境下使用EventBus

EventBus是一个订阅/发布消息总线,实现在应用程序里面,组件之间,线程之间的通信.因为event是任意的类型,所以这个使用起来非常方便. eventbus中的角色: event:当然就是事件啦 subscriber:事件的订阅者,先注册,接收特定的对象,并通过onEventXXX()来回收处理事件. Publisher:事件的发布者,通过post发布信息. 处理过程主要分为5步: 1.定义一个事件(event) 2.注册一个订阅者 3.发布一个事件 4.接收处理一个事件 5.注销一个订阅者