最近参与一个Cocos2dx游戏开发项目,利用Cocos2dx的跨平台特性,一次开发同时支持Android和IOS两大移动平台。项目中用到了Poco这个优秀的C++库,IOS开发中可以直接使用Poco静态库进行编译,而Android的Cocos2dx是编译成动态库再与JNI进行交互,在使用上两者还是有一些区别,自己走了些弯路,所以记录下来供后来者参考^-^。
Poco官网:http://pocoproject.org/
Poco github链接:https://github.com/pocoproject/poco
注意:Poco库建议大家用github上的最新版本,或者去官网下载1.5.x版本,不要使用官网的1.4.6p1“稳定版”,这个版本折腾我很长时间,发现竟然缺失了Poco::JSON模块
解压或者Clone到某个目录下,例如 ~/poco
cd ~/poco
./configure
make
sudo make install
这个步骤是将Poco库安装到本机Mac环境,其主要目的是将Poco库的头文件安装到/user/local/include/Poco,至于为什么这么做,后面会有解释。
Cocos2dx的Android开发环境搭建:参考http://young40.github.io/blog/2013/02/23/setting-up-android-development-envirment-on-mac-os-x/
Cocos2dx的IOS开发环境搭建:这个太简单了,google搜索一下
以上环境一定要搭建好再往下看,下面是我机器上的一些软件安装路径(版本信息也可以体现):
/opt/cocos2d-x-2.1.4
/opt/adt-bundle-mac-x86_64-20130219
/opt/android-ndk-r8e
我使用的Poco库是从github上Clone到 ~ 目录
终端命令行下
cd ~/poco
./configure --config=iPhone --no-tests --no-samples --omit=...
make POCO_TARGET_OSARCH=armv7 -s -j4 //支持armv7
make POCO_TARGET_OSARCH=armv7s -s -j4 //支持armv7s
(注:不指定POCO_TARGET_OSARCH的话默认编译armv6版本,armv6是iphone 3GS之前的CPU架构,现在似乎没有支持的必要喽)
这里就已经编译好真机的静态库,我们还要支持模拟器调试,所以再编译一个模拟器版本
./configure -config=iPhoneSimulator --no-tests --no-samples --omit=...
make -s -j4
好了,到此我们的静态库已经编译完成,在当前的目录下会多了3个文件夹./lib/iPhoneOS/armv7/、./lib/iPhoneOS/armv7s/以及./lib/iPhoneSimulator/i686/。每个文件夹下面会有8个静态库文件,分别是Poco的Foundation、JSON、XML、Net四个模块的Release和Debug版本。
最后,我们需要集成一个通用静态库,这样在开发中即可以使用模拟器也可以用真机进行调试。先建立一个文件夹存放通用静态库:
mkdir ./lib/poco-ios-universal
使用lipo工具合并静态库,已Foundation模块为例:
lipo create ./lib/iPhoneOS/armv7/libPocoFoundation.a ./lib/iPhoneOS/armv7s/libPocoFoundation.a ./lib/iPhoneSimulator/i686/libPocoFoundation.a -output ./lib/poco-ios-universal/libPocoFoundation.a
iPhone系统软件的流畅与它的开发语言有很大关系,在IOS开发中使用C++的Poco静态库毫无压力,将上一步编译的静态库拖入
在工程的编译选项User Header Search Paths里加上"/usr/local/include",这样就可以找到Poco头文件了。之前让把Poco的头文件安装到/usr/local/include目录下,一来是为了iOS和Android开发环境可以共用,二来是因为我发现把Poco头文件文件夹放在工程中会有冲突。
至此,你就可以在开发中使用Poco库啦!
cd ~/poco
./configure --config=Android --no-tests --no-samples --omit=...
make -s -j4 ANDROID_ABI=armeabi-v7a
在编译过程中如果遇到Error.cpp第80行发生错误,可以编辑./Foundation/src/Error.cpp,将第80行:
return std::string(strerror_r(errorCode, errmsg, 256));
换成:
strerror_r(errorCode, errmsg, 256);
return std::string(errmsg);
就可以编译通过了,但这是我自己修改的,不保证不出问题哦。不出意外的话,在文件夹./lib/Android/armeabi-v7a/下也会出现8个静态库文件。
和IOS平台不同,Android平台只需要编译这一个版本的静态库,而没有真机和模拟器的区分,所以创建静态库的步骤就免啦。
cocos2dx是将用户开发的C++部分用NDK编译成动态库libgame.so,再通过Android的JNI机制进行交互,从而一次开发可以同时支持多平台。
假设你已经创建了好了Android平台的Cocos2dx工程,例如 poco-android
编辑poco-android/proj.android/jni/Android.mk文件
在include $(CLEART_VARS)后面添加
include $(CLEAR_VARS)
LOCAL_MODULE := pocofoundation_static //名字你可以自己起,下面会用到,保持一致就可以
LOCAL_SRC_FILES := ../../Classes/libPocoFoundation.a //之前编译的Andorid版静态库文件存放路径,可以换成你自己的
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := poconet_static
LOCAL_SRC_FILES := ../../Classes/libPocoNet.a
LOCAL_STATIC_LIBRARIES := pocofoundation_static //Poco的Net等其它库依赖Foundation库,所以这些库要写在Foundation之后
include $(PREBUILT_STATIC_LIBRARY)
.....
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes $(LOCAL_PATH)/ /usr/local/include //
LOCAL_STATIC_LIBRARIES := pocofoundation_static poconet_static //这里的名称要与上面设置的一致
LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static cocosdenshion_static cocos_extension_static
.....
这时候执行build_native.sh,不出意外的话就编译成功了。