zoukankan      html  css  js  c++  java
  • Android JNI环境要SQLite加密模块简介

    免费的SQLite开源源代码仅仅给提供了两个函数,仅仅有实现这两个函数才干实现数据库总体加密。

    然后废了点劲从网上找了一个已经实现好的开源库http://sourceforge.net/projects/wxcode/files/Components/wxSQLite3/ 
    然后大概写一下怎样把它集成到自己的so库中。

    首先下载源代码,找到sqlite3/secure/src下,把当中全部的文件(除了sqlite3.def)复制到Androidproject下的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该功能数据库之后调用一次,它可以是数据库的正常操作。

    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    vue实现图片路径传送
    title中添加小图标
    张钊的第一份作业
    张钊的第二份作业
    在Windows Server 2008 R2环境下安装活动目录失败的一个解决方法
    如何把SubVersion的服务程序变为Window后台服务形式
    一个关于静态方法调用的问题。
    WCF配置中遇到的问题:如何把Hostname修改成IP
    删除Visual Studio最近的项目(转载)
    有时候用ifstream或ofstream打开带有中文路径的文件会失败
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4823740.html
Copyright © 2011-2022 走看看