cocos2dx跨平台文件路径

发表评论 阅读评论

最近将我们游戏打包了 Android 版本,在加载 cocostudio UI 时报“文件找不到”的错误,经过检查后确定该路径中的文件存在,而且同样的代码在 Windowns 及 IOS 平台下都没有问题。 而且只是找不到Andorid中 cocostudio UI 中使用的某些plist文件,而不是所有文件。

经过仔细比较后发现所有找不到的文件都有一个共同的特点: 路径中含有../(上级目录的引用)。

所以猜想,可能Android平台中不支持含有../的路径,然后我手动调整了部分路径到不含../的路径后,没有再出现文件找不到的错误。

这样更加验证了我的猜想,然后去看了cocos2dx读取文件的代码,发现Android平台通过AAssetManager_open读取apk中资源(assets/目录中的文件),而该接口操作JNI传递过来的android.content.res.AssetManager实例来读取文件,继续找的Java端的AssetManager的源码,发现调用了native的openAsset,再继续就找不到openAsset的源码了。

虽然在源码中没有找到为什么路径中不支持../,不过找到了Java的代理类AssetManager,使用Java代码来验证的我猜想:

// activity 就是Android程序的Activity实例
AssetManager assetManager = activity.getAssets();
try {
    assetManager.open("bang.png");
    Log.d("TestAssetManager", "can open bang.png")
    assetManager.open("test/../bang.png");
    Log.d("TestAssetManager", "test/../bang.png")
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

以上代码运行后报错说找不到路径test/../bang.png,也就得出结论:AssetManager不支持../路径

找到问题就原因,解决起来就比较简单了,只需将文件路径进行规范化(normalize)就可以了,而出现问题的平台只有Android,而windows、IOS及Mac下没有问题,那么只需要将Android平台下进行路径规范化就OK了。

至于为什么只有Android不支持../路径,是因为Android的apk应用被安装后不会将资源文件(assets目录)从apk中解压到文件目录,而依然存在apk的zip文件中,每次都需要通过AssetManager来代理读取,google的开发人员可能认为所有人都会(或就应该)使用规范化的路径来访问资源。

最近比较喜欢开源社区,喜欢贡献代码,所以已经提交了pr(Pull requests),不过cocos2dx的人好像不打算合并该pr了该pr已经被cocos2dx合并了,因为他们想要做一个新的文件系统来支持更好的文件操作。不论c2dx最终会如何发展,至少现在该pr还是有用的,所以这里也放上该pr的地址: https://github.com/cocos2d/cocos2d-x/pull/8204

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.
回到顶部