萌仙支持64-bit的修改

Mar 20, 2015


前言

最近我们在提交新加坡版本,但是被苹果给拒绝了,理由是我们没有采用最新的xcode和sdk编译。由于萌仙的cocos2d-x引擎版本是2.2.3,不支持64-bit,所以需要在一些地方做修改以支持64-bit。

libcurl

curlbuild.h中CURL_SIZEOF_LONG长度问题,64-bit与32-bit下指针长度不同,修改如下:

#ifdef __LP64__
#define CURL_SIZEOF_LONG	8
#else
#define CURL_SIZEOF_LONG	4
#endif

然后替换cocos2d-x 3.x版本中的libcurl.a文件。当然,针对libcurl还有另外一种修改方式,在这里下载最新的libcurl for apple ios,将cocos2d-x中cocos2dx\cocos2dx\platform\third_party\ios\curl的所有头文件替换掉,把libraries里的libcurl.a也替换成最新的即可。

libwebp

关于webp的支持比较简单,下载最新版本3.x版本的cocos2d-x,将3.x版本中的libwebp.a替换原libraries目录下的libwebp.a文件即可。

cocos-kazmath

这个库在cocos中有广泛的应用,但是此库在官方版本中暂时还没有绝对支持64-bit的版本,但是可以手动修改之。

//neon_matrix_impl.c 文件
//#if defined(__ARM_NEON__) 
#if defined(_ARM_ARCH_7)

//mat4.c 文件
//#if defined(__ARM_NEON__) 
#if defined(_ARM_ARCH_7)

这个kazmath数学库大致就只修改这个地方即可。

GLView

在上面的修改完成后,基本上可以支持64-bit了,但是cocos2dx\cocos2dx\platform\ios\EAGLView.mm此文件编译不通过。原因是64-bit下,不允许将一个指针地址强制转换为int,所以我们可以将之改成long:

//ids[i] = (int)touch;
ids[i] = (long)touch;

把这个文件里报错的地方都需要这么修改。报错信息:

"Cast from pointer to smaller type 'int' loses information"

其实就是一个强制转换指针类型的报错。

wax

由于我们使用了wax这个库搭建Lua与OC的桥梁,但是wax本身是不支持arm64的,官方没有出最新支持64-bit的版本,所以只得在github上找到了民间支持arm64的版本,重新编译即可。支持arm64版本的wax可以在这里下载到。

Xcode

这里先说明一下几个build setting:

  • Architectures:要Xcode编译的目标设备所支持的指令集列表。
  • Valid Architectures:对应的cpu指令集,有armv7,armv7s,arm64。
  • Build Active Architecture Only:如果这个属性设置true的话,它只编译Architectures所选择的版本,在Debug阶段会加快编译速度,否则它将编译所有指令集版本:armv6,armv7,armv7s,armv64,设置为no带来的影响就是增加ipa的大小,因为要支持所有的指令集平台。

一旦工程要支持64-bit,就意味着所有用到的第三方库都必须是同样的build-setting,即Architectures设置为armv7,arm64,Valid Architectures设置为armv7,arm64。

以上所有配置和修改都基于 Xcode 6.1。