Android OBB/ZIP加载(cocos2dx)

4

我在处理APK扩展方面遇到了问题。在Java端,我可以设置好一切需要设置的内容,但似乎我无法在C++端正确地修改代码。

在CCFileUtilsAndroid::getFileData函数内部:

if (fullPath[0] != '/')
{
   CCLOG("GETTING FILE RELATIVE DATA: %s", fullPath.c_str());
   pData  = CCFileUtils::sharedFileUtils()->getFileDataFromZip("/storage/sdcard0/Android/obb/com.example.package/main.1.com.example_package.obb", fullPath.c_str(), pSize);
}

但是pData变量始终为null(如果我没错的话,这意味着加载失败)。我错过了什么吗?

非常感谢您提前的帮助。

(附言:包已经在那里,我使用了正确的路径)

3个回答

10

我终于解决了我的问题,而且比我想象的要容易得多。不是通过进行C++源代码修改,而是在Cocos2dxHelper java类中找到了一个函数nativeSetApkPath。经过调查发现,Cocos2dx将apk包处理为zip文件。由于我的obb文件只是一个重命名的zip文件,因此我可以毫无问题地使用它。除了声音需要另外快速修复外,所有的资产都被正确载入。

大部分功劳归功于论坛帖子(http://www.cocos2d-x.org/boards/6/topics/11243)和Irwin Billing,因为这是我可以用来修改Cocos2dxMusic.java和Cocos2dxSound.java类的基础。

另外,我必须确保声音资源在zip文件中没有被压缩(根据Google提供的文档)。

为此,我在Mac上使用了以下命令:

zip -rn .ogg:.mp3:.wav assets.zip assets/

我想提及的最后一件事是文件夹结构。我复制并压缩了资产文件夹,所以在我的压缩文件中有一个文件夹。这很好,因为apk的工作方式相同,我不需要做更多的修改。

最后是我的修改过的源文件,只不过别忘了检查它,并更改一些值 Cocos2dxHelper.java: http://pastebin.com/RqeYkTkP

Cocos2dxMusic.java: http://pastebin.com/RXjwmEyb

Cocos2dxSound.java: http://pastebin.com/1GfDB6jb


3
自我提醒:确保你的压缩文件中包含名为“assets”的文件夹作为根目录,而不是整个路径结构/$HOME/path/to/proj/assets/。 - Steve T
嗨,LugaidVandroiy。我正在尝试做同样的事情,但是我正在使用Cocos2d。你能告诉我在Cocos2d中对应于Cocos2dxHelper.java文件的是哪个文件吗?我对Cocos2d非常陌生,了解甚少。谢谢。 - Sushil
嗨!据我所知,Cocos2d-x是一个不同于原始的Cocos2d和Cocos2d-iphone的项目。你具体使用的是哪个版本?也许我可以提供帮助。 - LugaidVandroiy
@LugaidVandroiy..我正在使用Cocos2d for android。我已经弄清楚了,在contentHelper.java中,我需要正确设置setExternalLoader()。但是我无法做到这一点。如果您能给我一些指针或帮助,我将非常感激。再次感谢。 - Sushil
2
我花了几个小时研究了你的答案,我想建议每个人都检查一下 AndroidManifest.xml 文件: <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> ,否则什么都不起作用。 - ricky.tribbia

1

顺便提一下,我把ttf字体文件放在assets/中,因为Cocos2dxTypefaces会使用本机代码从AssetManager(也就是apk文件)中加载它们。


1

版本2.x只是我的个人意见。 3.x不起作用,Cocos2dxHelper.java可以。


这个解决方案是在cocos2dx 3.x中吗?请帮忙。 - jangyuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接