Cocos2d-x에서 SQLCipher 사용 (Android)

SQLCipher란?



htps //w w. 부디 c. 네 t/sql해 p에 r/
오픈 소스 SQLite 암호화 라이브러리입니다.
BSD 스타일의 라이센스를 채용하고 있으며 라이센스 표기하면 무료로 사용할 수 있습니다.
공식 사이트에 있는 Android 라이브러리는 Java용이므로 그대로는 Cocos2d-x로 사용할 수 없습니다.
그래서 안드로이드 용으로 빌드 해 보았습니다.
이번은 그 때의 순서의 메모입니다.

실행된 환경
  • OS X 10.10.3
  • Cocos2d-x v3.6
  • Android NDK r10d

  • 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
    순서대로 실행하십시오.

    좋은 웹페이지 즐겨찾기