Mac上用于Cocos2dx的Poco静态库编译(支持Android和IOS)

前言: 


最近参与一个Cocos2dx游戏开发项目,利用Cocos2dx的跨平台特性,一次开发同时支持Android和IOS两大移动平台。项目中用到了Poco这个优秀的C++库,IOS开发中可以直接使用Poco静态库进行编译,而Android的Cocos2dx是编译成动态库再与JNI进行交互,在使用上两者还是有一些区别,自己走了些弯路,所以记录下来供后来者参考^-^。

一、准备工作


1.1 下载Poco库


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,至于为什么这么做,后面会有解释。


1.2 开发环境搭建(Mac)


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到 ~ 目录


二、IOS平台的Poco静态库编译


2.1 用于IOS平台的Poco通用静态库编译


终端命令行下

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


2.2 在Cocos2dx项目中使用Poco静态库


iPhone系统软件的流畅与它的开发语言有很大关系,在IOS开发中使用C++的Poco静态库毫无压力,将上一步编译的静态库拖入

在工程的编译选项User Header Search Paths里加上"/usr/local/include",这样就可以找到Poco头文件了。之前让把Poco的头文件安装到/usr/local/include目录下,一来是为了iOS和Android开发环境可以共用,二来是因为我发现把Poco头文件文件夹放在工程中会有冲突。

至此,你就可以在开发中使用Poco库啦!


三、Android平台的Poco静态库编译


3.1 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平台只需要编译这一个版本的静态库,而没有真机和模拟器的区分,所以创建静态库的步骤就免啦。


3.2 在Android的Cocos2dx项目中使用Poco静态库


cocos2dx是将用户开发的C++部分用NDK编译成动态库libgame.so,再通过Android的JNI机制进行交互,从而一次开发可以同时支持多平台。


这个过程最大的难点就是编译出这个动态库。因为之前没有Android NDK开发的经验,这个步骤我走的弯路最多,等成功后才发现原来一切是那么的简单。

假设你已经创建了好了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,不出意外的话就编译成功了。

你可能感兴趣的:(Mac上用于Cocos2dx的Poco静态库编译(支持Android和IOS))