在 1 中,集成了两个子项目 openssl 和 sqlcipher,
在实际生产中用起来并不是很好,因为有时候要对项目进行清理操作,
这样的话,重新编译时就会耗费很多额外的时间。
鉴于以上的情形,应该做一些改进,将子项目剔除掉,
改为直接引用这两个子项目所生成的静态库文件 libcrypto.a、libsqlcipher.a
下面列一下简要步骤吧(比集成子项目那个步骤简单多了):
1.在 2dx 工程根目录下建一个 libs 目录,用来存放 libcrypto.a 和 libsqlcipher.a 物理文件,
然后再 2dx 工程中引用这两个静态库文件(Build Phases->Link Binary With Libraries)
这里提一个遇到的特殊情况,有时候再加入这两个静态库文件后编译会失败,
错误信息提示说找不到 libcurl.a 文件,不用害怕,
将这两个静态库文件移除后编译一次,编译成功后再重新添加一次即可。
2.打开 sqlite3 加密开关,在 Other C/C++ Flags中插入一行 -DSQLITE_HAS_CODEC
3.在 AppDelegate.cpp 的合适位置插入以下代码测试是否成功
#include <sqlite3.h>
#include <string>
using namespace std;
// sqlite encrypt test case
string t_oStrPath = CCFileUtils::sharedFileUtils()->getWritablePath() + "sqlcipher.db";
printf("%s\n", t_oStrPath.c_str());
sqlite3* db;
if (SQLITE_OK == sqlite3_open(t_oStrPath.c_str(), &db)) {
string tmp_oStrPwd = "best";
sqlite3_key(db, tmp_oStrPwd.c_str(), tmp_oStrPwd.length());
string tmp_oStrSql = "CREATE TABLE TestHaha (ROW INTEGER , FIELD_DATA TEXT);";
char* tmp_pArrCharMsg = NULL;
int t_iResult = sqlite3_exec(db, tmp_oStrSql.c_str() , NULL, NULL, &tmp_pArrCharMsg);
printf("%s\n", tmp_pArrCharMsg);
if (SQLITE_OK != t_iResult) {
// password is correct, or, database has been initialized
printf("password is correct, or, database has been initialized");
} else {
// incorrect password!
printf("incorrect password!");
}
}