Sloppy's Blog

Cocos2d-x集成cryptopp类库(Android,Win32)

背景

前两天用Cocos2d-x IOS集成了cryptopp类库进行了一些加密解密的测试,回想,如果项目中,需要用到这个类库,是不是所有平台都需要呢。今天就Windows,Android平台,进行了一下集成测试,中间还是出现了一些小细节的问题,IOS这里就不介绍了,请参考上一篇博文(IOS使用cryptopp-Cocos2d-x项目)。我这里是一个Cocos2d-x CPP的项目,我们这里项目名叫:HelloCocos,可以用如下命令创建:

cocos new cpp -d c:/cocos -l cpp HelloCocos

准备工作

我们先下载最新cryptopp类库(565),然后在我们的游戏源码目录下,新建一个文件夹叫:external,跟Classes同级目录,把下载好的类库放进去,修改改文件夹名为cryptopp.

Android平台

在该目录下,新建一个Android.mk文件。用来编译Android版本,这里面需要注意的是,需要一些含有main入口的文件CPP文件不添加进Android.mk文件内(fipstest.cpp,regtest.cpp,test.cpp,validat1.cpp,validat2.cpp,validat3.cpp,bench.cpp,bench2.cpp),具体参考如下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := cryptopp_static
LOCAL_ARM_MODE := arm
LOCAL_MODULE_FILENAME := libcryptopp

LOCAL_SRC_FILES := \
        3way.cpp \
        adler32.cpp \
        algebra.cpp \
        algparam.cpp \
        arc4.cpp \
        asn.cpp \
        authenc.cpp \
        base32.cpp \
        base64.cpp \
        basecode.cpp \
        bfinit.cpp \
        blake2.cpp \
        blowfish.cpp \
        blumshub.cpp \
        camellia.cpp \
        cast.cpp \
        casts.cpp \
        cbcmac.cpp \
        ccm.cpp \
        chacha.cpp \
        channels.cpp \
        cmac.cpp \
        cpu.cpp \
        crc.cpp \
        cryptlib.cpp \
        default.cpp \
        des.cpp \
        dessp.cpp \
        dh.cpp \
        dh2.cpp \
        dll.cpp \
        dsa.cpp \
        eax.cpp \
        ec2n.cpp \
        eccrypto.cpp \
        ecp.cpp \
        elgamal.cpp \
        emsa2.cpp \
        eprecomp.cpp \
        esign.cpp \
        files.cpp \
        filters.cpp \
        fips140.cpp \
        gcm.cpp \
        gf256.cpp \
        gf2n.cpp \
        gf2_32.cpp \
        gfpcrypt.cpp \
        gost.cpp \
        gzip.cpp \
        hex.cpp \
        hmac.cpp \
        hrtimer.cpp \
        ida.cpp \
        idea.cpp \
        integer.cpp \
        iterhash.cpp \
        keccak.cpp \
        luc.cpp \
        mars.cpp \
        marss.cpp \
        md2.cpp \
        md4.cpp \
        md5.cpp \
        misc.cpp \
        modes.cpp \
        mqueue.cpp \
        mqv.cpp \
        nbtheory.cpp \
        network.cpp \
        oaep.cpp \
        osrng.cpp \
        panama.cpp \
        pch.cpp \
        pkcspad.cpp \
        polynomi.cpp \
        pssr.cpp \
        pubkey.cpp \
        queue.cpp \
        rabin.cpp \
        randpool.cpp \
        rc2.cpp \
        rc5.cpp \
        rc6.cpp \
        rdrand.cpp \
        rdtables.cpp \
        rijndael.cpp \
        ripemd.cpp \
        rng.cpp \
        rsa.cpp \
        rw.cpp \
        safer.cpp \
        salsa.cpp \
        seal.cpp \
        seed.cpp \
        serpent.cpp \
        sha.cpp \
        sha3.cpp \
        shacal2.cpp \
        shark.cpp \
        sharkbox.cpp \
        simple.cpp \
        skipjack.cpp \
        socketft.cpp \
        sosemanuk.cpp \
        square.cpp \
        squaretb.cpp \
        strciphr.cpp \
        tea.cpp \
        tftables.cpp \
        tiger.cpp \
        tigertab.cpp \
        trdlocal.cpp \
        ttmac.cpp \
        twofish.cpp \
        vmac.cpp \
        wait.cpp \
        wake.cpp \
        whrlpool.cpp \
        winpipes.cpp \
        xtr.cpp \
        xtrcrypt.cpp \
        zdeflate.cpp \
        zinflate.cpp \
        zlib.cpp

LOCAL_C_INCLUDES := $(LOCAL_PATH)

include $(BUILD_STATIC_LIBRARY)
另外,修改proj.android/jni/Application.mk文件内的CPPFLAGS为如下内容(主要添加了-fexceptions):
APP_CPPFLAGS := -frtti -fexceptions -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -std=c++11 -fsigned-char

修改添加proj.android/build-cfg.json文件如下(添加ndk_module_path里的external):

{
    "ndk_module_path" :[
        "../cocos2d",
        "../cocos2d/cocos",
        "../cocos2d/external",
        "../external"
    ],
    "copy_resources": [
        {
            "from": "../Resources",
            "to": ""
        }
    ]
}

修改proj.android/jni/Android.mk文件,主要修改(LOCAL_C_INCLUDES,添加external,增加引用cryptopp_static,增加import-module):

.......code
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \
            $(LOCAL_PATH)/../../external

..... code

LOCAL_STATIC_LIBRARIES := cocos2dx_static
LOCAL_STATIC_LIBRARIES += cryptopp_static
.... code
$(call import-module,.)
$(call import-module,cryptopp)

.....

Windows平台

我们用VS2015打开HelloCocos.sln,添加已经存在的项目:cryptlib,这里面我们需要修改该项目的几个编译属性:如下图

cryptopp_1

cryptopp_2

修改HelloCocos项目配置,添加引用路径../external:

cryptopp_4

修改Lib输出目录:
cryptopp_4

添加链接库:
cryptopp_4

编译测试代码

VS打开HelloWorldScene.cpp文件,添加头文件引用:#include “cryptopp/md5.h” #include “cryptopp/hex.h”,在HelloWorld::init最后添加如下代码:


byte digest[CryptoPP::MD5::DIGESTSIZE];
std::string message = “HelloWorld”;
CryptoPP::MD5 hash;
hash.CalculateDigest(digest, (const byte*)message.c_str(), message.size());
CryptoPP::HexEncoder encoder;
std::string output;
encoder.Attach(new CryptoPP::StringSink(output));
encoder.Put(digest, sizeof(digest));
encoder.MessageEnd();

CCLOG(“HelloWorld MD5:%s”, output.c_str());

运行项目,是不是打印里出现了:HelloWorld MD5:68E109F0F40CA72A15E05CC22786F8E6,命令行编译Android项目:


cocos compile -m debug -p android

安装到手机上连接测试。用Eclipse看LOGCAT打印,也出现了HelloWorld MD5:68E109F0F40CA72A15E05CC22786F8E6

最后的项目结构如下:
cryptopp_3

Cryptopp的Android编译配置文件:Android.mk文件下载