背景
前两天用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,这里面我们需要修改该项目的几个编译属性:如下图
修改HelloCocos项目配置,添加引用路径../external:
修改Lib输出目录:
添加链接库:
编译测试代码
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的Android编译配置文件:Android.mk文件下载