Cocos2d-x에서 SQLCipher 사용 (Android)
SQLCipher란?
htps //w w. 부디 c. 네 t/sql해 p에 r/
오픈 소스 SQLite 암호화 라이브러리입니다.
BSD 스타일의 라이센스를 채용하고 있으며 라이센스 표기하면 무료로 사용할 수 있습니다.
공식 사이트에 있는 Android 라이브러리는 Java용이므로 그대로는 Cocos2d-x로 사용할 수 없습니다.
그래서 안드로이드 용으로 빌드 해 보았습니다.
이번은 그 때의 순서의 메모입니다.
실행된 환경
OpenSSL 빌드
OpenSSL이 필요하므로 먼저 OpenSSL을 빌드해 둔다.
Cocos2d-x에서 OpenSSL 사용 (Android)
소스 코드를 저장소에서 복제
mkdir SQLCipher
cd SQLCipher
git clone git://github.com/sqlcipher/sqlcipher.git src
Android NDK Standalone Toolchain 만들기
$NDK_ROOT/build/tools/make-standalone-toolchain.sh --arch=arm --install-dir=toolchain --platform=android-19
크로스 컴파일시 호스트 설정
※ arm-linux-androideabi라고 하면 그런 것 모르고 화가 되므로 arm-linux로 한다.
HOST=arm-linux
Toolchain의 파일 이름 변경
arm-linux-androideabi-gcc > arm-linux-gcc 와 같이 이름을 바꿉니다.
find toolchain/bin -name arm-linux-androideabi* -type f | while read FILE
do
cp -f $FILE ${FILE%/*}/arm-linux${FILE##*-androideabi}
done
빌드
cd src
Toolchain 경로 설정
export PATH=/Users/ditabashi/SQLCipher/toolchain/bin:$PATH
armeabi
아키텍처 설정
ARCH=armv5
설치 디렉토리 설정
PREFIX=/Users/ditabashi/SQLCipher/dest/armeabi
OpenSSL 경로 설정
OPENSSL_INCLUDE_PATH=/Users/ditabashi/OpenSSL/dest/armeabi/include
OPENSSL_LIBRARY_PATH=/Users/ditabashi/OpenSSL/dest/armeabi/lib
구성
./configure --prefix=$PREFIX -host=$HOST --enable-tempstore=yes --disable-tcl --disable-readline CFLAGS="-DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2 -march=$ARCH -fPIE -I$OPENSSL_INCLUDE_PATH" LDFLAGS="-L$OPENSSL_LIBRARY_PATH"
빌드 & 설치
make clean && make && make install
armeabi-v7a
아키텍처 설정
ARCH=armv7-a
설치 디렉토리 설정
PREFIX=/Users/ditabashi/SQLCipher/dest/armeabi-v7a
OpenSSL 경로 설정
OPENSSL_INCLUDE_PATH=/Users/ditabashi/OpenSSL/dest/armeabi-v7a/include
OPENSSL_LIBRARY_PATH=/Users/ditabashi/OpenSSL/dest/armeabi-v7a/lib
구성
./configure --prefix=$PREFIX -host=$HOST --enable-tempstore=yes --disable-tcl --disable-readline CFLAGS="-DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2 -march=$ARCH -fPIE -I$OPENSSL_INCLUDE_PATH" LDFLAGS="-L$OPENSSL_LIBRARY_PATH"
빌드 & 설치
make clean && make && make install
Cocos2d-x 프로젝트에 추가
Android.mk의 내용
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/$(TARGET_ARCH_ABI)/include/sqlcipher
LOCAL_MODULE := sqlcipher
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/lib/libsqlcipher.a
include $(PREBUILT_STATIC_LIBRARY)
프로젝트의 Android.mk 수정
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/external)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/cocos)
# **これを追加**
$(call import-add-path,$(LOCAL_PATH)/../../Libraries)
LOCAL_MODULE := cocos2dcpp_shared
LOCAL_MODULE_FILENAME := libcocos2dcpp
LOCAL_SRC_FILES := hellocpp/main.cpp \
../../Classes/AppDelegate.cpp \
../../Classes/HelloWorldScene.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
# _COCOS_HEADER_ANDROID_BEGIN
# _COCOS_HEADER_ANDROID_END
LOCAL_STATIC_LIBRARIES := cocos2dx_static
# **これを追加**
LOCAL_STATIC_LIBRARIES += crypto ssl
LOCAL_STATIC_LIBRARIES += sqlcipher
# _COCOS_LIB_ANDROID_BEGIN
# _COCOS_LIB_ANDROID_END
include $(BUILD_SHARED_LIBRARY)
$(call import-module,.)
# _COCOS_LIB_IMPORT_ANDROID_BEGIN
# _COCOS_LIB_IMPORT_ANDROID_END
# **これを追加**
$(call import-module,OpenSSL/Android)
$(call import-module,SQLCipher/Android)
Application.mk에 CPPFLAGS를 추가합니다.
Application.mk
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -std=c++11 -fsigned-char
# **これを追加**
APP_CPPFLAGS += -DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2
APP_LDFLAGS := -latomic
ifeq ($(NDK_DEBUG),1)
APP_CPPFLAGS += -DCOCOS2D_DEBUG=1
APP_OPTIM := debug
else
APP_CPPFLAGS += -DNDEBUG
APP_OPTIM := release
endif
사용해보기
#include <sqlite3.h>
void testSQLCipher() {
auto path = cocos2d::FileUtils::getInstance()->getWritablePath() + "test.db";
std::string passphrase("abcdefghijklmn");
sqlite3 *db;
sqlite3_open(path.c_str(), &db);
sqlite3_key(db, passphrase.c_str(), passphrase.length());
sqlite3_exec(db, "CREATE TABLE chara(id INTEGER, name TEXT);", nullptr, nullptr, nullptr);
sqlite3_exec(db, "INSERT INTO chara VALUES(1, 'キャラA');", nullptr, nullptr, nullptr);
sqlite3_exec(db, "INSERT INTO chara VALUES(2, 'キャラB');", nullptr, nullptr, nullptr);
sqlite3_exec(db, "INSERT INTO chara VALUES(3, 'キャラC');", nullptr, nullptr, nullptr);
sqlite3_stmt *stmt;
sqlite3_prepare(db, "SELECT * FROM chara;", -1, &stmt, nullptr);
while (SQLITE_DONE != sqlite3_step(stmt)) {
auto id = sqlite3_column_int(stmt, 0);
auto name = reinterpret_cast<const char *>(sqlite3_column_text(stmt, 1));
CCLOG("id = %d, name = %s", id, name);
}
sqlite3_finalize(stmt);
sqlite3_close(db);
}
오시마
이상을 정리해 쉘 스크립트로 해 GitHub에 두어 둡니다.
htps : // 기주 b. 코 m / 이다 이스케 / 하이드 로게 니 m
clone 후,
①build-libssl-for-android.sh
②build-libsqlcipher-for-android.sh
순서대로 실행하십시오.
Reference
이 문제에 관하여(Cocos2d-x에서 SQLCipher 사용 (Android)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/idaisuke/items/b4386705db7ec714f98a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)